From 479e880b30fd81f8aed44d7b5c990e190cfe6295 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Thu, 5 Mar 2020 13:26:17 -0500 Subject: [PATCH] Allow optional collection of opaque pointers --- CHANGELOG.md | 6 ++++++ gc.c | 6 ++++++ include/cyclone/types.h | 8 +++++++- scheme/cyclone/common.sld | 2 +- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef9f0515..908b40ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.16 - TBD + +Features + +- Updated the C API to optionally allow the GC to free memory pointed to by an Opaque object. + ## 0.15 - February 26, 2020 Features diff --git a/gc.c b/gc.c index abfec252..4d7465ee 100644 --- a/gc.c +++ b/gc.c @@ -534,6 +534,11 @@ static size_t gc_convert_heap_page_to_free_list(gc_heap *h, gc_thread_data *thd) fprintf(stderr, "mp_clear from sweep\n"); #endif mp_clear(&(((bignum_type *)p)->bn)); + } else if (type_of(p) == c_opaque_tag && opaque_collect_ptr(p)) { +#if GC_DEBUG_VERBOSE + fprintf(stderr, "free opaque pointer %p from sweep\n", opaque_ptr(p)); +#endif + free( opaque_ptr(p) ); } // Free block @@ -956,6 +961,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd) mark(hp) = thd->gc_alloc_color; immutable(hp) = immutable(obj); type_of(hp) = c_opaque_tag; + hp->collect_ptr = ((c_opaque_type *) obj)->collect_ptr; hp->ptr = ((c_opaque_type *) obj)->ptr; return (char *)hp; } diff --git a/include/cyclone/types.h b/include/cyclone/types.h index f659a865..5860d234 100644 --- a/include/cyclone/types.h +++ b/include/cyclone/types.h @@ -692,7 +692,9 @@ typedef cvar_type *cvar; typedef struct { gc_header_type hdr; tag_type tag; - /** This pointer can be anything, GC will not collect it */ + unsigned char collect_ptr; + /** This pointer can be anything, GC will not collect it + unless collect_ptr is set */ void *ptr; } c_opaque_type; typedef c_opaque_type *c_opaque; @@ -704,11 +706,15 @@ typedef c_opaque_type *c_opaque; var.hdr.grayed = 0; \ var.hdr.immutable = 0; \ var.tag = c_opaque_tag; \ + var.collect_ptr = 0; \ var.ptr = p; /** Access the Opaque's pointer */ #define opaque_ptr(x) (((c_opaque)x)->ptr) +/** Access the Opaque's "collect pointer" field */ +#define opaque_collect_ptr(x) (((c_opaque)x)->collect_ptr) + /** * @brief The mutex thread synchronization type * diff --git a/scheme/cyclone/common.sld b/scheme/cyclone/common.sld index a60ee443..1c5e735f 100644 --- a/scheme/cyclone/common.sld +++ b/scheme/cyclone/common.sld @@ -15,7 +15,7 @@ *version-banner* *c-file-header-comment*) (begin -(define *version-number* "0.15") +(define *version-number* "0.16") (define *version-name* "") (define *version* (string-append *version-number* " " *version-name* ""))