From 5fdb14cc5ea14c0dc031e9dc020bc3b3470bfa34 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 13 Jan 2025 16:44:12 +0100 Subject: [PATCH] Remove "ABORTED" atomic forwarding state It was not distinguishable from "NOT_FORWARDED". --- api/gc-forwarding.h | 3 +-- benchmarks/simple-gc-embedder.h | 9 +++++---- src/copy-space.h | 1 - src/nofl-space.h | 5 ++--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/api/gc-forwarding.h b/api/gc-forwarding.h index b598e47a1..25aca3011 100644 --- a/api/gc-forwarding.h +++ b/api/gc-forwarding.h @@ -8,8 +8,7 @@ enum gc_forwarding_state { GC_FORWARDING_STATE_FORWARDED, GC_FORWARDING_STATE_BUSY, GC_FORWARDING_STATE_ACQUIRED, - GC_FORWARDING_STATE_NOT_FORWARDED, - GC_FORWARDING_STATE_ABORTED + GC_FORWARDING_STATE_NOT_FORWARDED }; struct gc_atomic_forward { diff --git a/benchmarks/simple-gc-embedder.h b/benchmarks/simple-gc-embedder.h index d8ad3f0ad..904d2c740 100644 --- a/benchmarks/simple-gc-embedder.h +++ b/benchmarks/simple-gc-embedder.h @@ -122,9 +122,10 @@ gc_atomic_forward_retry_busy(struct gc_atomic_forward *fwd) { memory_order_acquire); if (tag == gcobj_busy) return 0; - if (tag & gcobj_not_forwarded_bit) - fwd->state = GC_FORWARDING_STATE_ABORTED; - else { + if (tag & gcobj_not_forwarded_bit) { + fwd->state = GC_FORWARDING_STATE_NOT_FORWARDED; + fwd->data = tag; + } else { fwd->state = GC_FORWARDING_STATE_FORWARDED; fwd->data = tag; } @@ -149,7 +150,7 @@ static inline void gc_atomic_forward_abort(struct gc_atomic_forward *fwd) { GC_ASSERT(fwd->state == GC_FORWARDING_STATE_ACQUIRED); atomic_store_explicit(tag_word(fwd->ref), fwd->data, memory_order_release); - fwd->state = GC_FORWARDING_STATE_ABORTED; + fwd->state = GC_FORWARDING_STATE_NOT_FORWARDED; } static inline size_t diff --git a/src/copy-space.h b/src/copy-space.h index e95ec0322..b866d0ff6 100644 --- a/src/copy-space.h +++ b/src/copy-space.h @@ -599,7 +599,6 @@ copy_space_forward_atomic(struct copy_space *space, struct gc_edge edge, switch (fwd.state) { case GC_FORWARDING_STATE_NOT_FORWARDED: - case GC_FORWARDING_STATE_ABORTED: default: // Impossible. GC_CRASH(); diff --git a/src/nofl-space.h b/src/nofl-space.h index d29b3a9bd..05759a033 100644 --- a/src/nofl-space.h +++ b/src/nofl-space.h @@ -1497,7 +1497,6 @@ nofl_space_evacuate(struct nofl_space *space, uint8_t *metadata, uint8_t byte, switch (fwd.state) { case GC_FORWARDING_STATE_NOT_FORWARDED: - case GC_FORWARDING_STATE_ABORTED: default: // Impossible. GC_CRASH(); @@ -1552,7 +1551,7 @@ nofl_space_evacuate(struct nofl_space *space, uint8_t *metadata, uint8_t byte, break; yield_for_spin(spin_count); } - if (fwd.state == GC_FORWARDING_STATE_ABORTED) + if (fwd.state == GC_FORWARDING_STATE_NOT_FORWARDED) // Remove evacuation aborted; remote will mark and enqueue. return 0; ASSERT(fwd.state == GC_FORWARDING_STATE_FORWARDED); @@ -1599,7 +1598,7 @@ nofl_space_forward_if_evacuated(struct nofl_space *space, break; yield_for_spin(spin_count); } - if (fwd.state == GC_FORWARDING_STATE_ABORTED) + if (fwd.state == GC_FORWARDING_STATE_NOT_FORWARDED) // Remote evacuation aborted; remote will mark and enqueue. return 1; ASSERT(fwd.state == GC_FORWARDING_STATE_FORWARDED);