17db96d56Sopenharmony_ci// To enable signal handling, the embedder should: 27db96d56Sopenharmony_ci// 1. set Module.Py_EmscriptenSignalBuffer = some_shared_array_buffer; 37db96d56Sopenharmony_ci// 2. set the Py_EMSCRIPTEN_SIGNAL_HANDLING flag to 1 as follows: 47db96d56Sopenharmony_ci// Module.HEAP8[Module._Py_EMSCRIPTEN_SIGNAL_HANDLING] = 1 57db96d56Sopenharmony_ci// 67db96d56Sopenharmony_ci// The address &Py_EMSCRIPTEN_SIGNAL_HANDLING is exported as 77db96d56Sopenharmony_ci// Module._Py_EMSCRIPTEN_SIGNAL_HANDLING. 87db96d56Sopenharmony_ci#include <emscripten.h> 97db96d56Sopenharmony_ci#include "Python.h" 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ciEM_JS(int, _Py_CheckEmscriptenSignals_Helper, (void), { 127db96d56Sopenharmony_ci if (!Module.Py_EmscriptenSignalBuffer) { 137db96d56Sopenharmony_ci return 0; 147db96d56Sopenharmony_ci } 157db96d56Sopenharmony_ci try { 167db96d56Sopenharmony_ci let result = Module.Py_EmscriptenSignalBuffer[0]; 177db96d56Sopenharmony_ci Module.Py_EmscriptenSignalBuffer[0] = 0; 187db96d56Sopenharmony_ci return result; 197db96d56Sopenharmony_ci } catch(e) { 207db96d56Sopenharmony_ci#if !defined(NDEBUG) 217db96d56Sopenharmony_ci console.warn("Error occurred while trying to read signal buffer:", e); 227db96d56Sopenharmony_ci#endif 237db96d56Sopenharmony_ci return 0; 247db96d56Sopenharmony_ci } 257db96d56Sopenharmony_ci}); 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ciEMSCRIPTEN_KEEPALIVE int Py_EMSCRIPTEN_SIGNAL_HANDLING = 0; 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_civoid 307db96d56Sopenharmony_ci_Py_CheckEmscriptenSignals(void) 317db96d56Sopenharmony_ci{ 327db96d56Sopenharmony_ci if (!Py_EMSCRIPTEN_SIGNAL_HANDLING) { 337db96d56Sopenharmony_ci return; 347db96d56Sopenharmony_ci } 357db96d56Sopenharmony_ci int signal = _Py_CheckEmscriptenSignals_Helper(); 367db96d56Sopenharmony_ci if (signal) { 377db96d56Sopenharmony_ci PyErr_SetInterruptEx(signal); 387db96d56Sopenharmony_ci } 397db96d56Sopenharmony_ci} 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci#define PY_EMSCRIPTEN_SIGNAL_INTERVAL 50 437db96d56Sopenharmony_cistatic int emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_civoid 467db96d56Sopenharmony_ci_Py_CheckEmscriptenSignalsPeriodically(void) 477db96d56Sopenharmony_ci{ 487db96d56Sopenharmony_ci if (!Py_EMSCRIPTEN_SIGNAL_HANDLING) { 497db96d56Sopenharmony_ci return; 507db96d56Sopenharmony_ci } 517db96d56Sopenharmony_ci emscripten_signal_clock--; 527db96d56Sopenharmony_ci if (emscripten_signal_clock == 0) { 537db96d56Sopenharmony_ci emscripten_signal_clock = PY_EMSCRIPTEN_SIGNAL_INTERVAL; 547db96d56Sopenharmony_ci _Py_CheckEmscriptenSignals(); 557db96d56Sopenharmony_ci } 567db96d56Sopenharmony_ci} 57