py: Add ability to manually mark blocks during collect.

This commit is contained in:
Scott Shawcroft 2016-11-21 12:17:47 -08:00
parent f03a9ac505
commit 9321828158
2 changed files with 13 additions and 0 deletions

10
py/gc.c
View File

@ -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);

View File

@ -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);