diff options
Diffstat (limited to 'thirdparty/rpmalloc/rpmalloc.h')
| -rw-r--r-- | thirdparty/rpmalloc/rpmalloc.h | 84 |
1 files changed, 49 insertions, 35 deletions
diff --git a/thirdparty/rpmalloc/rpmalloc.h b/thirdparty/rpmalloc/rpmalloc.h index d11292fb1..ea7d18e23 100644 --- a/thirdparty/rpmalloc/rpmalloc.h +++ b/thirdparty/rpmalloc/rpmalloc.h @@ -54,11 +54,16 @@ extern "C" { #define RPMALLOC_MAX_ALIGNMENT (256 * 1024) -//! Define RPMALLOC_FIRST_CLASS_HEAPS to enable heap based API (rpmalloc_heap_* functions). +//! Define RPMALLOC_FIRST_CLASS_HEAPS to non-zero to enable heap based API (rpmalloc_heap_* functions). #ifndef RPMALLOC_FIRST_CLASS_HEAPS #define RPMALLOC_FIRST_CLASS_HEAPS 0 #endif +//! Define RPMALLOC_HEAP_STATISTICS to non-zero to enable first class heap statistics gathering. +#ifndef RPMALLOC_HEAP_STATISTICS +#define RPMALLOC_HEAP_STATISTICS 0 +#endif + //! Flag to rpaligned_realloc to not preserve content in reallocation #define RPMALLOC_NO_PRESERVE 1 //! Flag to rpaligned_realloc to fail and return null pointer if grow cannot be done in-place, @@ -72,18 +77,16 @@ typedef struct rpmalloc_global_statistics_t { size_t mapped; //! Peak amount of virtual memory mapped, all of which might not have been committed (only if ENABLE_STATISTICS=1) size_t mapped_peak; - //! Current amount of memory in global caches for small and medium sizes (<32KiB) - size_t cached; - //! Current amount of memory allocated in huge allocations, i.e larger than LARGE_SIZE_LIMIT which is 2MiB by - //! default (only if ENABLE_STATISTICS=1) - size_t huge_alloc; - //! Peak amount of memory allocated in huge allocations, i.e larger than LARGE_SIZE_LIMIT which is 2MiB by default - //! (only if ENABLE_STATISTICS=1) - size_t huge_alloc_peak; - //! Total amount of memory mapped since initialization (only if ENABLE_STATISTICS=1) - size_t mapped_total; - //! Total amount of memory unmapped since initialization (only if ENABLE_STATISTICS=1) - size_t unmapped_total; + //! Running counter of total amount of memory committed (only if ENABLE_STATISTICS=1) + size_t committed; + //! Running counter of total amount of memory decommitted (only if ENABLE_STATISTICS=1) + size_t decommitted; + //! Current amount of virtual memory active and committed (only if ENABLE_STATISTICS=1) + size_t active; + //! Peak amount of virtual memory active and committed (only if ENABLE_STATISTICS=1) + size_t active_peak; + //! Current heap count (only if ENABLE_STATISTICS=1) + size_t heap_count; } rpmalloc_global_statistics_t; typedef struct rpmalloc_thread_statistics_t { @@ -147,10 +150,10 @@ typedef struct rpmalloc_interface_t { //! set a memory_unmap function or else the default implementation will be used for both. This function must be //! thread safe, it can be called by multiple threads simultaneously. void* (*memory_map)(size_t size, size_t alignment, size_t* offset, size_t* mapped_size); - //! Commit a range of memory pages - void (*memory_commit)(void* address, size_t size); - //! Decommit a range of memory pages - void (*memory_decommit)(void* address, size_t size); + //! Commit a range of memory pages. Return non-zero if the operation failed and the address range could not be committed. + int (*memory_commit)(void* address, size_t size); + //! Decommit a range of memory pages. Return non-zero if the operation failed and the address range could not be decommitted. + int (*memory_decommit)(void* address, size_t size); //! Unmap the memory pages starting at address and spanning the given number of bytes. If you set a memory_unmap //! function, you must also set a memory_map function or else the default implementation will be used for both. This //! function must be thread safe, it can be called by multiple threads simultaneously. @@ -260,44 +263,38 @@ rprealloc(void* ptr, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_S //! Reallocate the given block to at least the given size and alignment, // with optional control flags (see RPMALLOC_NO_PRESERVE). // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpaligned_realloc(void* ptr, size_t alignment, size_t size, size_t oldsize, unsigned int flags) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(3); //! Allocate a memory block of at least the given size and alignment. // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpaligned_alloc(size_t alignment, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(2); //! Allocate a memory block of at least the given size and alignment. // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpaligned_zalloc(size_t alignment, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(2); //! Allocate a memory block of at least the given size and alignment, and zero initialize it. // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpaligned_calloc(size_t alignment, size_t num, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE2(2, 3); //! Allocate a memory block of at least the given size and alignment. // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpmemalign(size_t alignment, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(2); //! Allocate a memory block of at least the given size and alignment. // Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB) +// and should ideally be less than memory page size. RPMALLOC_EXPORT int rpposix_memalign(void** memptr, size_t alignment, size_t size); @@ -336,12 +333,18 @@ rpmalloc_heap_alloc(rpmalloc_heap_t* heap, size_t size) RPMALLOC_ATTRIB_MALLOC R //! Allocate a memory block of at least the given size using the given heap. The returned // block will have the requested alignment. Alignment must be a power of two and a multiple of sizeof(void*), -// and should ideally be less than memory page size. A caveat of rpmalloc -// internals is that this must also be strictly less than the span size (default 64KiB). +// and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpmalloc_heap_aligned_alloc(rpmalloc_heap_t* heap, size_t alignment, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(3); +//! Allocate a zero initialized memory block of at least the given size using the given heap. The returned +// block will have the requested alignment. Alignment must be a power of two and a multiple of sizeof(void*), +// and should ideally be less than memory page size. +RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* +rpmalloc_heap_aligned_zalloc(rpmalloc_heap_t* heap, size_t alignment, size_t size) RPMALLOC_ATTRIB_MALLOC + RPMALLOC_ATTRIB_ALLOC_SIZE(3); + //! Allocate a memory block of at least the given size using the given heap and zero initialize it. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpmalloc_heap_calloc(rpmalloc_heap_t* heap, size_t num, size_t size) RPMALLOC_ATTRIB_MALLOC @@ -349,8 +352,7 @@ rpmalloc_heap_calloc(rpmalloc_heap_t* heap, size_t num, size_t size) RPMALLOC_AT //! Allocate a memory block of at least the given size using the given heap and zero initialize it. The returned // block will have the requested alignment. Alignment must either be zero, or a power of two and a multiple of -// sizeof(void*), and should ideally be less than memory page size. A caveat of rpmalloc internals is that this must -// also be strictly less than the span size (default 64KiB). +// sizeof(void*), and should ideally be less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpmalloc_heap_aligned_calloc(rpmalloc_heap_t* heap, size_t alignment, size_t num, size_t size) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE2(3, 4); @@ -364,8 +366,7 @@ rpmalloc_heap_realloc(rpmalloc_heap_t* heap, void* ptr, size_t size, unsigned in //! Reallocate the given block to at least the given size. The memory block MUST be allocated // by the same heap given to this function. The returned block will have the requested alignment. // Alignment must be either zero, or a power of two and a multiple of sizeof(void*), and should ideally be -// less than memory page size. A caveat of rpmalloc internals is that this must also be strictly less than -// the span size (default 64KiB). +// less than memory page size. RPMALLOC_EXPORT RPMALLOC_ALLOCATOR void* rpmalloc_heap_aligned_realloc(rpmalloc_heap_t* heap, void* ptr, size_t alignment, size_t size, unsigned int flags) RPMALLOC_ATTRIB_MALLOC RPMALLOC_ATTRIB_ALLOC_SIZE(4); @@ -379,6 +380,19 @@ rpmalloc_heap_free(rpmalloc_heap_t* heap, void* ptr); RPMALLOC_EXPORT void rpmalloc_heap_free_all(rpmalloc_heap_t* heap); +struct rpmalloc_heap_statistics_t { + // Number of bytes allocated + size_t allocated_size; + // Number of bytes committed + size_t committed_size; + // Number of bytes mapped + size_t mapped_size; +}; + +//! Get heap statistics (if enabled in build) +RPMALLOC_EXPORT struct rpmalloc_heap_statistics_t +rpmalloc_heap_statistics(rpmalloc_heap_t* heap); + //! Set the given heap as the current heap for the calling thread. A heap MUST only be current heap // for a single thread, a heap can never be shared between multiple threads. The previous // current heap for the calling thread is released to be reused by other threads. |