diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-08-12 11:17:45 +0300 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2016-09-02 13:22:28 +0300 |
commit | 2e814d4702d71a04388386a9f591d14a35980bfe (patch) | |
tree | f3f9b48d116a3738c5e71f3a360ca61f16cfb632 /storage/innobase/include/mem0mem.h | |
parent | 848d211c5c4df00b819cd84d7530cf7d29bb0524 (diff) | |
download | mariadb-git-2e814d4702d71a04388386a9f591d14a35980bfe.tar.gz |
Merge InnoDB 5.7 from mysql-5.7.9.
Contains also
MDEV-10547: Test multi_update_innodb fails with InnoDB 5.7
The failure happened because 5.7 has changed the signature of
the bool handler::primary_key_is_clustered() const
virtual function ("const" was added). InnoDB was using the old
signature which caused the function not to be used.
MDEV-10550: Parallel replication lock waits/deadlock handling does not work with InnoDB 5.7
Fixed mutexing problem on lock_trx_handle_wait. Note that
rpl_parallel and rpl_optimistic_parallel tests still
fail.
MDEV-10156 : Group commit tests fail on 10.2 InnoDB (branch bb-10.2-jan)
Reason: incorrect merge
MDEV-10550: Parallel replication can't sync with master in InnoDB 5.7 (branch bb-10.2-jan)
Reason: incorrect merge
Diffstat (limited to 'storage/innobase/include/mem0mem.h')
-rw-r--r-- | storage/innobase/include/mem0mem.h | 461 |
1 files changed, 276 insertions, 185 deletions
diff --git a/storage/innobase/include/mem0mem.h b/storage/innobase/include/mem0mem.h index de9b8b29fd9..72791e23574 100644 --- a/storage/innobase/include/mem0mem.h +++ b/storage/innobase/include/mem0mem.h @@ -30,22 +30,20 @@ Created 6/9/1994 Heikki Tuuri #include "ut0mem.h" #include "ut0byte.h" #include "ut0rnd.h" -#ifndef UNIV_HOTBACKUP -# include "sync0sync.h" -#endif /* UNIV_HOTBACKUP */ -#include "ut0lst.h" #include "mach0data.h" +#include <memory> + /* -------------------- MEMORY HEAPS ----------------------------- */ -/* A block of a memory heap consists of the info structure +/** A block of a memory heap consists of the info structure followed by an area of memory */ typedef struct mem_block_info_t mem_block_t; -/* A memory heap is a nonempty linear list of memory blocks */ +/** A memory heap is a nonempty linear list of memory blocks */ typedef mem_block_t mem_heap_t; -/* Types of allocation for memory heaps: DYNAMIC means allocation from the +/** Types of allocation for memory heaps: DYNAMIC means allocation from the dynamic memory pool of the C compiler, BUFFER means allocation from the buffer pool; the latter method is used for very big heaps */ @@ -59,13 +57,13 @@ buffer pool; the latter method is used for very big heaps */ allocation functions can return NULL. */ -/* Different type of heaps in terms of which datastructure is using them */ +/** Different type of heaps in terms of which datastructure is using them */ #define MEM_HEAP_FOR_BTR_SEARCH (MEM_HEAP_BTR_SEARCH | MEM_HEAP_BUFFER) #define MEM_HEAP_FOR_PAGE_HASH (MEM_HEAP_DYNAMIC) #define MEM_HEAP_FOR_RECV_SYS (MEM_HEAP_BUFFER) #define MEM_HEAP_FOR_LOCK_HEAP (MEM_HEAP_BUFFER) -/* The following start size is used for the first block in the memory heap if +/** The following start size is used for the first block in the memory heap if the size is not specified, i.e., 0 is given as the parameter in the call of create. The standard size is the maximum (payload) size of the blocks used for allocations of small buffers. */ @@ -74,147 +72,192 @@ allocations of small buffers. */ #define MEM_BLOCK_STANDARD_SIZE \ (UNIV_PAGE_SIZE >= 16384 ? 8000 : MEM_MAX_ALLOC_IN_BUF) -/* If a memory heap is allowed to grow into the buffer pool, the following +/** If a memory heap is allowed to grow into the buffer pool, the following is the maximum size for a single allocated buffer: */ #define MEM_MAX_ALLOC_IN_BUF (UNIV_PAGE_SIZE - 200) -/******************************************************************//** -Initializes the memory system. */ -UNIV_INTERN -void -mem_init( -/*=====*/ - ulint size); /*!< in: common pool size in bytes */ -/******************************************************************//** -Closes the memory system. */ -UNIV_INTERN -void -mem_close(void); -/*===========*/ +/** Space needed when allocating for a user a field of length N. +The space is allocated only in multiples of UNIV_MEM_ALIGNMENT. */ +#define MEM_SPACE_NEEDED(N) ut_calc_align((N), UNIV_MEM_ALIGNMENT) #ifdef UNIV_DEBUG -/**************************************************************//** -Use this macro instead of the corresponding function! Macro for memory -heap creation. */ - -# define mem_heap_create(N) mem_heap_create_func( \ - (N), __FILE__, __LINE__, MEM_HEAP_DYNAMIC) -/**************************************************************//** -Use this macro instead of the corresponding function! Macro for memory -heap creation. */ +/** Macro for memory heap creation. +@param[in] size Desired start block size. */ +# define mem_heap_create(size) \ + mem_heap_create_func((size), __FILE__, __LINE__, MEM_HEAP_DYNAMIC) -# define mem_heap_create_typed(N, T) mem_heap_create_func( \ - (N), __FILE__, __LINE__, (T)) +/** Macro for memory heap creation. +@param[in] size Desired start block size. +@param[in] type Heap type */ +# define mem_heap_create_typed(size, type) \ + mem_heap_create_func((size), __FILE__, __LINE__, (type)) #else /* UNIV_DEBUG */ -/**************************************************************//** -Use this macro instead of the corresponding function! Macro for memory -heap creation. */ +/** Macro for memory heap creation. +@param[in] size Desired start block size. */ +# define mem_heap_create(size) mem_heap_create_func((size), MEM_HEAP_DYNAMIC) -# define mem_heap_create(N) mem_heap_create_func( \ - (N), MEM_HEAP_DYNAMIC) -/**************************************************************//** -Use this macro instead of the corresponding function! Macro for memory -heap creation. */ - -# define mem_heap_create_typed(N, T) mem_heap_create_func( \ - (N), (T)) +/** Macro for memory heap creation. +@param[in] size Desired start block size. +@param[in] type Heap type */ +# define mem_heap_create_typed(size, type) \ + mem_heap_create_func((size), (type)) #endif /* UNIV_DEBUG */ -/**************************************************************//** -Use this macro instead of the corresponding function! Macro for memory -heap freeing. */ -#define mem_heap_free(heap) mem_heap_free_func(\ - (heap), __FILE__, __LINE__) -/*****************************************************************//** -NOTE: Use the corresponding macros instead of this function. Creates a -memory heap. For debugging purposes, takes also the file name and line as -arguments. +/** Creates a memory heap. +NOTE: Use the corresponding macros instead of this function. +A single user buffer of 'size' will fit in the block. +0 creates a default size block. +@param[in] size Desired start block size. +@param[in] file_name File name where created +@param[in] line Line where created +@param[in] type Heap type @return own: memory heap, NULL if did not succeed (only possible for MEM_HEAP_BTR_SEARCH type heaps) */ UNIV_INLINE mem_heap_t* mem_heap_create_func( -/*=================*/ - ulint n, /*!< in: desired start block size, - this means that a single user buffer - of size n will fit in the block, - 0 creates a default size block */ + ulint size, #ifdef UNIV_DEBUG - const char* file_name, /*!< in: file name where created */ - ulint line, /*!< in: line where created */ + const char* file_name, + ulint line, #endif /* UNIV_DEBUG */ - ulint type); /*!< in: heap type */ -/*****************************************************************//** -NOTE: Use the corresponding macro instead of this function. Frees the space -occupied by a memory heap. In the debug version erases the heap memory -blocks. */ + ulint type); + +/** Frees the space occupied by a memory heap. +NOTE: Use the corresponding macro instead of this function. +@param[in] heap Heap to be freed */ UNIV_INLINE void -mem_heap_free_func( -/*===============*/ - mem_heap_t* heap, /*!< in, own: heap to be freed */ - const char* file_name, /*!< in: file name where freed */ - ulint line); /*!< in: line where freed */ -/***************************************************************//** -Allocates and zero-fills n bytes of memory from a memory heap. -@return allocated, zero-filled storage */ +mem_heap_free( + mem_heap_t* heap); + +/** Allocates and zero-fills n bytes of memory from a memory heap. +@param[in] heap memory heap +@param[in] n number of bytes; if the heap is allowed to grow into +the buffer pool, this must be <= MEM_MAX_ALLOC_IN_BUF +@return allocated, zero-filled storage */ UNIV_INLINE void* mem_heap_zalloc( -/*============*/ - mem_heap_t* heap, /*!< in: memory heap */ - ulint n); /*!< in: number of bytes; if the heap is allowed - to grow into the buffer pool, this must be - <= MEM_MAX_ALLOC_IN_BUF */ -/***************************************************************//** -Allocates n bytes of memory from a memory heap. + mem_heap_t* heap, + ulint n); + +/** Allocates n bytes of memory from a memory heap. +@param[in] heap memory heap +@param[in] n number of bytes; if the heap is allowed to grow into +the buffer pool, this must be <= MEM_MAX_ALLOC_IN_BUF @return allocated storage, NULL if did not succeed (only possible for MEM_HEAP_BTR_SEARCH type heaps) */ UNIV_INLINE void* mem_heap_alloc( -/*===========*/ - mem_heap_t* heap, /*!< in: memory heap */ - ulint n); /*!< in: number of bytes; if the heap is allowed - to grow into the buffer pool, this must be - <= MEM_MAX_ALLOC_IN_BUF */ -/*****************************************************************//** -Returns a pointer to the heap top. -@return pointer to the heap top */ + mem_heap_t* heap, + ulint n); + +/** Returns a pointer to the heap top. +@param[in] heap memory heap +@return pointer to the heap top */ UNIV_INLINE byte* mem_heap_get_heap_top( -/*==================*/ - mem_heap_t* heap); /*!< in: memory heap */ -/*****************************************************************//** -Frees the space in a memory heap exceeding the pointer given. The -pointer must have been acquired from mem_heap_get_heap_top. The first -memory block of the heap is not freed. */ + mem_heap_t* heap); + +/** Frees the space in a memory heap exceeding the pointer given. +The pointer must have been acquired from mem_heap_get_heap_top. +The first memory block of the heap is not freed. +@param[in] heap heap from which to free +@param[in] old_top pointer to old top of heap */ UNIV_INLINE void mem_heap_free_heap_top( -/*===================*/ - mem_heap_t* heap, /*!< in: heap from which to free */ - byte* old_top);/*!< in: pointer to old top of heap */ -/*****************************************************************//** -Empties a memory heap. The first memory block of the heap is not freed. */ + mem_heap_t* heap, + byte* old_top); + +/** Empties a memory heap. +The first memory block of the heap is not freed. +@param[in] heap heap to empty */ UNIV_INLINE void mem_heap_empty( -/*===========*/ - mem_heap_t* heap); /*!< in: heap to empty */ -/*****************************************************************//** -Returns a pointer to the topmost element in a memory heap. + mem_heap_t* heap); + +/** Returns a pointer to the topmost element in a memory heap. The size of the element must be given. -@return pointer to the topmost element */ +@param[in] heap memory heap +@param[in] n size of the topmost element +@return pointer to the topmost element */ UNIV_INLINE void* mem_heap_get_top( + mem_heap_t* heap, + ulint n); + +/** Checks if a given chunk of memory is the topmost element stored in the +heap. If this is the case, then calling mem_heap_free_top() would free +that element from the heap. +@param[in] heap memory heap +@param[in] buf presumed topmost element +@param[in] buf_sz size of buf in bytes +@return true if topmost */ +UNIV_INLINE +bool +mem_heap_is_top( + mem_heap_t* heap, + const void* buf, + ulint buf_sz) + __attribute__((warn_unused_result)); + +/*****************************************************************//** +Allocate a new chunk of memory from a memory heap, possibly discarding +the topmost element. If the memory chunk specified with (top, top_sz) +is the topmost element, then it will be discarded, otherwise it will +be left untouched and this function will be equivallent to +mem_heap_alloc(). +@return allocated storage, NULL if did not succeed (only possible for +MEM_HEAP_BTR_SEARCH type heaps) */ +UNIV_INLINE +void* +mem_heap_replace( /*=============*/ - mem_heap_t* heap, /*!< in: memory heap */ - ulint n); /*!< in: size of the topmost element */ + mem_heap_t* heap, /*!< in/out: memory heap */ + const void* top, /*!< in: chunk to discard if possible */ + ulint top_sz, /*!< in: size of top in bytes */ + ulint new_sz);/*!< in: desired size of the new chunk */ +/*****************************************************************//** +Allocate a new chunk of memory from a memory heap, possibly discarding +the topmost element and then copy the specified data to it. If the memory +chunk specified with (top, top_sz) is the topmost element, then it will be +discarded, otherwise it will be left untouched and this function will be +equivallent to mem_heap_dup(). +@return allocated storage, NULL if did not succeed (only possible for +MEM_HEAP_BTR_SEARCH type heaps) */ +UNIV_INLINE +void* +mem_heap_dup_replace( +/*=================*/ + mem_heap_t* heap, /*!< in/out: memory heap */ + const void* top, /*!< in: chunk to discard if possible */ + ulint top_sz, /*!< in: size of top in bytes */ + const void* data, /*!< in: new data to duplicate */ + ulint data_sz);/*!< in: size of data in bytes */ +/*****************************************************************//** +Allocate a new chunk of memory from a memory heap, possibly discarding +the topmost element and then copy the specified string to it. If the memory +chunk specified with (top, top_sz) is the topmost element, then it will be +discarded, otherwise it will be left untouched and this function will be +equivallent to mem_heap_strdup(). +@return allocated string, NULL if did not succeed (only possible for +MEM_HEAP_BTR_SEARCH type heaps) */ +UNIV_INLINE +char* +mem_heap_strdup_replace( +/*====================*/ + mem_heap_t* heap, /*!< in/out: memory heap */ + const void* top, /*!< in: chunk to discard if possible */ + ulint top_sz, /*!< in: size of top in bytes */ + const char* str); /*!< in: new data to duplicate */ /*****************************************************************//** Frees the topmost element in a memory heap. The size of the element must be given. */ @@ -231,58 +274,10 @@ ulint mem_heap_get_size( /*==============*/ mem_heap_t* heap); /*!< in: heap */ -/**************************************************************//** -Use this macro instead of the corresponding function! -Macro for memory buffer allocation */ - -#define mem_zalloc(N) memset(mem_alloc(N), 0, (N)) - -#ifdef UNIV_DEBUG -#define mem_alloc(N) mem_alloc_func((N), __FILE__, __LINE__, NULL) -#define mem_alloc2(N,S) mem_alloc_func((N), __FILE__, __LINE__, (S)) -#else /* UNIV_DEBUG */ -#define mem_alloc(N) mem_alloc_func((N), NULL) -#define mem_alloc2(N,S) mem_alloc_func((N), (S)) -#endif /* UNIV_DEBUG */ - -/***************************************************************//** -NOTE: Use the corresponding macro instead of this function. -Allocates a single buffer of memory from the dynamic memory of -the C compiler. Is like malloc of C. The buffer must be freed -with mem_free. -@return own: free storage */ -UNIV_INLINE -void* -mem_alloc_func( -/*===========*/ - ulint n, /*!< in: requested size in bytes */ -#ifdef UNIV_DEBUG - const char* file_name, /*!< in: file name where created */ - ulint line, /*!< in: line where created */ -#endif /* UNIV_DEBUG */ - ulint* size); /*!< out: allocated size in bytes, - or NULL */ - -/**************************************************************//** -Use this macro instead of the corresponding function! -Macro for memory buffer freeing */ - -#define mem_free(PTR) mem_free_func((PTR), __FILE__, __LINE__) -/***************************************************************//** -NOTE: Use the corresponding macro instead of this function. -Frees a single buffer of storage from -the dynamic memory of C compiler. Similar to free of C. */ -UNIV_INLINE -void -mem_free_func( -/*==========*/ - void* ptr, /*!< in, own: buffer to be freed */ - const char* file_name, /*!< in: file name where created */ - ulint line); /*!< in: line where created */ /**********************************************************************//** Duplicates a NUL-terminated string. -@return own: a copy of the string, must be deallocated with mem_free */ +@return own: a copy of the string, must be deallocated with ut_free */ UNIV_INLINE char* mem_strdup( @@ -290,7 +285,7 @@ mem_strdup( const char* str); /*!< in: string to be copied */ /**********************************************************************//** Makes a NUL-terminated copy of a nonterminated string. -@return own: a copy of the string, must be deallocated with mem_free */ +@return own: a copy of the string, must be deallocated with ut_free */ UNIV_INLINE char* mem_strdupl( @@ -298,19 +293,19 @@ mem_strdupl( const char* str, /*!< in: string to be copied */ ulint len); /*!< in: length of str, in bytes */ -/**********************************************************************//** -Duplicates a NUL-terminated string, allocated from a memory heap. -@return own: a copy of the string */ -UNIV_INTERN +/** Duplicates a NUL-terminated string, allocated from a memory heap. +@param[in] heap memory heap where string is allocated +@param[in] str string to be copied +@return own: a copy of the string */ char* mem_heap_strdup( -/*============*/ - mem_heap_t* heap, /*!< in: memory heap where string is allocated */ - const char* str); /*!< in: string to be copied */ + mem_heap_t* heap, + const char* str); + /**********************************************************************//** Makes a NUL-terminated copy of a nonterminated string, allocated from a memory heap. -@return own: a copy of the string */ +@return own: a copy of the string */ UNIV_INLINE char* mem_heap_strdupl( @@ -321,8 +316,7 @@ mem_heap_strdupl( /**********************************************************************//** Concatenate two strings and return the result, using a memory heap. -@return own: the result */ -UNIV_INTERN +@return own: the result */ char* mem_heap_strcat( /*============*/ @@ -332,8 +326,7 @@ mem_heap_strcat( /**********************************************************************//** Duplicate a block of data, allocated from a memory heap. -@return own: a copy of the data */ -UNIV_INTERN +@return own: a copy of the data */ void* mem_heap_dup( /*=========*/ @@ -346,8 +339,7 @@ A simple sprintf replacement that dynamically allocates the space for the formatted string from the given heap. This supports a very limited set of the printf syntax: types 's' and 'u' and length modifier 'l' (which is required for the 'u' type). -@return heap-allocated formatted string */ -UNIV_INTERN +@return heap-allocated formatted string */ char* mem_heap_printf( /*============*/ @@ -355,15 +347,22 @@ mem_heap_printf( const char* format, /*!< in: format string */ ...) MY_ATTRIBUTE ((format (printf, 2, 3))); -#ifdef MEM_PERIODIC_CHECK -/******************************************************************//** -Goes through the list of all allocated mem blocks, checks their magic -numbers, and reports possible corruption. */ -UNIV_INTERN +/** Checks that an object is a memory heap (or a block of it) +@param[in] heap Memory heap to check */ +UNIV_INLINE void -mem_validate_all_blocks(void); -/*=========================*/ -#endif +mem_block_validate( + const mem_heap_t* heap); + +#ifdef UNIV_DEBUG +/** Validates the contents of a memory heap. +Asserts that the memory heap is consistent +@param[in] heap Memory heap to validate */ +void +mem_heap_validate( + const mem_heap_t* heap); + +#endif /* UNIV_DEBUG */ /*#######################################################################*/ @@ -403,11 +402,6 @@ struct mem_block_info_t { pool, this contains the buf_block_t handle; otherwise, this is NULL */ #endif /* !UNIV_HOTBACKUP */ -#ifdef MEM_PERIODIC_CHECK - UT_LIST_NODE_T(mem_block_t) mem_block_list; - /* List of all mem blocks allocated; protected - by the mem_comm_pool mutex */ -#endif }; #define MEM_BLOCK_MAGIC_N 764741555 @@ -416,10 +410,107 @@ struct mem_block_info_t { /* Header size for a memory heap block */ #define MEM_BLOCK_HEADER_SIZE ut_calc_align(sizeof(mem_block_info_t),\ UNIV_MEM_ALIGNMENT) -#include "mem0dbg.h" #ifndef UNIV_NONINL #include "mem0mem.ic" #endif +/** A C++ wrapper class to the mem_heap_t routines, so that it can be used +as an STL allocator */ +template<typename T> +class mem_heap_allocator +{ +public: + typedef T value_type; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + + mem_heap_allocator(mem_heap_t* heap) : m_heap(heap) { } + + mem_heap_allocator(const mem_heap_allocator& other) + : + m_heap(other.m_heap) + { + // Do nothing + } + + template <typename U> + mem_heap_allocator (const mem_heap_allocator<U>& other) + : + m_heap(other.m_heap) + { + // Do nothing + } + + ~mem_heap_allocator() { m_heap = 0; } + + size_type max_size() const + { + return(ULONG_MAX / sizeof(T)); + } + + /** This function returns a pointer to the first element of a newly + allocated array large enough to contain n objects of type T; only the + memory is allocated, and the objects are not constructed. Moreover, + an optional pointer argument (that points to an object already + allocated by mem_heap_allocator) can be used as a hint to the + implementation about where the new memory should be allocated in + order to improve locality. */ + pointer allocate(size_type n, const_pointer hint = 0) + { + return(reinterpret_cast<pointer>( + mem_heap_alloc(m_heap, n * sizeof(T)))); + } + + void deallocate(pointer p, size_type n) { } + + pointer address (reference r) const { return(&r); } + + const_pointer address (const_reference r) const { return(&r); } + + void construct(pointer p, const_reference t) + { + new (reinterpret_cast<void*>(p)) T(t); + } + + void destroy(pointer p) + { + (reinterpret_cast<T*>(p))->~T(); + } + + /** Allocators are required to supply the below template class member + which enables the possibility of obtaining a related allocator, + parametrized in terms of a different type. For example, given an + allocator type IntAllocator for objects of type int, a related + allocator type for objects of type long could be obtained using + IntAllocator::rebind<long>::other */ + template <typename U> + struct rebind + { + typedef mem_heap_allocator<U> other; + }; + +private: + mem_heap_t* m_heap; + template <typename U> friend class mem_heap_allocator; +}; + +template <class T> +bool operator== (const mem_heap_allocator<T>& left, + const mem_heap_allocator<T>& right) +{ + return(left.heap == right.heap); +} + +template <class T> +bool operator!= (const mem_heap_allocator<T>& left, + const mem_heap_allocator<T>& right) +{ + return(left.heap != right.heap); +} + #endif |