// 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 #include "Python.h" 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; } }); 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); } } #define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 int _Py_emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; void _Py_CheckEmscriptenSignalsPeriodically(void) { if (_Py_emscripten_signal_clock == 0) { _Py_emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; _Py_CheckEmscriptenSignals(); } else if (Py_EMSCRIPTEN_SIGNAL_HANDLING) { _Py_emscripten_signal_clock--; } }