mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-03 18:50:19 +02:00
gc_extern_space_visit doesn't take an edge
The whole extern space interface is a bit wonky but for now let's assume that external objects can't move and therefore we don't need the edge.
This commit is contained in:
parent
8b9fe196a1
commit
0277953efc
5 changed files with 7 additions and 10 deletions
|
@ -22,7 +22,6 @@ GC_EMBEDDER_API inline int gc_is_valid_conservative_ref_displacement(uintptr_t d
|
||||||
GC_EMBEDDER_API inline size_t gc_finalizer_priority_count(void);
|
GC_EMBEDDER_API inline size_t gc_finalizer_priority_count(void);
|
||||||
|
|
||||||
GC_EMBEDDER_API inline int gc_extern_space_visit(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);
|
||||||
|
|
|
@ -23,7 +23,6 @@ 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_visit(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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ do_trace(struct gc_heap *heap, struct gc_edge edge, struct gc_ref ref,
|
||||||
else if (large_object_space_contains_with_lock(heap_large_object_space(heap), ref))
|
else if (large_object_space_contains_with_lock(heap_large_object_space(heap), ref))
|
||||||
return large_object_space_mark(heap_large_object_space(heap), ref);
|
return large_object_space_mark(heap_large_object_space(heap), ref);
|
||||||
else
|
else
|
||||||
return gc_extern_space_visit(heap_extern_space(heap), edge, ref);
|
return gc_extern_space_visit(heap_extern_space(heap), ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
|
@ -422,7 +422,7 @@ static inline int do_trace(struct gc_heap *heap, struct gc_edge edge,
|
||||||
if (large_object_space_contains_with_lock(heap_large_object_space(heap), ref))
|
if (large_object_space_contains_with_lock(heap_large_object_space(heap), ref))
|
||||||
return large_object_space_mark(heap_large_object_space(heap), ref);
|
return large_object_space_mark(heap_large_object_space(heap), ref);
|
||||||
else
|
else
|
||||||
return gc_extern_space_visit(heap_extern_space(heap), edge, ref);
|
return gc_extern_space_visit(heap_extern_space(heap), 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,
|
||||||
|
|
11
src/semi.c
11
src/semi.c
|
@ -236,13 +236,12 @@ 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_edge edge,
|
struct gc_ref ref) {
|
||||||
struct gc_ref old_ref) {
|
if (gc_extern_space_visit(space, 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(old_ref, heap);
|
gc_resolve_pending_ephemerons(ref, heap);
|
||||||
|
|
||||||
gc_trace_object(gc_edge_ref(edge), trace, heap, NULL, NULL);
|
gc_trace_object(ref, trace, heap, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +255,7 @@ static void visit(struct gc_edge edge, struct gc_heap *heap) {
|
||||||
ref))
|
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, edge, ref);
|
visit_external_object(heap, heap->extern_space, ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gc_pending_ephemerons *
|
struct gc_pending_ephemerons *
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue