1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 11:50:28 +02:00

nofl: Reclaim another mark bit if concurrent tracing is disabled

This commit is contained in:
Andy Wingo 2025-03-05 17:17:55 +01:00
parent 29cf0f40d3
commit ed5db9bc36
2 changed files with 17 additions and 9 deletions

View file

@ -33,4 +33,8 @@
#define GC_CONSERVATIVE_TRACE 0 #define GC_CONSERVATIVE_TRACE 0
#endif #endif
#ifndef GC_CONCURRENT_TRACE
#define GC_CONCURRENT_TRACE 0
#endif
#endif // GC_CONFIG_H #endif // GC_CONFIG_H

View file

@ -235,12 +235,16 @@ enum nofl_metadata_byte {
NOFL_METADATA_BYTE_NONE = 0, NOFL_METADATA_BYTE_NONE = 0,
NOFL_METADATA_BYTE_YOUNG = 1, NOFL_METADATA_BYTE_YOUNG = 1,
NOFL_METADATA_BYTE_MARK_0 = 2, NOFL_METADATA_BYTE_MARK_0 = 2,
NOFL_METADATA_BYTE_MARK_1 = 4, NOFL_METADATA_BYTE_MARK_1 = 3,
NOFL_METADATA_BYTE_MARK_2 = 8, #if GC_CONCURRENT_TRACE
NOFL_METADATA_BYTE_MARK_MASK = (NOFL_METADATA_BYTE_YOUNG | NOFL_METADATA_BYTE_MARK_2 = 4,
NOFL_METADATA_BYTE_MARK_0 | NOFL_METADATA_BYTE_MARK_MASK = 7,
NOFL_METADATA_BYTE_MARK_1 | /* NOFL_METADATA_BYTE_UNUSED_0 = 8, */
NOFL_METADATA_BYTE_MARK_2), #else
NOFL_METADATA_BYTE_MARK_MASK = 3,
/* NOFL_METADATA_BYTE_UNUSED_0 = 4, */
/* NOFL_METADATA_BYTE_UNUSED_1 = 8, */
#endif
NOFL_METADATA_BYTE_END = 16, NOFL_METADATA_BYTE_END = 16,
NOFL_METADATA_BYTE_PINNED = 32, NOFL_METADATA_BYTE_PINNED = 32,
NOFL_METADATA_BYTE_LOGGED_0 = 64, NOFL_METADATA_BYTE_LOGGED_0 = 64,
@ -254,8 +258,10 @@ nofl_advance_current_mark(uint8_t mark) {
case NOFL_METADATA_BYTE_MARK_0: case NOFL_METADATA_BYTE_MARK_0:
return NOFL_METADATA_BYTE_MARK_1; return NOFL_METADATA_BYTE_MARK_1;
case NOFL_METADATA_BYTE_MARK_1: case NOFL_METADATA_BYTE_MARK_1:
#if GC_CONCURRENT_TRACE
return NOFL_METADATA_BYTE_MARK_2; return NOFL_METADATA_BYTE_MARK_2;
case NOFL_METADATA_BYTE_MARK_2: case NOFL_METADATA_BYTE_MARK_2:
#endif
return NOFL_METADATA_BYTE_MARK_0; return NOFL_METADATA_BYTE_MARK_0;
default: default:
GC_CRASH(); GC_CRASH();
@ -955,10 +961,8 @@ nofl_space_contains_edge(struct nofl_space *space, struct gc_edge edge) {
static inline int static inline int
nofl_space_is_survivor(struct nofl_space *space, struct gc_ref ref) { nofl_space_is_survivor(struct nofl_space *space, struct gc_ref ref) {
uint8_t *metadata = nofl_metadata_byte_for_object(ref); uint8_t *metadata = nofl_metadata_byte_for_object(ref);
uint8_t mask = NOFL_METADATA_BYTE_MARK_0
| NOFL_METADATA_BYTE_MARK_1 | NOFL_METADATA_BYTE_MARK_2;
uint8_t byte = atomic_load_explicit(metadata, memory_order_relaxed); uint8_t byte = atomic_load_explicit(metadata, memory_order_relaxed);
return byte & mask; return nofl_metadata_byte_has_mark(byte, space->survivor_mark);
} }
static uint8_t* static uint8_t*