]> git.eshelyaron.com Git - emacs.git/commitdiff
A better solution for bug#29347
authorEli Zaretskii <eliz@gnu.org>
Fri, 24 Nov 2017 21:37:42 +0000 (23:37 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 24 Nov 2017 21:37:42 +0000 (23:37 +0200)
* src/thread.c (really_call_select): Don't try to take the global
lock if the same thread is already holding it.  (Bug#29347)

src/thread.c

index 9e799ce47d45c729902ea042d2411f3f76034f9e..dd466818ef994891effc0be96f6142fe96ba286f 100644 (file)
@@ -97,12 +97,7 @@ post_acquire_global_lock (struct thread_state *self)
 static void
 acquire_global_lock (struct thread_state *self)
 {
-  /* If some Lisp was interrupted by C-g while inside pselect, the
-     signal handler could have called maybe_reacquire_global_lock, in
-     which case we are already holding the lock and shouldn't try
-     taking it again, or else we will hang forever.  */
-  if (!(self && !self->not_holding_lock))
-    sys_mutex_lock (&global_lock);
+  sys_mutex_lock (&global_lock);
   post_acquire_global_lock (self);
 }
 
@@ -578,8 +573,15 @@ really_call_select (void *arg)
                           sa->timeout, sa->sigmask);
 
   block_interrupt_signal (&oldset);
-  acquire_global_lock (self);
-  self->not_holding_lock = 0;
+  /* If we were interrupted by C-g while inside sa->func above, the
+     signal handler could have called maybe_reacquire_global_lock, in
+     which case we are already holding the lock and shouldn't try
+     taking it again, or else we will hang forever.  */
+  if (self->not_holding_lock)
+    {
+      acquire_global_lock (self);
+      self->not_holding_lock = 0;
+    }
   restore_signal_mask (&oldset);
 }