|
Packit |
4e8bc4 |
/* slabs memory allocation */
|
|
Packit |
4e8bc4 |
#ifndef SLABS_H
|
|
Packit |
4e8bc4 |
#define SLABS_H
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Init the subsystem. 1st argument is the limit on no. of bytes to allocate,
|
|
Packit |
4e8bc4 |
0 if no limit. 2nd argument is the growth factor; each slab will use a chunk
|
|
Packit |
4e8bc4 |
size equal to the previous slab's chunk size times this factor.
|
|
Packit |
4e8bc4 |
3rd argument specifies if the slab allocator should allocate all memory
|
|
Packit |
4e8bc4 |
up front (if true), or allocate memory in chunks as it is needed (if false)
|
|
Packit |
4e8bc4 |
*/
|
|
Packit |
4e8bc4 |
void slabs_init(const size_t limit, const double factor, const bool prealloc, const uint32_t *slab_sizes, void *mem_base_external, bool reuse_mem);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Call only during init. Pre-allocates all available memory */
|
|
Packit |
4e8bc4 |
void slabs_prefill_global(void);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/**
|
|
Packit |
4e8bc4 |
* Given object size, return id to use when allocating/freeing memory for object
|
|
Packit |
4e8bc4 |
* 0 means error: can't store such a large object
|
|
Packit |
4e8bc4 |
*/
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
unsigned int slabs_clsid(const size_t size);
|
|
Packit |
4e8bc4 |
unsigned int slabs_size(const int clsid);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Allocate object of given length. 0 on error */ /*@null@*/
|
|
Packit |
4e8bc4 |
#define SLABS_ALLOC_NO_NEWPAGE 1
|
|
Packit |
4e8bc4 |
void *slabs_alloc(const size_t size, unsigned int id, unsigned int flags);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Free previously allocated object */
|
|
Packit |
4e8bc4 |
void slabs_free(void *ptr, size_t size, unsigned int id);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Adjust global memory limit up or down */
|
|
Packit |
4e8bc4 |
bool slabs_adjust_mem_limit(size_t new_mem_limit);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
typedef struct {
|
|
Packit |
4e8bc4 |
unsigned int chunks_per_page;
|
|
Packit |
4e8bc4 |
unsigned int chunk_size;
|
|
Packit |
4e8bc4 |
long int free_chunks;
|
|
Packit |
4e8bc4 |
long int total_pages;
|
|
Packit |
4e8bc4 |
} slab_stats_automove;
|
|
Packit |
4e8bc4 |
void fill_slab_stats_automove(slab_stats_automove *am);
|
|
Packit |
4e8bc4 |
unsigned int global_page_pool_size(bool *mem_flag);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/** Fill buffer with stats */ /*@null@*/
|
|
Packit |
4e8bc4 |
void slabs_stats(ADD_STAT add_stats, void *c);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* Hints as to freespace in slab class */
|
|
Packit |
4e8bc4 |
unsigned int slabs_available_chunks(unsigned int id, bool *mem_flag, unsigned int *chunks_perslab);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
void slabs_mlock(void);
|
|
Packit |
4e8bc4 |
void slabs_munlock(void);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
int start_slab_maintenance_thread(void);
|
|
Packit |
4e8bc4 |
void stop_slab_maintenance_thread(void);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum reassign_result_type {
|
|
Packit |
4e8bc4 |
REASSIGN_OK=0, REASSIGN_RUNNING, REASSIGN_BADCLASS, REASSIGN_NOSPARE,
|
|
Packit |
4e8bc4 |
REASSIGN_SRC_DST_SAME
|
|
Packit |
4e8bc4 |
};
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
enum reassign_result_type slabs_reassign(int src, int dst);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
void slabs_rebalancer_pause(void);
|
|
Packit |
4e8bc4 |
void slabs_rebalancer_resume(void);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#ifdef EXTSTORE
|
|
Packit |
4e8bc4 |
void slabs_set_storage(void *arg);
|
|
Packit |
4e8bc4 |
#endif
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
/* Fixup for restartable code. */
|
|
Packit |
4e8bc4 |
unsigned int slabs_fixup(char *chunk, const int border);
|
|
Packit |
4e8bc4 |
|
|
Packit |
4e8bc4 |
#endif
|