1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 12:20:26 +02:00

Update extern space API to allow for evacuation

This commit is contained in:
Andy Wingo 2023-08-16 11:08:12 +02:00
parent fbe49598f5
commit db36c48efd
4 changed files with 13 additions and 10 deletions

View file

@ -21,7 +21,8 @@ struct gc_extern_space;
GC_EMBEDDER_API inline int gc_is_valid_conservative_ref_displacement(uintptr_t displacement); GC_EMBEDDER_API inline int gc_is_valid_conservative_ref_displacement(uintptr_t displacement);
GC_EMBEDDER_API inline int gc_extern_space_mark(struct gc_extern_space *space, GC_EMBEDDER_API inline int gc_extern_space_visit(struct gc_extern_space *space,
struct gc_edge edge,
struct gc_ref ref) GC_ALWAYS_INLINE; struct gc_ref ref) GC_ALWAYS_INLINE;
GC_EMBEDDER_API inline void gc_extern_space_start_gc(struct gc_extern_space *space, GC_EMBEDDER_API inline void gc_extern_space_start_gc(struct gc_extern_space *space,
int is_minor_gc); int is_minor_gc);

View file

@ -19,7 +19,8 @@ gc_is_valid_conservative_ref_displacement(uintptr_t displacement) {
} }
// No external objects in simple benchmarks. // No external objects in simple benchmarks.
static inline int gc_extern_space_mark(struct gc_extern_space *space, static inline int gc_extern_space_visit(struct gc_extern_space *space,
struct gc_edge edge,
struct gc_ref ref) { struct gc_ref ref) {
GC_CRASH(); GC_CRASH();
} }

View file

@ -199,12 +199,13 @@ static int semi_space_contains(struct semi_space *space, struct gc_ref ref) {
static void visit_external_object(struct gc_heap *heap, static void visit_external_object(struct gc_heap *heap,
struct gc_extern_space *space, struct gc_extern_space *space,
struct gc_ref ref) { struct gc_edge edge,
if (gc_extern_space_mark(space, ref)) { struct gc_ref old_ref) {
if (gc_extern_space_visit(space, edge, old_ref)) {
if (GC_UNLIKELY(heap->check_pending_ephemerons)) if (GC_UNLIKELY(heap->check_pending_ephemerons))
gc_resolve_pending_ephemerons(ref, heap); gc_resolve_pending_ephemerons(old_ref, heap);
gc_trace_object(ref, trace, heap, NULL, NULL); gc_trace_object(gc_edge_ref(edge), trace, heap, NULL, NULL);
} }
} }
@ -217,7 +218,7 @@ static void visit(struct gc_edge edge, struct gc_heap *heap) {
else if (large_object_space_contains(heap_large_object_space(heap), ref)) else if (large_object_space_contains(heap_large_object_space(heap), ref))
visit_large_object_space(heap, heap_large_object_space(heap), ref); visit_large_object_space(heap, heap_large_object_space(heap), ref);
else else
visit_external_object(heap, heap->extern_space, ref); visit_external_object(heap, heap->extern_space, edge, ref);
} }
struct gc_pending_ephemerons * struct gc_pending_ephemerons *

View file

@ -671,7 +671,7 @@ static inline int do_trace(struct gc_heap *heap, struct gc_edge edge,
return large_object_space_mark_object(heap_large_object_space(heap), return large_object_space_mark_object(heap_large_object_space(heap),
ref); ref);
else else
return gc_extern_space_mark(heap_extern_space(heap), ref); return gc_extern_space_visit(heap_extern_space(heap), edge, ref);
} }
static inline int trace_edge(struct gc_heap *heap, struct gc_edge edge) { static inline int trace_edge(struct gc_heap *heap, struct gc_edge edge) {