Allow optional collection of opaque pointers

This commit is contained in:
Justin Ethier 2020-03-05 13:26:17 -05:00
parent 236c7e84f4
commit 479e880b30
4 changed files with 20 additions and 2 deletions

View file

@ -1,5 +1,11 @@
# Changelog # 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 ## 0.15 - February 26, 2020
Features Features

6
gc.c
View file

@ -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"); fprintf(stderr, "mp_clear from sweep\n");
#endif #endif
mp_clear(&(((bignum_type *)p)->bn)); 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 // Free block
@ -956,6 +961,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
mark(hp) = thd->gc_alloc_color; mark(hp) = thd->gc_alloc_color;
immutable(hp) = immutable(obj); immutable(hp) = immutable(obj);
type_of(hp) = c_opaque_tag; type_of(hp) = c_opaque_tag;
hp->collect_ptr = ((c_opaque_type *) obj)->collect_ptr;
hp->ptr = ((c_opaque_type *) obj)->ptr; hp->ptr = ((c_opaque_type *) obj)->ptr;
return (char *)hp; return (char *)hp;
} }

View file

@ -692,7 +692,9 @@ typedef cvar_type *cvar;
typedef struct { typedef struct {
gc_header_type hdr; gc_header_type hdr;
tag_type tag; 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; void *ptr;
} c_opaque_type; } c_opaque_type;
typedef c_opaque_type *c_opaque; typedef c_opaque_type *c_opaque;
@ -704,11 +706,15 @@ typedef c_opaque_type *c_opaque;
var.hdr.grayed = 0; \ var.hdr.grayed = 0; \
var.hdr.immutable = 0; \ var.hdr.immutable = 0; \
var.tag = c_opaque_tag; \ var.tag = c_opaque_tag; \
var.collect_ptr = 0; \
var.ptr = p; var.ptr = p;
/** Access the Opaque's pointer */ /** Access the Opaque's pointer */
#define opaque_ptr(x) (((c_opaque)x)->ptr) #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 * @brief The mutex thread synchronization type
* *

View file

@ -15,7 +15,7 @@
*version-banner* *version-banner*
*c-file-header-comment*) *c-file-header-comment*)
(begin (begin
(define *version-number* "0.15") (define *version-number* "0.16")
(define *version-name* "") (define *version-name* "")
(define *version* (string-append *version-number* " " *version-name* "")) (define *version* (string-append *version-number* " " *version-name* ""))