diff --git a/src/generated_struct_info32.json b/src/generated_struct_info32.json index 83bec140ffc1..a28fe199e683 100644 --- a/src/generated_struct_info32.json +++ b/src/generated_struct_info32.json @@ -202,20 +202,12 @@ "EMULTIHOP": 36, "EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD": 2, "EM_CALLBACK_THREAD_CONTEXT_MAIN_RUNTIME_THREAD": 1, - "EM_FUNC_SIG_I": 536870912, - "EM_FUNC_SIG_II": 570425344, - "EM_FUNC_SIG_III": 603979776, - "EM_FUNC_SIG_IIII": 637534208, "EM_FUNC_SIG_PARAM_B": 4, "EM_FUNC_SIG_PARAM_D": 3, "EM_FUNC_SIG_PARAM_F": 2, "EM_FUNC_SIG_PARAM_F2I": 5, "EM_FUNC_SIG_PARAM_I": 0, "EM_FUNC_SIG_PARAM_I64": 1, - "EM_FUNC_SIG_V": 0, - "EM_FUNC_SIG_VI": 33554432, - "EM_FUNC_SIG_VII": 67108864, - "EM_FUNC_SIG_VIII": 100663296, "EM_HTML5_LONG_STRING_LEN_BYTES": 128, "EM_HTML5_MEDIUM_STRING_LEN_BYTES": 64, "EM_HTML5_SHORT_STRING_LEN_BYTES": 32, diff --git a/src/generated_struct_info64.json b/src/generated_struct_info64.json index 4884d7d4e14c..708a660b27ec 100644 --- a/src/generated_struct_info64.json +++ b/src/generated_struct_info64.json @@ -202,20 +202,12 @@ "EMULTIHOP": 36, "EM_CALLBACK_THREAD_CONTEXT_CALLING_THREAD": 2, "EM_CALLBACK_THREAD_CONTEXT_MAIN_RUNTIME_THREAD": 1, - "EM_FUNC_SIG_I": 536870912, - "EM_FUNC_SIG_II": 570425344, - "EM_FUNC_SIG_III": 603979776, - "EM_FUNC_SIG_IIII": 637534208, "EM_FUNC_SIG_PARAM_B": 4, "EM_FUNC_SIG_PARAM_D": 3, "EM_FUNC_SIG_PARAM_F": 2, "EM_FUNC_SIG_PARAM_F2I": 5, "EM_FUNC_SIG_PARAM_I": 0, "EM_FUNC_SIG_PARAM_I64": 1, - "EM_FUNC_SIG_V": 0, - "EM_FUNC_SIG_VI": 33554432, - "EM_FUNC_SIG_VII": 67108864, - "EM_FUNC_SIG_VIII": 100663296, "EM_HTML5_LONG_STRING_LEN_BYTES": 128, "EM_HTML5_MEDIUM_STRING_LEN_BYTES": 64, "EM_HTML5_SHORT_STRING_LEN_BYTES": 32, diff --git a/src/library_html5.js b/src/library_html5.js index 5ece340a340e..5ae206c05e9c 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -7,7 +7,7 @@ var LibraryHTML5 = { $JSEvents__deps: ['$withStackSave', #if PTHREADS - 'emscripten_dispatch_to_thread_', + '_emscripten_run_callback_on_thread', #endif ], $JSEvents: { @@ -208,19 +208,6 @@ var LibraryHTML5 = { return {{{ cDefs.EMSCRIPTEN_RESULT_SUCCESS }}}; }, -#if PTHREADS - // TODO: Support proxied events for MEMORY64 - queueEventHandlerOnThread_iiii(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { - withStackSave(() => { - var varargs = stackAlloc(12); - {{{ makeSetValue('varargs', 0, 'eventTypeId', 'i32') }}}; - {{{ makeSetValue('varargs', 4, 'eventData', 'i32') }}}; - {{{ makeSetValue('varargs', 8, 'userData', 'i32') }}}; - _emscripten_dispatch_to_thread_(targetThread, {{{ cDefs.EM_FUNC_SIG_IIII }}}, eventHandlerFunc, eventData, varargs); - }); - }, -#endif - #if PTHREADS getTargetThreadForEventCallback(targetThread) { switch (targetThread) { @@ -305,7 +292,7 @@ var LibraryHTML5 = { stringToUTF8(e.locale || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.locale }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}}); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, keyEventData, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, keyEventData, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, keyEventData, userData)) e.preventDefault(); @@ -545,7 +532,7 @@ var LibraryHTML5 = { if (targetThread) { var mouseEventData = _malloc({{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}}); // This allocated block is passed as satellite data to the proxied function call, so the call frees up the data block when done. fillMouseEventData(mouseEventData, e, target); - JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, mouseEventData, userData); + __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, mouseEventData, userData); } else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); @@ -644,7 +631,7 @@ var LibraryHTML5 = { {{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaZ, 'e["deltaZ"]', 'double') }}}; {{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaMode, 'e["deltaMode"]', 'i32') }}}; #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, wheelEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, wheelEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, wheelEvent, userData)) e.preventDefault(); @@ -745,7 +732,7 @@ var LibraryHTML5 = { {{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollTop, 'pageXOffset', 'i32') }}}; {{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollLeft, 'pageYOffset', 'i32') }}}; #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, uiEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, uiEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, uiEvent, userData)) e.preventDefault(); @@ -791,7 +778,7 @@ var LibraryHTML5 = { stringToUTF8(id, focusEvent + {{{ C_STRUCTS.EmscriptenFocusEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}}); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, focusEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, focusEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, focusEvent, userData)) e.preventDefault(); @@ -853,7 +840,7 @@ var LibraryHTML5 = { if (targetThread) { var deviceOrientationEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}}); fillDeviceOrientationEventData(deviceOrientationEvent, e, target); - JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData); + __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData); } else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault(); @@ -923,7 +910,7 @@ var LibraryHTML5 = { if (targetThread) { var deviceMotionEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}}); fillDeviceMotionEventData(deviceMotionEvent, e, target); - JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData); + __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData); } else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault(); @@ -993,7 +980,7 @@ var LibraryHTML5 = { fillOrientationChangeEventData(orientationChangeEvent); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, orientationChangeEvent, userData)) e.preventDefault(); @@ -1112,7 +1099,7 @@ var LibraryHTML5 = { fillFullscreenChangeEventData(fullscreenChangeEvent); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); @@ -1195,7 +1182,7 @@ var LibraryHTML5 = { if (strategy.canvasResizedCallback) { #if PTHREADS - if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); + if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); else #endif {{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); @@ -1347,7 +1334,7 @@ var LibraryHTML5 = { if (currentFullscreenStrategy.canvasResizedCallback) { #if PTHREADS - if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); + if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif {{{ makeDynCall('iipp', 'currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); @@ -1475,7 +1462,7 @@ var LibraryHTML5 = { if (!inCenteredWithoutScalingFullscreenMode && currentFullscreenStrategy.canvasResizedCallback) { #if PTHREADS - if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); + if (currentFullscreenStrategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(currentFullscreenStrategy.canvasResizedCallbackTargetThread, currentFullscreenStrategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); else #endif {{{ makeDynCall('iipp', 'currentFullscreenStrategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); @@ -1595,7 +1582,7 @@ var LibraryHTML5 = { removeEventListener('resize', softFullscreenResizeWebGLRenderTarget); if (strategy.canvasResizedCallback) { #if PTHREADS - if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); + if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); else #endif {{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); @@ -1609,7 +1596,7 @@ var LibraryHTML5 = { // Inform the caller that the canvas size has changed. if (strategy.canvasResizedCallback) { #if PTHREADS - if (strategy.canvasResizedCallbackTargetThread) JSEvents.queueEventHandlerOnThread_iiii(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); + if (strategy.canvasResizedCallbackTargetThread) __emscripten_run_callback_on_thread(strategy.canvasResizedCallbackTargetThread, strategy.canvasResizedCallback, {{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); else #endif {{{ makeDynCall('iipp', 'strategy.canvasResizedCallback') }}}({{{ cDefs.EMSCRIPTEN_EVENT_CANVASRESIZED }}}, 0, strategy.canvasResizedCallbackUserData); @@ -1689,7 +1676,7 @@ var LibraryHTML5 = { fillPointerlockChangeEventData(pointerlockChangeEvent); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); @@ -1734,7 +1721,7 @@ var LibraryHTML5 = { var pointerlockErrorEventHandlerFunc = (e = event) => { #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); @@ -1934,7 +1921,7 @@ var LibraryHTML5 = { fillVisibilityChangeEventData(visibilityChangeEvent); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); @@ -2051,7 +2038,7 @@ var LibraryHTML5 = { {{{ makeSetValue('touchEvent', C_STRUCTS.EmscriptenTouchEvent.numTouches, 'numTouches', 'i32') }}}; #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, touchEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, touchEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, touchEvent, userData)) e.preventDefault(); @@ -2138,7 +2125,7 @@ var LibraryHTML5 = { fillGamepadEventData(gamepadEvent, e["gamepad"]); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, gamepadEvent, userData)) e.preventDefault(); @@ -2270,7 +2257,7 @@ var LibraryHTML5 = { fillBatteryEventData(batteryEvent, battery()); #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, batteryEvent, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, userData); else #endif if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, batteryEvent, userData)) e.preventDefault(); diff --git a/src/library_html5_webgl.js b/src/library_html5_webgl.js index 517c6a033769..4a70b543c742 100644 --- a/src/library_html5_webgl.js +++ b/src/library_html5_webgl.js @@ -403,7 +403,7 @@ var LibraryHtml5WebGL = { var webGlEventHandlerFunc = (e = event) => { #if PTHREADS - if (targetThread) JSEvents.queueEventHandlerOnThread_iiii(targetThread, callbackfunc, eventTypeId, 0, userData); + if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, 0, userData); else #endif if ({{{ makeDynCall('iiii', 'callbackfunc') }}}(eventTypeId, 0, userData)) e.preventDefault(); diff --git a/src/struct_info.json b/src/struct_info.json index 026f3e1a2cd2..19a70ba1b540 100644 --- a/src/struct_info.json +++ b/src/struct_info.json @@ -950,14 +950,6 @@ { "file": "emscripten/threading.h", "defines": [ - "EM_FUNC_SIG_V", - "EM_FUNC_SIG_VI", - "EM_FUNC_SIG_VII", - "EM_FUNC_SIG_VIII", - "EM_FUNC_SIG_I", - "EM_FUNC_SIG_II", - "EM_FUNC_SIG_III", - "EM_FUNC_SIG_IIII", "EM_FUNC_SIG_PARAM_I", "EM_FUNC_SIG_PARAM_I64", "EM_FUNC_SIG_PARAM_F", diff --git a/system/lib/html5/callback.c b/system/lib/html5/callback.c new file mode 100644 index 000000000000..1bec1ea78347 --- /dev/null +++ b/system/lib/html5/callback.c @@ -0,0 +1,42 @@ +/* + * Copyright 2023 The Emscripten Authors. All rights reserved. + * Emscripten is available under two separate licenses, the MIT license and the + * University of Illinois/NCSA Open Source License. Both these licenses can be + * found in the LICENSE file. + */ +#include +#include + +#include "emscripten_internal.h" + +typedef EM_BOOL (*event_callback)(int event_type, void *event_data __attribute__((nonnull)), void *user_data); + +typedef struct callback_args_t { + event_callback callback; + int event_type; + void *event_data; + void *user_data; +} callback_args_t; + +static void do_callback(void* arg) { + callback_args_t* args = (callback_args_t*)arg; + args->callback(args->event_type, args->event_data, args->user_data); +} + +void _emscripten_run_callback_on_thread(pthread_t t, + event_callback f, + int event_type, + void* event_data, + void* user_data) { + em_proxying_queue* q = emscripten_proxy_get_system_queue(); + callback_args_t arg = { + .callback = f, + .event_type = event_type, + .event_data = event_data, + .user_data = user_data, + }; + + if (!emscripten_proxy_sync(q, t, do_callback, &arg)) { + assert(false && "emscripten_proxy_sync failed"); + } +}