Commit f7fdaea4 authored by Eli Zaretskii's avatar Eli Zaretskii

A better solution for bug#29347

* src/thread.c (really_call_select): Don't try to take the global
lock if the same thread is already holding it.  (Bug#29347)
parent 86e6ed85
......@@ -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);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment