aboutsummaryrefslogtreecommitdiffstats
path: root/src/thread.h
diff options
context:
space:
mode:
authorEli Zaretskii2017-10-04 10:27:49 +0300
committerEli Zaretskii2017-10-04 10:27:49 +0300
commitea39d470bf35e45f1d8e39795f06ac74b3c37fc7 (patch)
tree406dbe320ffd5c9e2a31fd1b8568e119e50e9279 /src/thread.h
parentfdbaebde08f4e53e3fc06fae99398c68a4e285fb (diff)
downloademacs-ea39d470bf35e45f1d8e39795f06ac74b3c37fc7.tar.gz
emacs-ea39d470bf35e45f1d8e39795f06ac74b3c37fc7.zip
Avoid crashes on C-g when several threads wait for input
* src/thread.h (m_getcjmp): New member of 'struct thread_state'. (getcjmp): Define to current thread's 'm_getcjmp'. * src/thread.c (maybe_reacquire_global_lock): Switch to main thread, since this is called from a SIGINT handler, which always runs in the context of the main thread. * src/lisp.h (sys_jmp_buf, sys_setjmp, sys_longjmp): Move the definitions before thread.h is included, as thread.h now uses sys_jmp_buf. * src/keyboard.c (getcjmp): Remove declaration. (read_char): Don't call maybe_reacquire_global_lock here. (handle_interrupt): Call maybe_reacquire_global_lock here, if invoked from the SIGINT handler, to make sure quit_throw_to_read_char runs with main thread's Lisp bindings and uses the main thread's jmp_buf buffer. (Bug#28630)
Diffstat (limited to 'src/thread.h')
-rw-r--r--src/thread.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/thread.h b/src/thread.h
index 7fce8674f0e..cb2133d72d4 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -158,6 +158,13 @@ struct thread_state
158 bool m_waiting_for_input; 158 bool m_waiting_for_input;
159#define waiting_for_input (current_thread->m_waiting_for_input) 159#define waiting_for_input (current_thread->m_waiting_for_input)
160 160
161 /* For longjmp to where kbd input is being done. This is per-thread
162 so that if more than one thread calls read_char, they don't
163 clobber each other's getcjmp, which will cause
164 quit_throw_to_read_char crash due to using a wrong stack. */
165 sys_jmp_buf m_getcjmp;
166#define getcjmp (current_thread->m_getcjmp)
167
161 /* The OS identifier for this thread. */ 168 /* The OS identifier for this thread. */
162 sys_thread_t thread_id; 169 sys_thread_t thread_id;
163 170