| Crates.io | context-allocator |
| lib.rs | context-allocator |
| version | 0.2.3 |
| created_at | 2019-04-11 17:52:36.241193+00 |
| updated_at | 2019-04-13 07:44:37.183196+00 |
| description | context-allocator |
| homepage | https://github.com/lemonrock/context-allocator |
| repository | https://github.com/lemonrock/context-allocator.git |
| max_upload_size | |
| id | 127344 |
| size | 237,505 |
This provides allocators suitable for a number of use cases.
All of these allocators implement the traits ::std::alloc::GlobalAlloc and ::std::alloc::Alloc, as we as a common base trait, Allocator.
The most useful is a global allocator which allows switching between thread, coroutine and global (and thuse lockable) memory allocators, using the macro global_thread_and_coroutine_switchable_allocator().
Allocators provided include:-
BumpAllocator, a never-freeing bump allocator with slight optimization for reallocating the last allocation.BitSetAllocator, an allocator that uses a bit set of free blocks; uses 64-bit chunks to optimize searches.MultipleBinarySearchTreeAllocator, an efficient allocator which minimizes fragmentation by using multiple red-black trees of free blocks which are aggresively defragmented.ContextAllocator, a choice of either BumpAllocator, BitSetAllocator or MultipleBinarySearchTreeAllocator.MemoryMapAllocator, a NUMA-aware mmap allocator with support for NUMA policies.GlobalThreadAndCoroutineSwitchableAllocator, suitable for replacing the global allocator and provides switchable allocators for global, thread local and context (coroutine) local needs; must b created using the macro global_thread_and_coroutine_switchable_allocator.Allocators use a MemorySource to obtain and release memory.
Memory sources provided include:-
MemoryMapSource, useful for thread-local allocators as it can obtain memory from NUMA-local memory.ArenaMemorySource, an arena of fixed blocks which is itself backed by a memory source; this is useful as a source for the BumpAllocator and BitSetAllocator when used for contexts.Additionally a number of adaptors are provided:-
AllocatorAdaptor, an adaptor of Allocator to GlobalAlloc and Alloc; use it by calling Allocator.adapt()GlobalAllocToAllocatorAdaptor, an adaptor of GlobalAlloc to Allocator, useful for assigning a global allocator to GlobalThreadAndCoroutineSwitchableAllocator.AllocToAllocatorAdaptor, an adaptor of Alloc to Allocator.When using GlobalThreadAndCoroutineSwitchableAllocator, it is possible to save and restore the allocator state for the currently running context (coroutine).
It is also possible to create a lockless, fast thread-local allocator which make use of NUMA memory, unlike a conventional malloc.
Investigate wrapping Rampant Pixel's Memory Allocator.
Investigate using DPDK's allocator.
Investigate a B-tree backed allocator.
Investigate a design that uses multiple doubly-linked 'free' lists of blocks; blocks can be variable in size but the free list is sorted
Investigate a fall-back over-size allocator for a thread-local allocator, which could use the NumaMemoryMapSource underneath.
Investigate supporting over-size allocations in MultipleBinarySearchTreeAllocator by scanning the largest binary search tree for contiguous blocks.
Investigate a persistent-memory backed allocator.
Properly support excess allocations and Alloc's grow_in_place functions, but only if these are used by downstream collections.
Investigate the use of the BMI1 intrinsics _blsi_u64 (extract lowest set bit), _blsmsk_u64 and _blsr_u64.
The license for this project is MIT.