Create ecl_set_finalizer_unprotected() for situations in which a finalizer must be set with interrupts disallowed.

This commit is contained in:
Juan Jose Garcia Ripoll 2009-09-05 10:41:59 +02:00
parent ca6198d753
commit a35ba14206
2 changed files with 13 additions and 6 deletions

View file

@ -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)
}

View file

@ -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);