From af0e2b1a5afd29738f278514cc526236205650ae Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 30 Mar 2022 14:50:30 -0700 Subject: [PATCH 01/22] bpo-47176 Interrupt handling for wasm32-emscripten builds without pthreads --- Modules/signalmodule.c | 31 +++++++++++++++++++++++++++++++ Python/ceval.c | 23 ++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 9566263a0dd87e..1b35e79ffb6322 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1792,11 +1792,42 @@ PyErr_CheckSignals(void) return _PyErr_CheckSignalsTstate(tstate); } +#if defined(__EMSCRIPTEN__) + +#include +EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { + if(!Module.Py_EmscriptenSignalBuffer){ + return 0; + } + let result = Module.Py_EmscriptenSignalBuffer[0]; + Module.Py_EmscriptenSignalBuffer[0] = 0; + return result; +}); + +void +_Py_CheckEmscriptenSignals(void) +{ + int signal = _Py_CheckEmscriptenSignals_Helper(); + if (signal) { + PyErr_SetInterruptEx(signal); + } +} + + +int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; + +#endif /* Declared in cpython/pyerrors.h */ int _PyErr_CheckSignalsTstate(PyThreadState *tstate) { + #if defined(__EMSCRIPTEN__) + if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { + _Py_CheckEmscriptenSignals(); + } + #endif + if (!_Py_atomic_load(&is_tripped)) { return 0; } diff --git a/Python/ceval.c b/Python/ceval.c index a7b377724bb548..0bc1d66097d92b 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1117,7 +1117,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) return _PyEval_EvalFrame(tstate, f->f_frame, throwflag); } - /* Handle signals, pending calls, GIL drop request and asynchronous exception */ static int @@ -1292,11 +1291,33 @@ eval_frame_handle_pending(PyThreadState *tstate) } #define CHECK_EVAL_BREAKER() \ + CHECK_EMSCRIPTEN_SIGNALS(); \ if (_Py_atomic_load_relaxed(eval_breaker)) { \ goto handle_eval_breaker; \ } +#if defined(__EMSCRIPTEN__) +extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; +void _Py_CheckEmscriptenSignals(void); + +static int +emscripten_signal_clock = 50; + +static void +CHECK_EMSCRIPTEN_SIGNALS() +{ + emscripten_signal_clock--; + if (emscripten_signal_clock == 0) { + emscripten_signal_clock = 50; + _Py_CheckEmscriptenSignals(); + } +} +#else +#define CHECK_EMSCRIPTEN_SIGNALS() +#endif + + /* Tuple access macros */ #ifndef Py_DEBUG From 6215fc69e1aec8fb8a713e05dbc53d5731e622f9 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:08:46 -0700 Subject: [PATCH 02/22] Apply suggestions from code review Co-authored-by: Christian Heimes --- Modules/signalmodule.c | 4 ++-- Python/ceval.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 1b35e79ffb6322..845320482e8c59 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1822,11 +1822,11 @@ int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; int _PyErr_CheckSignalsTstate(PyThreadState *tstate) { - #if defined(__EMSCRIPTEN__) +#if defined(__EMSCRIPTEN__) if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { _Py_CheckEmscriptenSignals(); } - #endif +#endif if (!_Py_atomic_load(&is_tripped)) { return 0; diff --git a/Python/ceval.c b/Python/ceval.c index 0bc1d66097d92b..12304ae3cea98c 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1301,15 +1301,15 @@ eval_frame_handle_pending(PyThreadState *tstate) extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; void _Py_CheckEmscriptenSignals(void); -static int -emscripten_signal_clock = 50; +#define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 +static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; static void CHECK_EMSCRIPTEN_SIGNALS() { emscripten_signal_clock--; if (emscripten_signal_clock == 0) { - emscripten_signal_clock = 50; + emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; _Py_CheckEmscriptenSignals(); } } From baf7b172b0377eee91afd21616219e4d9a80e23d Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:33:53 -0700 Subject: [PATCH 03/22] Use EMSCRIPTEN_KEEP_ALIVE in Py_EMSCRIPTEN_SIGNAL_HANDLING, be a bit more conservative with errors in CheckEmscriptenSignals --- Modules/signalmodule.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 845320482e8c59..2c82683f992951 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1794,14 +1794,28 @@ PyErr_CheckSignals(void) #if defined(__EMSCRIPTEN__) +// To enable signal handling, the embedder should: +// 1. set Module.Py_EmscriptenSignalBuffer = some_shared_array_buffer; +// 2. set the Py_EMSCRIPTEN_SIGNAL_HANDLING flag to 1 as follows: +// Module.HEAP8[Module._Py_EMSCRIPTEN_SIGNAL_HANDLING] = 1 +// +// The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as +// Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. #include EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { if(!Module.Py_EmscriptenSignalBuffer){ return 0; } - let result = Module.Py_EmscriptenSignalBuffer[0]; - Module.Py_EmscriptenSignalBuffer[0] = 0; - return result; + try { + let result = Module.Py_EmscriptenSignalBuffer[0]; + Module.Py_EmscriptenSignalBuffer[0] = 0; + return result; + } catch(e){ + #if !defined(NDEBUG) + console.warn("Error occurred while trying to read signal buffer:", e); + #endif + return 0; + } }); void @@ -1813,8 +1827,7 @@ _Py_CheckEmscriptenSignals(void) } } - -int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; +EMSCRIPTEN_KEEP_ALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; #endif From d7282ebde94064bfb00b12151272c7207d467a7a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:39:21 -0700 Subject: [PATCH 04/22] Formatting fixes --- Modules/signalmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 2c82683f992951..41cb01e9446d4e 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1803,14 +1803,14 @@ PyErr_CheckSignals(void) // Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. #include EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { - if(!Module.Py_EmscriptenSignalBuffer){ + if (!Module.Py_EmscriptenSignalBuffer) { return 0; } try { let result = Module.Py_EmscriptenSignalBuffer[0]; Module.Py_EmscriptenSignalBuffer[0] = 0; return result; - } catch(e){ + } catch(e) { #if !defined(NDEBUG) console.warn("Error occurred while trying to read signal buffer:", e); #endif From bb150f312459f49b1da574ed0eb6a0f8a7b99ee3 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:41:00 -0700 Subject: [PATCH 05/22] More formatting fixes --- Modules/signalmodule.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 41cb01e9446d4e..f5439543e3d394 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1811,9 +1811,9 @@ EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { Module.Py_EmscriptenSignalBuffer[0] = 0; return result; } catch(e) { - #if !defined(NDEBUG) - console.warn("Error occurred while trying to read signal buffer:", e); - #endif +#if !defined(NDEBUG) + console.warn("Error occurred while trying to read signal buffer:", e); +#endif return 0; } }); From cee2677e91a5e4dad2375d0ad12d8f1514030e7d Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:42:46 -0700 Subject: [PATCH 06/22] More formatting --- Python/ceval.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/ceval.c b/Python/ceval.c index 12304ae3cea98c..ac806bc6a8313f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1117,6 +1117,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) return _PyEval_EvalFrame(tstate, f->f_frame, throwflag); } + /* Handle signals, pending calls, GIL drop request and asynchronous exception */ static int From 4e7d87f53b97a25cd69e131427bedc25994ad6f2 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:45:39 -0700 Subject: [PATCH 07/22] Add comment to #endif --- Modules/signalmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index f5439543e3d394..fd985a1b00208b 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1829,7 +1829,7 @@ _Py_CheckEmscriptenSignals(void) EMSCRIPTEN_KEEP_ALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; -#endif +#endif // defined(__EMSCRIPTEN__) /* Declared in cpython/pyerrors.h */ int From 4bf397d453157361d29443c13777e30a5e73e5a3 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 08:50:11 -0700 Subject: [PATCH 08/22] Update Modules/signalmodule.c Co-authored-by: Christian Heimes --- Modules/signalmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index fd985a1b00208b..ce4917c4b8a17d 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1827,7 +1827,7 @@ _Py_CheckEmscriptenSignals(void) } } -EMSCRIPTEN_KEEP_ALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; +EMSCRIPTEN_KEEPALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; #endif // defined(__EMSCRIPTEN__) From 9cdb1c77bfceae1d488e82faccde20e856189072 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 31 Mar 2022 21:54:09 +0200 Subject: [PATCH 09/22] Platform specific objects and headers --- Include/internal/emscripten_signal.h | 0 Makefile.pre.in | 4 +++- Python/emscripten_signal.c | 0 configure | 17 +++++++++++++++++ configure.ac | 13 +++++++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 Include/internal/emscripten_signal.h create mode 100644 Python/emscripten_signal.c diff --git a/Include/internal/emscripten_signal.h b/Include/internal/emscripten_signal.h new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/Makefile.pre.in b/Makefile.pre.in index e6c6a6ba53a6d4..f27d27d1f5cd38 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -433,7 +433,8 @@ PYTHON_OBJS= \ Python/$(DYNLOADFILE) \ $(LIBOBJS) \ $(MACHDEP_OBJS) \ - $(DTRACE_OBJS) + $(DTRACE_OBJS) \ + @PLATFORM_OBJS@ ########################################################################## @@ -1617,6 +1618,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_unicodeobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) \ + @PLATFORM_HEADERS@ \ \ $(srcdir)/Python/stdlib_module_names.h diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/configure b/configure index 17f52996f4fd75..b6024f75600fb0 100755 --- a/configure +++ b/configure @@ -815,6 +815,8 @@ TRUE MACHDEP_OBJS DYNLOADFILE DLINCLDIR +PLATFORM_OBJS +PLATFORM_HEADERS DTRACE_OBJS DTRACE_HEADERS DFLAGS @@ -13752,6 +13754,21 @@ $as_echo "$ac_cv_dtrace_link" >&6; } fi fi +PLATFORM_HEADERS= +PLATFORM_OBJS= + +case $ac_sys_system in #( + Emscripten) : + + as_fn_append PLATFORM_HEADERS '$(srcdir)/Include/internal/emscripten_signal.h' + as_fn_append PLATFORM_OBJS Python/emscripten_signal.o + ;; #( + *) : + ;; +esac + + + # -I${DLINCLDIR} is added to the compile rule for importdl.o DLINCLDIR=. diff --git a/configure.ac b/configure.ac index 566ff80aed3c7f..b2ebe158d6792a 100644 --- a/configure.ac +++ b/configure.ac @@ -4142,6 +4142,19 @@ then fi fi +dnl platform specific C and header files +PLATFORM_HEADERS= +PLATFORM_OBJS= + +AS_CASE([$ac_sys_system], + [Emscripten], [ + AS_VAR_APPEND([PLATFORM_HEADERS], ['$(srcdir)/Include/internal/emscripten_signal.h']) + AS_VAR_APPEND([PLATFORM_OBJS], [Python/emscripten_signal.o]) + ], +) +AC_SUBST([PLATFORM_HEADERS]) +AC_SUBST([PLATFORM_OBJS]) + # -I${DLINCLDIR} is added to the compile rule for importdl.o AC_SUBST(DLINCLDIR) DLINCLDIR=. From 76d9a355702452c1f670fa2c8e39a7465f281da6 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 18:00:00 -0700 Subject: [PATCH 10/22] Move custom emscripten logic into emscripten_signals files --- Include/internal/emscripten_signal.h | 25 +++++++++++++++ Makefile.pre.in | 1 + Modules/signalmodule.c | 46 +--------------------------- Python/ceval.c | 23 +------------- configure.ac | 1 - 5 files changed, 28 insertions(+), 68 deletions(-) diff --git a/Include/internal/emscripten_signal.h b/Include/internal/emscripten_signal.h index e69de29bb2d1d6..8b3287d85da4b2 100644 --- a/Include/internal/emscripten_signal.h +++ b/Include/internal/emscripten_signal.h @@ -0,0 +1,25 @@ +#ifndef Py_EMSCRIPTEN_SIGNAL_H +#define Py_EMSCRIPTEN_SIGNAL_H + +#if defined(__EMSCRIPTEN__) + +void +_Py_CheckEmscriptenSignals(void); + +void +_Py_CheckEmscriptenSignalsPeriodically(void); + +#define _Py_CHECK_EMSCRIPTEN_SIGNALS() _Py_CheckEmscriptenSignals() + +#define _Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY() _Py_CheckEmscriptenSignalsPeriodically() + +extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; + +#else + +#define _Py_CHECK_EMSCRIPTEN_SIGNALS() +#define _Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY() + +#endif // defined(__EMSCRIPTEN__) + +#endif // ndef Py_EMSCRIPTEN_SIGNAL_H diff --git a/Makefile.pre.in b/Makefile.pre.in index f27d27d1f5cd38..5874baa7fa3a32 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1618,6 +1618,7 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_unicodeobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) \ + $(srcdir)/Include/internal/emscripten_signal.h \ @PLATFORM_HEADERS@ \ \ $(srcdir)/Python/stdlib_module_names.h diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index fd985a1b00208b..284bbb9efd5f05 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1792,55 +1792,11 @@ PyErr_CheckSignals(void) return _PyErr_CheckSignalsTstate(tstate); } -#if defined(__EMSCRIPTEN__) - -// To enable signal handling, the embedder should: -// 1. set Module.Py_EmscriptenSignalBuffer = some_shared_array_buffer; -// 2. set the Py_EMSCRIPTEN_SIGNAL_HANDLING flag to 1 as follows: -// Module.HEAP8[Module._Py_EMSCRIPTEN_SIGNAL_HANDLING] = 1 -// -// The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as -// Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. -#include -EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { - if (!Module.Py_EmscriptenSignalBuffer) { - return 0; - } - try { - let result = Module.Py_EmscriptenSignalBuffer[0]; - Module.Py_EmscriptenSignalBuffer[0] = 0; - return result; - } catch(e) { -#if !defined(NDEBUG) - console.warn("Error occurred while trying to read signal buffer:", e); -#endif - return 0; - } -}); - -void -_Py_CheckEmscriptenSignals(void) -{ - int signal = _Py_CheckEmscriptenSignals_Helper(); - if (signal) { - PyErr_SetInterruptEx(signal); - } -} - -EMSCRIPTEN_KEEP_ALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; - -#endif // defined(__EMSCRIPTEN__) - /* Declared in cpython/pyerrors.h */ int _PyErr_CheckSignalsTstate(PyThreadState *tstate) { -#if defined(__EMSCRIPTEN__) - if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { - _Py_CheckEmscriptenSignals(); - } -#endif - + _Py_CHECK_EMSCRIPTEN_SIGNALS(); if (!_Py_atomic_load(&is_tripped)) { return 0; } diff --git a/Python/ceval.c b/Python/ceval.c index ac806bc6a8313f..51b96c408660b0 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1292,33 +1292,12 @@ eval_frame_handle_pending(PyThreadState *tstate) } #define CHECK_EVAL_BREAKER() \ - CHECK_EMSCRIPTEN_SIGNALS(); \ + _Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY(); \ if (_Py_atomic_load_relaxed(eval_breaker)) { \ goto handle_eval_breaker; \ } -#if defined(__EMSCRIPTEN__) -extern int Py_EMSCRIPTEN_SIGNAL_HANDLING; -void _Py_CheckEmscriptenSignals(void); - -#define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 -static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; - -static void -CHECK_EMSCRIPTEN_SIGNALS() -{ - emscripten_signal_clock--; - if (emscripten_signal_clock == 0) { - emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; - _Py_CheckEmscriptenSignals(); - } -} -#else -#define CHECK_EMSCRIPTEN_SIGNALS() -#endif - - /* Tuple access macros */ #ifndef Py_DEBUG diff --git a/configure.ac b/configure.ac index b2ebe158d6792a..48b15b2e93af68 100644 --- a/configure.ac +++ b/configure.ac @@ -4148,7 +4148,6 @@ PLATFORM_OBJS= AS_CASE([$ac_sys_system], [Emscripten], [ - AS_VAR_APPEND([PLATFORM_HEADERS], ['$(srcdir)/Include/internal/emscripten_signal.h']) AS_VAR_APPEND([PLATFORM_OBJS], [Python/emscripten_signal.o]) ], ) From 40233535623f09bcfd9bfbbaaec92d1b5fb1e843 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 18:05:24 -0700 Subject: [PATCH 11/22] Fix whitespace --- Modules/signalmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 284bbb9efd5f05..b5bdda891d795c 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1792,6 +1792,7 @@ PyErr_CheckSignals(void) return _PyErr_CheckSignalsTstate(tstate); } + /* Declared in cpython/pyerrors.h */ int _PyErr_CheckSignalsTstate(PyThreadState *tstate) From 69621a4845df1f0a4edf4845bbfc3cde0da5c3eb Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 18:34:16 -0700 Subject: [PATCH 12/22] Fix includes --- .../{emscripten_signal.h => pycore_emscripten_signal.h} | 0 Makefile.pre.in | 1 - Modules/signalmodule.c | 2 ++ Python/ceval.c | 1 + 4 files changed, 3 insertions(+), 1 deletion(-) rename Include/internal/{emscripten_signal.h => pycore_emscripten_signal.h} (100%) diff --git a/Include/internal/emscripten_signal.h b/Include/internal/pycore_emscripten_signal.h similarity index 100% rename from Include/internal/emscripten_signal.h rename to Include/internal/pycore_emscripten_signal.h diff --git a/Makefile.pre.in b/Makefile.pre.in index 5874baa7fa3a32..f27d27d1f5cd38 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1618,7 +1618,6 @@ PYTHON_HEADERS= \ $(srcdir)/Include/internal/pycore_unicodeobject.h \ $(srcdir)/Include/internal/pycore_warnings.h \ $(DTRACE_HEADERS) \ - $(srcdir)/Include/internal/emscripten_signal.h \ @PLATFORM_HEADERS@ \ \ $(srcdir)/Python/stdlib_module_names.h diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index b5bdda891d795c..b6007a15ed6eab 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -13,6 +13,8 @@ #include "pycore_pyerrors.h" // _PyErr_SetString() #include "pycore_pylifecycle.h" // NSIG #include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS + #ifndef MS_WINDOWS # include "posixmodule.h" diff --git a/Python/ceval.c b/Python/ceval.c index 51b96c408660b0..c63f8cd299c2a8 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -21,6 +21,7 @@ #include "pycore_pystate.h" // _PyInterpreterState_GET() #include "pycore_sysmodule.h" // _PySys_Audit() #include "pycore_tuple.h" // _PyTuple_ITEMS() +#include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS #include "code.h" #include "pycore_dict.h" From 356d7397ba53f6108312e3b6e0ee6eb34b9afd14 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 18:37:29 -0700 Subject: [PATCH 13/22] Run autoconf --- configure | 1 - 1 file changed, 1 deletion(-) diff --git a/configure b/configure index b6024f75600fb0..c8c04aa9579fb5 100755 --- a/configure +++ b/configure @@ -13760,7 +13760,6 @@ PLATFORM_OBJS= case $ac_sys_system in #( Emscripten) : - as_fn_append PLATFORM_HEADERS '$(srcdir)/Include/internal/emscripten_signal.h' as_fn_append PLATFORM_OBJS Python/emscripten_signal.o ;; #( *) : From 2a655498eaccf86fa5e070e1dc6c564f2df84926 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 21:13:15 -0700 Subject: [PATCH 14/22] include pyerrors in emscripten_signal.c --- Python/emscripten_signal.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index 393ec07e392b0b..80070e66f2bb2e 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -6,6 +6,7 @@ // The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as // Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. #include +#include "pyerrors.h" EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { if (!Module.Py_EmscriptenSignalBuffer) { From ac6c546799eaab89fcb311aa346df0885c503ec3 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 21:19:50 -0700 Subject: [PATCH 15/22] Include python.h --- Python/emscripten_signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index 80070e66f2bb2e..48ae5aea6a1d2f 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -6,7 +6,7 @@ // The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as // Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. #include -#include "pyerrors.h" +#include "python.h" EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { if (!Module.Py_EmscriptenSignalBuffer) { From bb1ffbd0629fe9da15d5cf1aad4fffb4e2de17b2 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 21:23:00 -0700 Subject: [PATCH 16/22] Include Python.h --- Python/emscripten_signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index 48ae5aea6a1d2f..e0b09b1643d8ae 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -6,7 +6,7 @@ // The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as // Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. #include -#include "python.h" +#include "Python.h" EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { if (!Module.Py_EmscriptenSignalBuffer) { From 871e545d73a0008e73aae7a655f57e208070438e Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 31 Mar 2022 22:05:04 -0700 Subject: [PATCH 17/22] Whitespace --- Modules/signalmodule.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index b6007a15ed6eab..1ee5c669df015f 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -15,7 +15,6 @@ #include "pycore_pystate.h" // _PyThreadState_GET() #include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS - #ifndef MS_WINDOWS # include "posixmodule.h" #endif From 51f7255fcf50dd18dd4671caf4d8026929189d2a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 1 Apr 2022 14:37:16 -0700 Subject: [PATCH 18/22] Update configure.ac Co-authored-by: Brett Cannon --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 48b15b2e93af68..dafb506e4c292a 100644 --- a/configure.ac +++ b/configure.ac @@ -4142,7 +4142,7 @@ then fi fi -dnl platform specific C and header files +dnl Platform-specific C and header files. PLATFORM_HEADERS= PLATFORM_OBJS= From 6b4f9e998904fdb99273d7235b0e17c0c3f31354 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 2 Apr 2022 14:32:38 -0700 Subject: [PATCH 19/22] Add blurb --- .../2022-04-02-14-32-21.bpo-47176.kTygYI.rst | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-04-02-14-32-21.bpo-47176.kTygYI.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-04-02-14-32-21.bpo-47176.kTygYI.rst b/Misc/NEWS.d/next/Core and Builtins/2022-04-02-14-32-21.bpo-47176.kTygYI.rst new file mode 100644 index 00000000000000..03fe54a3725526 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-04-02-14-32-21.bpo-47176.kTygYI.rst @@ -0,0 +1,6 @@ +Emscripten builds cannot handle signals in the usual way due to platform +limitations. Python can now handle signals. To use, set +Module.Py_EmscriptenSignalBuffer to be a single byte SharedArrayBuffer and +set Py_EMSCRIPTEN_SIGNAL_HANDLING to 1. Writing a number into the +SharedArrayBuffer will cause the corresponding signal to be raised into the +Python thread. From 83c080322e0e7dff9304b36d3ef26018d1ae246b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 2 Apr 2022 14:36:10 -0700 Subject: [PATCH 20/22] Respect Py_EMSCRIPTEN_SIGNAL_HANDLING flag --- Python/emscripten_signal.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Python/emscripten_signal.c b/Python/emscripten_signal.c index e0b09b1643d8ae..d617ddfeb37c5a 100644 --- a/Python/emscripten_signal.c +++ b/Python/emscripten_signal.c @@ -24,18 +24,20 @@ EM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { } }); +EMSCRIPTEN_KEEPALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; + void _Py_CheckEmscriptenSignals(void) { + if (!Py_EMSCRIPTEN_SIGNAL_HANDLING) { + return; + } int signal = _Py_CheckEmscriptenSignals_Helper(); if (signal) { PyErr_SetInterruptEx(signal); } } -EMSCRIPTEN_KEEPALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; - -void _Py_CheckEmscriptenSignals(void); #define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; @@ -43,6 +45,9 @@ static int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; void _Py_CheckEmscriptenSignalsPeriodically(void) { + if (!Py_EMSCRIPTEN_SIGNAL_HANDLING) { + return; + } emscripten_signal_clock--; if (emscripten_signal_clock == 0) { emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; From 0d18561e8b94530d26438cb49729f5dec965f793 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 2 Apr 2022 14:52:24 -0700 Subject: [PATCH 21/22] Update configure.ac Co-authored-by: Christian Heimes --- configure.ac | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index dafb506e4c292a..cd3681af25b4ef 100644 --- a/configure.ac +++ b/configure.ac @@ -4148,7 +4148,8 @@ PLATFORM_OBJS= AS_CASE([$ac_sys_system], [Emscripten], [ - AS_VAR_APPEND([PLATFORM_OBJS], [Python/emscripten_signal.o]) + AS_VAR_APPEND([PLATFORM_OBJS], [' Python/emscripten_signal.o']) + AS_VAR_APPEND([PLATFORM_HEADERS], [' $(srcdir)/Include/internal/pycore_emscripten_signal.h']) ], ) AC_SUBST([PLATFORM_HEADERS]) From 0bd86ce31def3199021071da62d93e2aff326456 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 2 Apr 2022 15:21:16 -0700 Subject: [PATCH 22/22] Run autoconf --- configure | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configure b/configure index c8c04aa9579fb5..80819204c06271 100755 --- a/configure +++ b/configure @@ -13760,7 +13760,8 @@ PLATFORM_OBJS= case $ac_sys_system in #( Emscripten) : - as_fn_append PLATFORM_OBJS Python/emscripten_signal.o + as_fn_append PLATFORM_OBJS ' Python/emscripten_signal.o' + as_fn_append PLATFORM_HEADERS ' $(srcdir)/Include/internal/pycore_emscripten_signal.h' ;; #( *) : ;;