mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-07-04 16:50:25 +02:00
Nofl space doesn't track ephemerons
Instead, we rely on ephemerons being traced precisely, and thus having a tag word.
This commit is contained in:
parent
b874ad5da6
commit
6aa6f3a257
3 changed files with 3 additions and 25 deletions
|
@ -31,8 +31,7 @@ static inline int gc_has_conservative_roots(void) {
|
|||
enum gc_trace_kind {
|
||||
GC_TRACE_PRECISELY,
|
||||
GC_TRACE_NONE,
|
||||
GC_TRACE_CONSERVATIVELY,
|
||||
GC_TRACE_EPHEMERON,
|
||||
GC_TRACE_CONSERVATIVELY
|
||||
};
|
||||
|
||||
struct gc_trace_plan {
|
||||
|
|
10
src/mmc.c
10
src/mmc.c
|
@ -435,10 +435,6 @@ trace_one(struct gc_ref ref, struct gc_heap *heap,
|
|||
heap, worker);
|
||||
break;
|
||||
}
|
||||
case GC_TRACE_EPHEMERON:
|
||||
gc_trace_ephemeron(gc_ref_heap_object(ref), tracer_visit, heap,
|
||||
worker);
|
||||
break;
|
||||
default:
|
||||
GC_CRASH();
|
||||
}
|
||||
|
@ -1154,11 +1150,7 @@ gc_write_barrier_slow(struct gc_mutator *mut, struct gc_ref obj,
|
|||
|
||||
struct gc_ephemeron*
|
||||
gc_allocate_ephemeron(struct gc_mutator *mut) {
|
||||
struct gc_ref ret =
|
||||
gc_ref_from_heap_object(gc_allocate(mut, gc_ephemeron_size(),
|
||||
GC_ALLOCATION_TAGGED));
|
||||
nofl_space_set_ephemeron_flag(ret);
|
||||
return gc_ref_heap_object(ret);
|
||||
return gc_allocate (mut, gc_ephemeron_size(), GC_ALLOCATION_TAGGED);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -250,7 +250,7 @@ enum nofl_metadata_byte {
|
|||
NOFL_METADATA_BYTE_TRACE_PRECISELY = 0,
|
||||
NOFL_METADATA_BYTE_TRACE_NONE = 8,
|
||||
NOFL_METADATA_BYTE_TRACE_CONSERVATIVELY = 16,
|
||||
NOFL_METADATA_BYTE_TRACE_EPHEMERON = 24,
|
||||
NOFL_METADATA_BYTE_TRACE_UNUSED = 24,
|
||||
NOFL_METADATA_BYTE_TRACE_KIND_MASK = 0|8|16|24,
|
||||
NOFL_METADATA_BYTE_PINNED = 16,
|
||||
NOFL_METADATA_BYTE_END = 32,
|
||||
|
@ -971,15 +971,6 @@ nofl_finish_sweeping(struct nofl_allocator *alloc,
|
|||
while (nofl_allocator_next_hole(alloc, space, 0)) {}
|
||||
}
|
||||
|
||||
static void
|
||||
nofl_space_set_ephemeron_flag(struct gc_ref ref) {
|
||||
if (gc_has_conservative_intraheap_edges()) {
|
||||
uint8_t *metadata = nofl_metadata_byte_for_object(ref);
|
||||
uint8_t byte = *metadata & ~NOFL_METADATA_BYTE_TRACE_KIND_MASK;
|
||||
*metadata = byte | NOFL_METADATA_BYTE_TRACE_EPHEMERON;
|
||||
}
|
||||
}
|
||||
|
||||
struct gc_trace_worker;
|
||||
|
||||
static inline int
|
||||
|
@ -1821,8 +1812,6 @@ nofl_metadata_byte_trace_kind(uint8_t byte)
|
|||
#if GC_CONSERVATIVE_TRACE
|
||||
case NOFL_METADATA_BYTE_TRACE_CONSERVATIVELY:
|
||||
return GC_TRACE_CONSERVATIVELY;
|
||||
case NOFL_METADATA_BYTE_TRACE_EPHEMERON:
|
||||
return GC_TRACE_EPHEMERON;
|
||||
#endif
|
||||
default:
|
||||
GC_CRASH();
|
||||
|
@ -1842,8 +1831,6 @@ nofl_space_object_trace_plan(struct nofl_space *space, struct gc_ref ref) {
|
|||
size_t granules = nofl_space_live_object_granules(loc);
|
||||
return (struct gc_trace_plan){ kind, granules * NOFL_GRANULE_SIZE };
|
||||
}
|
||||
case GC_TRACE_EPHEMERON:
|
||||
return (struct gc_trace_plan){ kind, };
|
||||
#endif
|
||||
default:
|
||||
GC_CRASH();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue