diff --git a/api/gc-api.h b/api/gc-api.h index e34e0d57e..502a6abe2 100644 --- a/api/gc-api.h +++ b/api/gc-api.h @@ -301,4 +301,17 @@ static inline void gc_safepoint(struct gc_mutator *mut) { gc_safepoint_slow(mut); } +GC_API_ void gc_safepoint_signal_inhibit(struct gc_mutator *mut); +GC_API_ void gc_safepoint_signal_reallow(struct gc_mutator *mut); + +static inline void gc_inhibit_preemption(struct gc_mutator *mut) { + if (gc_safepoint_mechanism() == GC_SAFEPOINT_MECHANISM_SIGNAL) + gc_safepoint_signal_inhibit(mut); +} + +static inline void gc_reallow_preemption(struct gc_mutator *mut) { + if (gc_safepoint_mechanism() == GC_SAFEPOINT_MECHANISM_SIGNAL) + gc_safepoint_signal_reallow(mut); +} + #endif // GC_API_H_ diff --git a/src/bdw.c b/src/bdw.c index e6b3f4ef5..e9268ef81 100644 --- a/src/bdw.c +++ b/src/bdw.c @@ -203,6 +203,13 @@ void gc_write_barrier_slow(struct gc_mutator *mut, struct gc_ref obj, int* gc_safepoint_flag_loc(struct gc_mutator *mut) { GC_CRASH(); } void gc_safepoint_slow(struct gc_mutator *mut) { GC_CRASH(); } +void gc_safepoint_signal_inhibit(struct gc_mutator *mut) { + GC_alloc_lock(); +} +void gc_safepoint_signal_reallow(struct gc_mutator *mut) { + GC_alloc_unlock(); +} + struct bdw_mark_state { struct GC_ms_entry *mark_stack_ptr; struct GC_ms_entry *mark_stack_limit; diff --git a/src/mmc.c b/src/mmc.c index 1ae342f5e..f67621b93 100644 --- a/src/mmc.c +++ b/src/mmc.c @@ -869,6 +869,9 @@ gc_safepoint_slow(struct gc_mutator *mut) { heap_unlock(heap); } +void gc_safepoint_signal_inhibit(struct gc_mutator *mut) { GC_CRASH(); } +void gc_safepoint_signal_reallow(struct gc_mutator *mut) { GC_CRASH(); } + static enum gc_trace_kind compute_trace_kind(enum gc_allocation_kind kind) { if (GC_CONSERVATIVE_TRACE) { diff --git a/src/pcc.c b/src/pcc.c index 6b656360c..bda42730b 100644 --- a/src/pcc.c +++ b/src/pcc.c @@ -1081,6 +1081,9 @@ void gc_safepoint_slow(struct gc_mutator *mut) { heap_unlock(heap); } +void gc_safepoint_signal_inhibit(struct gc_mutator *mut) { GC_CRASH(); } +void gc_safepoint_signal_reallow(struct gc_mutator *mut) { GC_CRASH(); } + struct gc_ephemeron* gc_allocate_ephemeron(struct gc_mutator *mut) { return gc_allocate(mut, gc_ephemeron_size(), GC_ALLOCATION_TAGGED); } diff --git a/src/semi.c b/src/semi.c index 9754b3fa2..41c78a178 100644 --- a/src/semi.c +++ b/src/semi.c @@ -487,6 +487,8 @@ void gc_write_barrier_slow(struct gc_mutator *mut, struct gc_ref obj, int* gc_safepoint_flag_loc(struct gc_mutator *mut) { GC_CRASH(); } void gc_safepoint_slow(struct gc_mutator *mut) { GC_CRASH(); } +void gc_safepoint_signal_inhibit(struct gc_mutator *mut) { GC_CRASH(); } +void gc_safepoint_signal_reallow(struct gc_mutator *mut) { GC_CRASH(); } static int collect_for_large_alloc(struct gc_mutator *mut, size_t npages) { size_t bytes = npages * mutator_semi_space(mut)->page_size;