diff options
| author | Scott Shawcroft <scott.shawcroft@gmail.com> | 2016-11-21 12:17:47 -0800 |
|---|---|---|
| committer | Scott Shawcroft <scott.shawcroft@gmail.com> | 2016-11-21 14:11:49 -0800 |
| commit | 93218281588b42331d83e4aaa45ac1abe4af130b (patch) | |
| tree | 295c36456034853f2199461e78e89c9d1a6c1724 /py | |
| parent | f03a9ac505c563d9c7d06f198d1af2674328bfe3 (diff) | |
py: Add ability to manually mark blocks during collect.
Diffstat (limited to 'py')
| -rw-r--r-- | py/gc.c | 10 | ||||
| -rw-r--r-- | py/gc.h | 3 |
2 files changed, 13 insertions, 0 deletions
@@ -392,6 +392,16 @@ void gc_info(gc_info_t *info) { GC_EXIT(); } +void gc_mark_block(void * ptr) { + if (VERIFY_PTR(ptr)) { + size_t _block = BLOCK_FROM_PTR(ptr); + if (ATB_GET_KIND(_block) == AT_HEAD) { + /* an unmarked head, mark it, and push it on gc stack */ + ATB_HEAD_TO_MARK(_block); + } + } +} + void *gc_alloc(size_t n_bytes, bool has_finaliser) { size_t n_blocks = ((n_bytes + BYTES_PER_BLOCK - 1) & (~(BYTES_PER_BLOCK - 1))) / BYTES_PER_BLOCK; DEBUG_printf("gc_alloc(" UINT_FMT " bytes -> " UINT_FMT " blocks)\n", n_bytes, n_blocks); @@ -45,6 +45,9 @@ void gc_collect_start(void); void gc_collect_root(void **ptrs, size_t len); void gc_collect_end(void); +// During a collect, use this to mark blocks used in C but allocated using gc_alloc. +void gc_mark_block(void * ptr); + void *gc_alloc(size_t n_bytes, bool has_finaliser); void gc_free(void *ptr); // does not call finaliser size_t gc_nbytes(const void *ptr); |
