aboutsummaryrefslogtreecommitdiff
path: root/tinyalloc.c
diff options
context:
space:
mode:
authorKarsten Schmidt <k@postspectacular.com>2017-07-15 12:12:34 +0100
committerKarsten Schmidt <k@postspectacular.com>2017-07-15 12:25:51 +0100
commitfeef1bae13fa929fef3deda18d676cd25363a50e (patch)
tree1ec97eab26e09fc637f4467c3ae0a55b9bd19cb8 /tinyalloc.c
parentb838efb48972bc975c609179f261119a5f247a8c (diff)
remove various functions if TA_DISABLE_COMPACT, update ptr casts, update readme
Diffstat (limited to 'tinyalloc.c')
-rw-r--r--tinyalloc.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/tinyalloc.c b/tinyalloc.c
index 93d568d..9b07461 100644
--- a/tinyalloc.c
+++ b/tinyalloc.c
@@ -52,9 +52,13 @@ typedef struct {
static Heap *heap = (Heap *)TA_BASE;
/**
- * Insert block into free list, sorted by addr.
+ * If compaction is enabled, inserts block
+ * into free list, sorted by addr.
+ * If disabled, add block has new head of
+ * the free list.
*/
static void insert_block(Block *block) {
+#ifndef TA_DISABLE_COMPACT
Block *ptr = heap->free;
Block *prev = NULL;
while (ptr != NULL) {
@@ -76,8 +80,13 @@ static void insert_block(Block *block) {
heap->free = block;
}
block->next = ptr;
+#else
+ block->next = heap->free;
+ heap->free = block;
+#endif
}
+#ifndef TA_DISABLE_COMPACT
static void release_blocks(Block *scan, Block *to) {
Block *scan_next;
while (scan != to) {
@@ -92,15 +101,13 @@ static void release_blocks(Block *scan, Block *to) {
}
}
-#ifndef TA_DISABLE_COMPACT
static void compact() {
Block *ptr = heap->free;
Block *prev;
Block *scan;
while (ptr != NULL) {
- prev = ptr;
- scan = ptr->next;
- size_t base = (size_t)ptr->addr;
+ prev = ptr;
+ scan = ptr->next;
while (scan != NULL &&
(size_t)prev->addr + prev->size == (size_t)scan->addr) {
print_s("merge");
@@ -109,7 +116,8 @@ static void compact() {
scan = scan->next;
}
if (prev != ptr) {
- size_t new_size = prev->addr + prev->size - ptr->addr;
+ size_t new_size =
+ (size_t)prev->addr - (size_t)ptr->addr + prev->size;
print_s("new size");
print_i(new_size);
ptr->size = new_size;
@@ -186,7 +194,7 @@ static Block *alloc_block(size_t num) {
ptr->size = num;
Block *split = heap->fresh;
heap->fresh = split->next;
- split->addr = ptr->addr + num;
+ split->addr = (void *)((size_t)ptr->addr + num);
print_s("split");
print_i((size_t)split->addr);
split->size = excess;