mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-11 00:00:49 +02:00
Allow large object space to be part of remembered set
This commit is contained in:
parent
d0b8f6838d
commit
e270290242
13 changed files with 135 additions and 25 deletions
18
gc-api.h
18
gc-api.h
|
@ -177,18 +177,30 @@ static inline void gc_small_write_barrier(struct gc_ref obj, struct gc_edge edge
|
|||
struct gc_ref new_val) GC_ALWAYS_INLINE;
|
||||
static inline void gc_small_write_barrier(struct gc_ref obj, struct gc_edge edge,
|
||||
struct gc_ref new_val) {
|
||||
switch (gc_small_write_barrier_kind()) {
|
||||
}
|
||||
|
||||
GC_API_ void gc_write_barrier_extern(struct gc_ref obj, size_t obj_size,
|
||||
struct gc_edge edge, struct gc_ref new_val) GC_NEVER_INLINE;
|
||||
|
||||
static inline void gc_write_barrier(struct gc_ref obj, size_t obj_size,
|
||||
struct gc_edge edge, struct gc_ref new_val) GC_ALWAYS_INLINE;
|
||||
static inline void gc_write_barrier(struct gc_ref obj, size_t obj_size,
|
||||
struct gc_edge edge, struct gc_ref new_val) {
|
||||
switch (gc_write_barrier_kind(obj_size)) {
|
||||
case GC_WRITE_BARRIER_NONE:
|
||||
return;
|
||||
case GC_WRITE_BARRIER_CARD: {
|
||||
size_t card_table_alignment = gc_small_write_barrier_card_table_alignment();
|
||||
size_t card_size = gc_small_write_barrier_card_size();
|
||||
size_t card_table_alignment = gc_write_barrier_card_table_alignment();
|
||||
size_t card_size = gc_write_barrier_card_size();
|
||||
uintptr_t addr = gc_ref_value(obj);
|
||||
uintptr_t base = addr & ~(card_table_alignment - 1);
|
||||
uintptr_t card = (addr & (card_table_alignment - 1)) / card_size;
|
||||
atomic_store_explicit((uint8_t*)(base + card), 1, memory_order_relaxed);
|
||||
return;
|
||||
}
|
||||
case GC_WRITE_BARRIER_EXTERN:
|
||||
gc_write_barrier_extern(obj, obj_size, edge, new_val);
|
||||
return;
|
||||
default:
|
||||
GC_CRASH();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue