memman
static struct memman _aml_memman = MEMMAN_MEMMANAGER_DESC(aml_blockman, 21,
struct memman *aml_memman = &_aml_memman;
extern struct memman *aml_memman;
blockman_init(struct memman *memman, unsigned int id)
bmp = &memman->blockman[id];
status = manage_block(memman, id, bmp->initial_block,
memman_alloc(struct memman *memman, unsigned int id)
if (memman->max_memid <= id) {
bmp = &memman->blockman[id];
if (blockman_init(memman, id)) {
memman->alloc_called++;
memman->required_mem += bmp->size * MEMMAN_INCR_SIZE;
memman->allocated_mem += alloc_size;
memman->salloc_called++;
if (manage_block(memman, id, block, 0, MEMMAN_INCR_SIZE)) {
memman_flexsize_add_histogram(struct memman *memman, size_t size,
for (i = 0; i < memman->flex_mem_histogram_ptr; i++) {
gap = memman->flex_mem_histogram[i].mem_size - size;
memman->flex_mem_histogram[i].count++;
if (memman->flex_mem_histogram[i].mem_size < size) {
memman->flex_mem_histogram[i].mem_size = size;
if (memman->flex_mem_histogram_ptr == MEMMAN_HISTOGRAM_SIZE) {
memman_flexsize_add_histogram(memman, size, tolerance + 1);
i = memman->flex_mem_histogram_ptr;
memman->flex_mem_histogram[i].mem_size = size;
memman->flex_mem_histogram[i].count = 1;
memman->flex_mem_histogram_ptr++;
memman_sort_histogram_by_size(struct memman *memman)
qsort(memman->flex_mem_histogram, memman->flex_mem_histogram_ptr,
memman_alloc_flexsize(struct memman *memman, size_t size)
if (!memman->flex_mem_initialized) {
LIST_INIT(&memman->flexmem_info_list);
bzero(memman->flex_mem_histogram,
memman->flex_mem_initialized = 1;
LIST_INSERT_HEAD(&memman->flexmem_info_list, info, links);
memman->flex_alloc_called++;
memman->flex_salloc_called++;
memman->flex_required_mem += size;
memman->flex_allocated_mem += size;
if (memman->flex_mem_size_min == 0 ||
memman->flex_mem_size_min > size) {
memman->flex_mem_size_min = size;
if (memman->flex_mem_size_max < size) {
memman->flex_mem_size_max = size;
if (memman->flex_peak_mem_usage <
(memman->flex_allocated_mem - memman->flex_reclaimed_mem)) {
memman->flex_peak_mem_usage =
(memman->flex_allocated_mem - memman->flex_reclaimed_mem);
memman_flexsize_add_histogram(memman, size,
memman->flex_mem_histogram_initial_tolerance);
memman_guess_memid(struct memman *memman, void *chunk)
for (id = 0; id < memman->max_memid; id++) {
bmp = &memman->blockman[id];
if (blockman_init(memman, id)) {
memman_free(struct memman *memman, unsigned int memid, void *chunk)
id = memman_guess_memid(memman, chunk);
if (memman->max_memid <= id) {
bmp = &memman->blockman[id];
if (blockman_init(memman, id)) {
memman->free_called++;
memman->sfree_called++;
memman->sfree_called++;
memman->reclaimed_mem += memblock->allocated_mem;
memman_free_flexsize(struct memman *memman, void *chunk)
LIST_FOREACH(info, &memman->flexmem_info_list, links) {
memman->flex_reclaimed_mem += info->mem_size;
memman->flex_free_called++;
memman->flex_sfree_called++;
memman_freeall(struct memman *memman)
for (id = 0; id < memman->max_memid; id++) {
bmp = &memman->blockman[id];
memman_free(memman, id, chunk);
memman->sfree_called++;
memman->reclaimed_mem += memblock->allocated_mem;
LIST_FOREACH(info, &memman->flexmem_info_list, links) {
memman_free_flexsize(memman, info->addr);
memman_statistics_fixedsize(struct memman *memman)
printf(" alloc(): %d times\n", memman->alloc_called);
printf(" system malloc(): %d times\n", memman->salloc_called);
printf(" free(): %d times\n", memman->free_called);
printf(" system free(): %d times\n", memman->sfree_called);
printf(" required memory: %zd bytes\n", memman->required_mem);
printf(" allocated memory: %zd bytes\n", memman->allocated_mem);
printf(" reclaimed memory: %zd bytes\n", memman->reclaimed_mem);
memman_statistics_flexsize(struct memman *memman)
printf(" alloc(): %d times\n", memman->flex_alloc_called);
printf(" system malloc(): %d times\n", memman->flex_salloc_called);
printf(" free(): %d times\n", memman->flex_free_called);
printf(" system free(): %d times\n", memman->flex_sfree_called);
printf(" required memory: %zd bytes\n", memman->flex_required_mem);
printf(" allocated memory: %zd bytes\n", memman->flex_allocated_mem);
printf(" reclaimed memory: %zd bytes\n", memman->flex_reclaimed_mem);
printf(" peak memory usage: %zd bytes\n", memman->flex_peak_mem_usage);
printf(" min memory size: %zd bytes\n", memman->flex_mem_size_min);
printf(" max memory size: %zd bytes\n", memman->flex_mem_size_max);
(memman->flex_alloc_called) ?
memman->flex_allocated_mem / memman->flex_alloc_called : 0);
memman->flex_mem_histogram_ptr);
memman_sort_histogram_by_size(memman);
for (i = 0; i < memman->flex_mem_histogram_ptr; i++) {
memman->flex_mem_histogram[i].mem_size,
memman->flex_mem_histogram[i].count);
memman_statistics(struct memman *memman)
memman_statistics_fixedsize(memman);
memman_statistics_flexsize(memman);
memman_memid2size(struct memman *memman, unsigned int id)
if (memman->max_memid <= id) {
return (memman->blockman[id].size);
static int manage_block(struct memman *memman, unsigned int id,
static int blockman_init(struct memman *memman, unsigned int id);
static void memman_flexsize_add_histogram(struct memman *memman,
static void memman_sort_histogram_by_size(struct memman *memman);
static unsigned int memman_guess_memid(struct memman *memman, void *chunk);
static void memman_statistics_fixedsize(struct memman *memman);
static void memman_statistics_flexsize(struct memman *memman);
manage_block(struct memman *memman, unsigned int id, void *block,
bmp = &memman->blockman[id];
memman->allocated_mem += alloc_size;
memman->salloc_called++;
void *memman_alloc(struct memman *, unsigned int);
void *memman_alloc_flexsize(struct memman *, size_t);
void memman_free(struct memman *, unsigned int, void *);
void memman_free_flexsize(struct memman *, void *);
void memman_freeall(struct memman *);
void memman_statistics(struct memman *);
size_t memman_memid2size(struct memman *, unsigned int);