91 lines
2.9 KiB
C
91 lines
2.9 KiB
C
#include "defralloc.h"
|
|
#include <memory.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
|
|
int allocs[] = {64, 64, 64, 64, 64, 64, 64, 64, 55};
|
|
int memsets[] = {0xde, 0xad, 0xbe, 0xef, 0xde, 0xca, 0xfb, 0xad};
|
|
int frees[] = {2, 4, 6};
|
|
void **allocs_ptrs[sizeof(allocs) / sizeof(*allocs)];
|
|
|
|
void dump_heap(df_heap *heap) {
|
|
printf("-- HEAP DUMP START --\nsize: %d | max elems: %d\n",
|
|
DEFRALLOC_HEAP_SIZE, DEFRALLOC_HEAP_ELEMS);
|
|
df_heap_elem *lastelem = 0;
|
|
void *lastelem_ptr = 0;
|
|
int lastelem_idx = -1;
|
|
for (int i = 0; i < DEFRALLOC_HEAP_ELEMS; i++) {
|
|
df_heap_elem *elem = heap->elems + i;
|
|
if (heap->elems[i].ptr > lastelem_ptr) {
|
|
lastelem = elem;
|
|
lastelem_idx = i;
|
|
lastelem_ptr = lastelem->ptr;
|
|
}
|
|
if (elem->ptr != 0) {
|
|
printf(" [%d] ptr: %lu | offset: %lu | size: %d | data: ", i,
|
|
(size_t)elem->ptr, (size_t)elem->ptr - (size_t)heap->buffer,
|
|
elem->size);
|
|
char *data = elem->ptr;
|
|
for (size_t i = 0; i < elem->size; i++) {
|
|
printf("%02hhx", data[i]);
|
|
}
|
|
} else {
|
|
printf(" [%d] empty", i);
|
|
}
|
|
putchar('\n');
|
|
}
|
|
int freemem;
|
|
if (lastelem == 0) {
|
|
freemem = DEFRALLOC_HEAP_SIZE;
|
|
} else {
|
|
void *blockstart = lastelem->ptr + lastelem->size;
|
|
freemem = DEFRALLOC_HEAP_SIZE - (blockstart - (void *)heap->buffer);
|
|
}
|
|
printf("last elem: %d | free: %db\n-- HEAP DUMP END --\n", lastelem_idx,
|
|
freemem);
|
|
}
|
|
|
|
int main() {
|
|
df_heap heap;
|
|
df_init(&heap);
|
|
puts("PHASE 1: MALLOC\n");
|
|
dump_heap(&heap);
|
|
for (int i = 0; i < sizeof(allocs) / sizeof(*allocs); i++) {
|
|
allocs_ptrs[i] = df_malloc(&heap, allocs[i]);
|
|
printf(" [%d] df_malloc(&heap, %d): %lu -> %lu\n", i, allocs[i],
|
|
(size_t)allocs_ptrs[i],
|
|
allocs_ptrs[i] == 0 ? 0 : (size_t) * (allocs_ptrs[i]));
|
|
if (allocs_ptrs[i]) {
|
|
memset(*allocs_ptrs[i], memsets[i], allocs[i]);
|
|
}
|
|
}
|
|
dump_heap(&heap);
|
|
puts("\nPHASE 2: FREE\n");
|
|
for (int i = 0; i < sizeof(frees) / sizeof(*frees); i++) {
|
|
void *ptr = *(allocs_ptrs[frees[i]]);
|
|
printf(" [%d] df_free(&heap, %lu): %d\n", i, (size_t)ptr,
|
|
df_free(&heap, ptr));
|
|
dump_heap(&heap);
|
|
}
|
|
puts("\nPHASE 3: RE-MALLOC\n");
|
|
dump_heap(&heap);
|
|
for (int i = 0; i < sizeof(frees) / sizeof(*frees); i++) {
|
|
allocs_ptrs[frees[i]] = df_malloc(&heap, allocs[frees[i]]);
|
|
printf(" [%d] df_malloc(&heap, %d): %lu -> %lu\n", i, allocs[i],
|
|
(size_t)allocs_ptrs[i],
|
|
allocs_ptrs[i] == 0 ? 0 : (size_t) * (allocs_ptrs[frees[i]]));
|
|
if (allocs_ptrs[frees[i]]) {
|
|
memset(*allocs_ptrs[frees[i]], memsets[i], allocs[frees[i]]);
|
|
}
|
|
}
|
|
dump_heap(&heap);
|
|
puts("\nPHASE 4: FREE ALL\n");
|
|
for (int i = 0; i < DEFRALLOC_HEAP_ELEMS; i++) {
|
|
void *ptr = *(allocs_ptrs[i]);
|
|
printf(" [%d] df_free(&heap, %lu): %d\n", i, (size_t)ptr,
|
|
df_free(&heap, ptr));
|
|
dump_heap(&heap);
|
|
}
|
|
putchar('\n');
|
|
return 0;
|
|
} |