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:
parent
29cf0f40d3
commit
ed5db9bc36
2 changed files with 17 additions and 9 deletions
|
@ -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
|
||||||
|
|
|
@ -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*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue