@@ -5,21 +5,48 @@
5#include <stddef.h>
5#include <stddef.h>
6#include <stdio.h>
6#include <stdio.h>
8+void c_heap_free(CHeapItem * item)
11+ if (item->next != NULL)
13+ item->next->prev_next = item->prev_next;
15+ *(item->prev_next) = item->next;
18+ item->finalizer(item->data);
24+CHeapItem * c_heap_allocate(size_t size, CDataFinalizer_t * finalizer)
26+ void * data = (void *) malloc(size);
27+ return c_heap_create_item(data, finalizer);
8CHeapItem * c_heap_create_item(void * data, CDataFinalizer_t * finalizer)
30CHeapItem * c_heap_create_item(void * data, CDataFinalizer_t * finalizer)
10 CHeapItem * item = (CHeapItem *) malloc(sizeof(CHeapItem));
32 CHeapItem * item = (CHeapItem *) malloc(sizeof(CHeapItem));
12 item->data = data;
34 item->data = data;
13 item->finalizer = finalizer;
35 item->finalizer = finalizer;
14− item->is_inserted = false;
15 item->is_used = false;
36 item->is_used = false;
16 item->next = NULL;
37 item->next = NULL;
38+ item->prev_next = NULL;
18 return item;
40 return item;
21−void c_heap_insert(CHeap * heap, CHeapItem * item)
43+void c_heap_insert_if_needed(CHeap * heap, CHeapItem * item)
45+ if (item->prev_next != NULL) return; // already inserted
47+ heap->first->prev_next = &item->next;
48+ item->prev_next = &heap->first;
23 item->next = heap->first;
50 item->next = heap->first;
24 heap->first = item;
51 heap->first = item;
@@ -29,22 +56,14 @@ void c_heap_mark_item(CHeapItem * item)
29 item->is_used = true;
56 item->is_used = true;
32−static void c_heap_free_item(CHeapItem * item)
34− item->finalizer(item->data);
38void c_heap_sweep(CHeap * heap)
59void c_heap_sweep(CHeap * heap)
40− CHeapItem ** prev_next = &heap->first;
41 CHeapItem * p = heap->first;
61 CHeapItem * p = heap->first;
42 while (p != NULL)
62 while (p != NULL)
44 if (p->is_used)
64 if (p->is_used)
46 p->is_used = false;
66 p->is_used = false;
47− prev_next = &p->next;
48 p = p->next;
67 p = p->next;
@@ -52,8 +71,7 @@ void c_heap_sweep(CHeap * heap)
52 CHeapItem * unused_item = p;
71 CHeapItem * unused_item = p;
53 p = p->next;
72 p = p->next;
55− *prev_next = unused_item->next;
56− c_heap_free_item(unused_item);
74+ c_heap_free(unused_item);
@@ -63,14 +81,11 @@ void c_heap_init(CHeap * heap)
63 heap->first = NULL;
81 heap->first = NULL;
66−void c_heap_free(CHeap * heap)
84+void c_heap_destroy(CHeap * heap)
68− CHeapItem * p = heap->first;
86+ while (heap->first != NULL)
71− CHeapItem * q = p;
88+ c_heap_free(heap->first); // will update heap->first via the backward link