on master help sign in
Improve C heap.
commitbf370490ff2aad776b3937a314f3b319bd60d34c authorMatus Tejiscak <ziman@functor.sk> dateFri 22 Jan 2016, 12:38 (11 years ago) parent9c75a0b
3 files changed+20−2
rts/idris_heap.h+10−2 rts/idris_rts.c+5 rts/idris_rts.h+5
rts/idris_heap.h+10−2
@@ -4,11 +4,15 @@
44#include <stdbool.h>
55#include <stddef.h>
66
7+/* *** C heap ***
8+ * Objects with finalizers. Mark&sweep-collected.
9+ */
10+
711typedef void CDataFinalizer_t(void *);
812
913typedef struct CHeapItem {
1014 void * data;
11− CDataFinalizer_t * finalizer; // responsible for freeing the passed pointer, too
15+ CDataFinalizer_t * finalizer; // should free() the passed data pointer, too
1216 bool is_used;
1317 struct CHeapItem * next;
1418 struct CHeapItem ** prev_next;
@@ -19,7 +23,7 @@ typedef struct CHeap {
1923} CHeap;
2024
2125void c_heap_init(CHeap * c_heap);
22−void c_heap_destroy(CHeap * c_heap);
26+void c_heap_destroy(CHeap * c_heap); // will call finalizers on everything
2327void c_heap_insert_if_needed(CHeap * c_heap, CHeapItem * item);
2428void c_heap_mark_item(CHeapItem * item);
2529void c_heap_sweep(CHeap * c_heap);
@@ -29,6 +33,10 @@ CHeapItem * c_heap_create_item(void * data, CDataFinalizer_t * finalizer);
2933CHeapItem * c_heap_allocate(size_t size, CDataFinalizer_t * finalizer);
3034void c_heap_free(CHeapItem * item);
3135
36+/* *** Idris heap **
37+ * Objects without finalizers. Cheney-collected.
38+ */
39+
3240typedef struct {
3341 char* next; // Next allocated chunk. Should always (heap <= next < end).
3442 char* heap; // Point to bottom of heap
rts/idris_rts.c+5
@@ -132,6 +132,11 @@ CData cdata_allocate(size_t size, CDataFinalizer_t finalizer)
132132 return c_heap_allocate(size, finalizer);
133133}
134134
135+CData cdata_manage(void * data, CDataFinalizer_t finalizer)
136+{
137+ return c_heap_create_item(data, finalizer);
138+}
139+
135140void cdata_free(CData cd)
136141{
137142 c_heap_free(cd);
rts/idris_rts.h+5
@@ -122,11 +122,16 @@ typedef struct VM_t VM;
122122 * access it only in the following three ways:
123123 *
124124 * CData cd = cdata_allocate(...);
125+ * or
126+ * void * ptr = malloc(...);
127+ * CData cd = cdata_manage(ptr, ...);
128+ *
125129 * use(cd->data);
126130 * cdata_free(cd); // optionally
127131 *
128132 */
129133typedef CHeapItem * CData;
134+CData cdata_manage(void * data, CDataFinalizer_t * finalizer);
130135CData cdata_allocate(size_t size, CDataFinalizer_t * finalizer);
131136void cdata_free(CData cd); // explicit freeing not required but available
132137