mirror of
https://github.com/adtools/clib2.git
synced 2025-12-08 14:59:05 +00:00
New functions and data structures for slab allocator
This commit is contained in:
@ -161,6 +161,104 @@ extern int rand_r(unsigned int * seed);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can switch the built-in memory allocator, which is a thin wrapper
|
||||||
|
* around the AmigaOS built-in memory management system, to use a slab
|
||||||
|
* allocator. For this to work, you need to declare a global variable
|
||||||
|
* and set it to the size of the slabs to be used. This variable must
|
||||||
|
* be initialized at load time when the clib2 startup code runs:
|
||||||
|
*
|
||||||
|
* unsigned long __slab_max_size = 4096;
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern unsigned long __slab_max_size;
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you are using the slab allocator and need to quickly release the
|
||||||
|
* memory of all slabs which are currently unused, you can call the
|
||||||
|
* following function to do so.
|
||||||
|
*
|
||||||
|
* Please note that this function works within the context of the memory
|
||||||
|
* allocation system and may not be safe to call from interrupt code.
|
||||||
|
*/
|
||||||
|
extern void __free_unused_slabs(void);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* You can obtain runtime statistics about the slab allocator by
|
||||||
|
* invoking the __get_slab_usage() function which in turn invokes
|
||||||
|
* your callback function for each single slab currently in play.
|
||||||
|
*
|
||||||
|
* Your callback function must return 0 if it wants to be called again,
|
||||||
|
* for the next slab, or return -1 to stop. Note that your callback
|
||||||
|
* function may not be called if the slab allocator is currently
|
||||||
|
* not operational.
|
||||||
|
*
|
||||||
|
* Please note that this function works within the context of the memory
|
||||||
|
* allocation system and may not be safe to call from interrupt code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/* This is what your callback function will see when it is invoked. */
|
||||||
|
struct __slab_usage_information
|
||||||
|
{
|
||||||
|
/* The size of all slabs, in bytes. */
|
||||||
|
size_t sui_slab_size;
|
||||||
|
|
||||||
|
/* Number of allocations which are not managed by slabs, but
|
||||||
|
* are handled separate.
|
||||||
|
*/
|
||||||
|
size_t sui_num_single_allocations;
|
||||||
|
|
||||||
|
/* Total number of bytes allocated for memory not managed
|
||||||
|
* by slabs.
|
||||||
|
*/
|
||||||
|
size_t sui_total_single_allocation_size;
|
||||||
|
|
||||||
|
/* Number of slabs currently in play. This can be 0. */
|
||||||
|
size_t sui_num_slabs;
|
||||||
|
|
||||||
|
/* Number of currently unused slabs which contain no data. */
|
||||||
|
size_t sui_num_empty_slabs;
|
||||||
|
|
||||||
|
/* Number of slabs in use which are completely filled with data. */
|
||||||
|
size_t sui_num_full_slabs;
|
||||||
|
|
||||||
|
/* Total number of bytes allocated for all slabs. */
|
||||||
|
size_t sui_total_slab_allocation_size;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following data is updated for each slab which
|
||||||
|
* your callback function sees.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Index number of the slab being reported (0 = no slabs are in use). */
|
||||||
|
int sui_slab_index;
|
||||||
|
|
||||||
|
/* How large are the memory chunks managed by this slab? */
|
||||||
|
size_t sui_chunk_size;
|
||||||
|
|
||||||
|
/* How many memory chunks fit into this slab? */
|
||||||
|
size_t sui_num_chunks;
|
||||||
|
|
||||||
|
/* How many memory chunks in this slab are being used? */
|
||||||
|
size_t sui_num_chunks_used;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
typedef int (*__slab_usage_callback)(const struct __slab_usage_information * sui);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
void __get_slab_usage(__slab_usage_callback callback);
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* You can request to use the alloca() variant that actually does allocate
|
* You can request to use the alloca() variant that actually does allocate
|
||||||
* memory from the system rather than the current stack frame, which will
|
* memory from the system rather than the current stack frame, which will
|
||||||
|
|||||||
Reference in New Issue
Block a user