summaryrefslogtreecommitdiff
path: root/src/thread.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2017-11-24 18:13:57 +0200
committerEli Zaretskii <eliz@gnu.org>2017-11-24 18:13:57 +0200
commitf3008520376a5d0fe3aa13bc5fa7a103e1623055 (patch)
treece14870a6cd5ae7ab8a8b10bb6ce8b8ee474be41 /src/thread.c
parentd7fc719ff17f67fe75338118288ef6e3b1efa9d0 (diff)
downloademacs-f3008520376a5d0fe3aa13bc5fa7a103e1623055.tar.gz
Avoid a hang after C-g while sit-for on a Unix TTY
* src/thread.c (acquire_global_lock): Don't try to take the global lock if the same thread is already holding it. (Bug#29347)
Diffstat (limited to 'src/thread.c')
-rw-r--r--src/thread.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/thread.c b/src/thread.c
index c03cdda0fae..1ded8f55f50 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -97,7 +97,12 @@ post_acquire_global_lock (struct thread_state *self)
static void
acquire_global_lock (struct thread_state *self)
{
- sys_mutex_lock (&global_lock);
+ /* 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);
post_acquire_global_lock (self);
}