diff --git a/src/object.c b/src/object.c index b9486033e4c7d848ea6fd9680ce6ce6370347c67..c19ba92209b0fe94be00baee46a28d1aacbc0fa0 100644 --- a/src/object.c +++ b/src/object.c @@ -792,6 +792,14 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason struct program *p; struct pike_frame *pike_frame=0; int frame_pushed = 0, destroy_called = 0; + int inhibit_mask = ~THREAD_FLAG_INHIBIT | + (Pike_interpreter.thread_state? + (Pike_interpreter.thread_state->flags & THREAD_FLAG_INHIBIT):0); + + if (Pike_interpreter.thread_state) { + /* Make sure we don't exit due to signals before we're done. */ + Pike_interpreter.thread_state->flags |= THREAD_FLAG_INHIBIT; + } #ifdef PIKE_DEBUG ONERROR uwp; @@ -822,13 +830,15 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason #ifdef PIKE_DEBUG UNSET_ONERROR(uwp); #endif + if (Pike_interpreter.thread_state) { + Pike_interpreter.thread_state->flags &= inhibit_mask; + } return; } add_ref( o ); if( object_has_destroy( o ) ) { call_destroy(o, reason); - destroy_called = 1; /* destructed in destroy() */ if(!(p=o->prog)) { @@ -836,8 +846,12 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason #ifdef PIKE_DEBUG UNSET_ONERROR(uwp); #endif + if (Pike_interpreter.thread_state) { + Pike_interpreter.thread_state->flags &= inhibit_mask; + } return; } + destroy_called = 1; get_destroy_called_mark(o)->p=p; } else if ((p->flags & (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) == (PROGRAM_HAS_C_METHODS|PROGRAM_NEEDS_PARENT)) { @@ -943,6 +957,9 @@ PMOD_EXPORT void destruct_object (struct object *o, enum object_destruct_reason if( destroy_called ) remove_destroy_called_mark(o); + if (Pike_interpreter.thread_state) { + Pike_interpreter.thread_state->flags &= inhibit_mask; + } #ifdef PIKE_DEBUG UNSET_ONERROR(uwp); #endif