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