diff --git a/src/c/alloc_2.d b/src/c/alloc_2.d index fa8bebdc7..f651bdc09 100644 --- a/src/c/alloc_2.d +++ b/src/c/alloc_2.d @@ -549,13 +549,9 @@ si_get_finalizer(cl_object o) @(return output) } -cl_object -si_set_finalizer(cl_object o, cl_object finalizer) +void +ecl_set_finalizer_unprotected(cl_object o, cl_object finalizer) { - const cl_env_ptr the_env = ecl_process_env(); - GC_finalization_proc ofn; - void *odata; - ecl_disable_interrupts_env(the_env); if (finalizer == Cnil) { GC_register_finalizer_no_order(o, (GC_finalization_proc)0, 0, &ofn, &odata); @@ -565,6 +561,16 @@ si_set_finalizer(cl_object o, cl_object finalizer) GC_register_finalizer_no_order(o, newfn, finalizer, &ofn, &odata); } +} + +cl_object +si_set_finalizer(cl_object o, cl_object finalizer) +{ + const cl_env_ptr the_env = ecl_process_env(); + GC_finalization_proc ofn; + void *odata; + ecl_disable_interrupts_env(the_env); + ecl_set_finalizer_unprotected(o, finalizer); ecl_enable_interrupts_env(the_env); @(return) } diff --git a/src/h/external.h b/src/h/external.h index a363adbf7..f9700666e 100644 --- a/src/h/external.h +++ b/src/h/external.h @@ -657,6 +657,7 @@ extern ECL_API int ecl_stream_to_handle(cl_object s, bool output); /* finalize.c */ +extern ECL_API void ecl_set_finalizer_unprotected(cl_object o, cl_object finalizer); extern ECL_API cl_object si_get_finalizer(cl_object o); extern ECL_API cl_object si_set_finalizer(cl_object o, cl_object finalizer);