Skip to content

Commit

Permalink
Remove use of legacy proxy API from library_html5.js. NFC (#20370)
Browse files Browse the repository at this point in the history
AFAICT this is the final usage of the legacy proxy API within
emscripten.
  • Loading branch information
sbc100 committed Oct 3, 2023
1 parent efc13c6 commit c41f659
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 59 deletions.
8 changes: 0 additions & 8 deletions src/generated_struct_info32.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 0 additions & 8 deletions src/generated_struct_info64.json
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
55 changes: 21 additions & 34 deletions src/library_html5.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
var LibraryHTML5 = {
$JSEvents__deps: ['$withStackSave',
#if PTHREADS
'emscripten_dispatch_to_thread_',
'_emscripten_run_callback_on_thread',
#endif
],
$JSEvents: {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/library_html5_webgl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
8 changes: 0 additions & 8 deletions src/struct_info.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
42 changes: 42 additions & 0 deletions system/lib/html5/callback.c
Original file line number Diff line number Diff line change
@@ -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 <assert.h>
#include <emscripten/html5.h>

#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");
}
}

0 comments on commit c41f659

Please sign in to comment.