From 93218281588b42331d83e4aaa45ac1abe4af130b Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Mon, 21 Nov 2016 12:17:47 -0800 Subject: [PATCH] py: Add ability to manually mark blocks during collect. --- py/gc.c | 10 ++++++++++ py/gc.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/py/gc.c b/py/gc.c index 7ed53cfc7f..ca977ce094 100644 --- a/py/gc.c +++ b/py/gc.c @@ -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); diff --git a/py/gc.h b/py/gc.h index 7d8fe2bf8c..64c4789965 100644 --- a/py/gc.h +++ b/py/gc.h @@ -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);