File tree Expand file tree Collapse file tree 3 files changed +16
-1
lines changed Expand file tree Collapse file tree 3 files changed +16
-1
lines changed Original file line number Diff line number Diff line change @@ -681,7 +681,14 @@ static void setup_cysignals_handlers(void)
681681 sigprocmask (SIG_SETMASK , & default_sigmask , & sigmask_with_sigint );
682682#endif
683683
684- /* Install signal handlers */
684+ /* Install signal handlers. We need a separate C-level interrupt handler
685+ * apart from the Python-level interrupt handler because Python-level
686+ * interrupt handler will not be called inside Cython code.
687+ * See init_cysignals and python_check_interrupt for an explanation.
688+ * A downside is the C-level interrupt handler will be overwritten
689+ * when signal(SIGINT, getsignal(SIGINT)) is executed, in that case
690+ * init_cysignals() need to be called again.
691+ */
685692 /* Handlers for interrupt-like signals */
686693 sa .sa_handler = cysigs_interrupt_handler ;
687694 sa .sa_flags = 0 ;
Original file line number Diff line number Diff line change @@ -26,6 +26,7 @@ cdef extern from "struct_signals.h":
2626
2727 ctypedef struct cysigs_t:
2828 cy_atomic_int sig_on_count
29+ cy_atomic_int interrupt_received
2930 cy_atomic_int block_sigint
3031 const char * s
3132 PyObject* exc_value
Original file line number Diff line number Diff line change @@ -352,6 +352,13 @@ def python_check_interrupt(sig, frame):
352352 code. This simply delegates to the interrupt handling code in
353353 ``implementation.c``.
354354 """
355+ if sig_check() == 0 :
356+ return
357+ # If this line is reached, a possibility is that something called
358+ # signal(SIGINT, getsignal(SIGINT)), which cause cysigs_interrupt_handler
359+ # to not be called. We reinstall the C-level signal handler.
360+ init_cysignals()
361+ cysigs.interrupt_received = sig
355362 sig_check()
356363
357364
You can’t perform that action at this time.
0 commit comments