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