diff --git a/api/gc-api.h b/api/gc-api.h index 01ad113a8..3de4272e3 100644 --- a/api/gc-api.h +++ b/api/gc-api.h @@ -53,12 +53,14 @@ GC_API_ void gc_heap_set_extern_space(struct gc_heap *heap, GC_API_ struct gc_mutator* gc_init_for_thread(struct gc_stack_addr base, struct gc_heap *heap); GC_API_ void gc_finish_for_thread(struct gc_mutator *mut); +GC_API_ void gc_deactivate(struct gc_mutator *mut); +GC_API_ void gc_reactivate(struct gc_mutator *mut); GC_API_ void* gc_deactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator*, void*), - void *data) GC_NEVER_INLINE; + void *data); GC_API_ void* gc_reactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator*, void*), - void *data) GC_NEVER_INLINE; + void *data); GC_API_ void gc_collect(struct gc_mutator *mut, enum gc_collection_kind requested_kind); diff --git a/src/bdw.c b/src/bdw.c index c6e2b4341..da63d7ef5 100644 --- a/src/bdw.c +++ b/src/bdw.c @@ -668,6 +668,9 @@ static void* call_with_mutator (void *p) { return data->proc(data->mutator, data->data); } +void gc_deactivate(struct gc_mutator *mut) {}; +void gc_reactivate(struct gc_mutator *mut) {}; + void* gc_deactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator *, void*), void *data) { diff --git a/src/mmc.c b/src/mmc.c index a1329e239..26e3e0652 100644 --- a/src/mmc.c +++ b/src/mmc.c @@ -1297,6 +1297,16 @@ reactivate_mutator(struct gc_heap *heap, struct gc_mutator *mut) { heap_unlock(heap); } +void gc_deactivate(struct gc_mutator *mut) { + GC_ASSERT(mut->active); + deactivate_mutator(mutator_heap(mut), mut); +} + +void gc_reactivate(struct gc_mutator *mut) { + GC_ASSERT(!mut->active); + reactivate_mutator(mutator_heap(mut), mut); +} + void* gc_deactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator*, void*), diff --git a/src/pcc.c b/src/pcc.c index 609160a15..5e3f459c0 100644 --- a/src/pcc.c +++ b/src/pcc.c @@ -1383,6 +1383,16 @@ static void reactivate_mutator(struct gc_heap *heap, struct gc_mutator *mut) { heap_unlock(heap); } +void gc_deactivate(struct gc_mutator *mut) { + GC_ASSERT(mut->active); + deactivate_mutator(mutator_heap(mut), mut); +} + +void gc_reactivate(struct gc_mutator *mut) { + GC_ASSERT(!mut->active); + reactivate_mutator(mutator_heap(mut), mut); +} + void* gc_deactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator*, void*), void *data) { diff --git a/src/semi.c b/src/semi.c index 913c983c1..cc8eacb50 100644 --- a/src/semi.c +++ b/src/semi.c @@ -763,6 +763,10 @@ struct gc_mutator* gc_init_for_thread(struct gc_stack_addr base, void gc_finish_for_thread(struct gc_mutator *space) { } +void gc_deactivate(struct gc_mutator *mut) {} + +void gc_reactivate(struct gc_mutator *mut) {} + void* gc_deactivate_for_call(struct gc_mutator *mut, void* (*f)(struct gc_mutator *, void*), void *data) {