Skip to content

Commit 80269bf

Browse files
authored
Fix memory leak on cross thread events (#25783)
I believe that we started leaking the event data for cross-thread html5 events in #20370. Prior to that change we use `_emscripten_dispatch_to_thread` which took care of free'ing the event data once it was consumed on the target thread. After this change we copy make copy of the event strut in `_emscripten_run_callback_on_thread` and then free it once the callback is run. This change also avoids an extra malloc per event, and cleans up libhtml5.js a little.
1 parent ccc2176 commit 80269bf

File tree

4 files changed

+50
-87
lines changed

4 files changed

+50
-87
lines changed

src/lib/libhtml5.js

Lines changed: 42 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -258,18 +258,15 @@ var LibraryHTML5 = {
258258
#if PTHREADS
259259
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
260260
#endif
261-
JSEvents.keyEvent ||= _malloc({{{ C_STRUCTS.EmscriptenKeyboardEvent.__size__ }}});
261+
var eventSize = {{{ C_STRUCTS.EmscriptenKeyboardEvent.__size__ }}};
262+
JSEvents.keyEvent ||= _malloc(eventSize);
262263

263264
var keyEventHandlerFunc = (e) => {
264265
#if ASSERTIONS
265266
assert(e);
266267
#endif
267268

268-
#if PTHREADS
269-
var keyEventData = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenKeyboardEvent.__size__ }}}) : JSEvents.keyEvent; // This allocated block is passed as satellite data to the proxied function call, so the call frees up the data block when done.
270-
#else
271269
var keyEventData = JSEvents.keyEvent;
272-
#endif
273270
{{{ makeSetValue('keyEventData', C_STRUCTS.EmscriptenKeyboardEvent.timestamp, 'e.timeStamp', 'double') }}};
274271

275272
var idx = {{{ getHeapOffset('keyEventData', 'i32') }}};
@@ -289,7 +286,7 @@ var LibraryHTML5 = {
289286
stringToUTF8(e.locale || '', keyEventData + {{{ C_STRUCTS.EmscriptenKeyboardEvent.locale }}}, {{{ cDefs.EM_HTML5_SHORT_STRING_LEN_BYTES }}});
290287

291288
#if PTHREADS
292-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, keyEventData, userData);
289+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, keyEventData, eventSize, userData);
293290
else
294291
#endif
295292
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, keyEventData, userData)) e.preventDefault();
@@ -480,7 +477,8 @@ var LibraryHTML5 = {
480477
#if PTHREADS
481478
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
482479
#endif
483-
JSEvents.mouseEvent ||= _malloc({{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}});
480+
var eventSize = {{{ C_STRUCTS.EmscriptenMouseEvent.__size__ }}};
481+
JSEvents.mouseEvent ||= _malloc(eventSize);
484482
target = findEventTarget(target);
485483

486484
var mouseEventHandlerFunc = (e = event) => {
@@ -489,9 +487,7 @@ var LibraryHTML5 = {
489487

490488
#if PTHREADS
491489
if (targetThread) {
492-
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.
493-
fillMouseEventData(mouseEventData, e, target);
494-
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, mouseEventData, userData);
490+
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, JSEvents.mouseEvent, eventSize, userData);
495491
} else
496492
#endif
497493
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault();
@@ -572,22 +568,19 @@ var LibraryHTML5 = {
572568
#if PTHREADS
573569
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
574570
#endif
575-
JSEvents.wheelEvent ||= _malloc({{{ C_STRUCTS.EmscriptenWheelEvent.__size__ }}});
571+
var eventSize = {{{ C_STRUCTS.EmscriptenWheelEvent.__size__ }}};
572+
JSEvents.wheelEvent ||= _malloc(eventSize)
576573

577574
// The DOM Level 3 events spec event 'wheel'
578575
var wheelHandlerFunc = (e = event) => {
579-
#if PTHREADS
580-
var wheelEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenWheelEvent.__size__ }}}) : JSEvents.wheelEvent; // This allocated block is passed as satellite data to the proxied function call, so the call frees up the data block when done.
581-
#else
582576
var wheelEvent = JSEvents.wheelEvent;
583-
#endif
584577
fillMouseEventData(wheelEvent, e, target);
585578
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaX, 'e["deltaX"]', 'double') }}};
586579
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaY, 'e["deltaY"]', 'double') }}};
587580
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaZ, 'e["deltaZ"]', 'double') }}};
588581
{{{ makeSetValue('wheelEvent', C_STRUCTS.EmscriptenWheelEvent.deltaMode, 'e["deltaMode"]', 'i32') }}};
589582
#if PTHREADS
590-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, wheelEvent, userData);
583+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, wheelEvent, eventSize, userData);
591584
else
592585
#endif
593586
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, wheelEvent, userData)) e.preventDefault();
@@ -624,7 +617,8 @@ var LibraryHTML5 = {
624617
#if PTHREADS
625618
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
626619
#endif
627-
JSEvents.uiEvent ||= _malloc({{{ C_STRUCTS.EmscriptenUiEvent.__size__ }}});
620+
var eventSize = {{{ C_STRUCTS.EmscriptenUiEvent.__size__ }}};
621+
JSEvents.uiEvent ||= _malloc(eventSize);
628622

629623
#if DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR
630624
target = findEventTarget(target);
@@ -650,11 +644,7 @@ var LibraryHTML5 = {
650644
// During a page unload 'body' can be null, with "Cannot read property 'clientWidth' of null" being thrown
651645
return;
652646
}
653-
#if PTHREADS
654-
var uiEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenUiEvent.__size__ }}}) : JSEvents.uiEvent;
655-
#else
656647
var uiEvent = JSEvents.uiEvent;
657-
#endif
658648
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.detail, '0', 'i32') }}}; // always zero for resize and scroll
659649
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.documentBodyClientWidth, 'b.clientWidth', 'i32') }}};
660650
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.documentBodyClientHeight, 'b.clientHeight', 'i32') }}};
@@ -665,7 +655,7 @@ var LibraryHTML5 = {
665655
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollTop, 'pageXOffset | 0', 'i32') }}}; // scroll offsets are float
666656
{{{ makeSetValue('uiEvent', C_STRUCTS.EmscriptenUiEvent.scrollLeft, 'pageYOffset | 0', 'i32') }}};
667657
#if PTHREADS
668-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, uiEvent, userData);
658+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, uiEvent, eventSize, userData);
669659
else
670660
#endif
671661
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, uiEvent, userData)) e.preventDefault();
@@ -697,22 +687,19 @@ var LibraryHTML5 = {
697687
#if PTHREADS
698688
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
699689
#endif
700-
JSEvents.focusEvent ||= _malloc({{{ C_STRUCTS.EmscriptenFocusEvent.__size__ }}});
690+
var eventSize = {{{ C_STRUCTS.EmscriptenFocusEvent.__size__ }}};
691+
JSEvents.focusEvent ||= _malloc(eventSize);
701692

702693
var focusEventHandlerFunc = (e = event) => {
703694
var nodeName = JSEvents.getNodeNameForTarget(e.target);
704695
var id = e.target.id ? e.target.id : '';
705696

706-
#if PTHREADS
707-
var focusEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenFocusEvent.__size__ }}}) : JSEvents.focusEvent;
708-
#else
709697
var focusEvent = JSEvents.focusEvent;
710-
#endif
711698
stringToUTF8(nodeName, focusEvent + {{{ C_STRUCTS.EmscriptenFocusEvent.nodeName }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
712699
stringToUTF8(id, focusEvent + {{{ C_STRUCTS.EmscriptenFocusEvent.id }}}, {{{ cDefs.EM_HTML5_LONG_STRING_LEN_BYTES }}});
713700

714701
#if PTHREADS
715-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, focusEvent, userData);
702+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, focusEvent, eventSize, userData);
716703
else
717704
#endif
718705
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, focusEvent, userData)) e.preventDefault();
@@ -761,16 +748,15 @@ var LibraryHTML5 = {
761748
#if PTHREADS
762749
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
763750
#endif
764-
JSEvents.deviceOrientationEvent ||= _malloc({{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
751+
var eventSize = {{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}};
752+
JSEvents.deviceOrientationEvent ||= _malloc(eventSize);
765753

766754
var deviceOrientationEventHandlerFunc = (e = event) => {
767755
fillDeviceOrientationEventData(JSEvents.deviceOrientationEvent, e, target); // TODO: Thread-safety with respect to emscripten_get_deviceorientation_status()
768756

769757
#if PTHREADS
770758
if (targetThread) {
771-
var deviceOrientationEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceOrientationEvent.__size__ }}});
772-
fillDeviceOrientationEventData(deviceOrientationEvent, e, target);
773-
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceOrientationEvent, userData);
759+
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, JSEvents.deviceOrientationEvent, eventSize, userData);
774760
} else
775761
#endif
776762
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceOrientationEvent, userData)) e.preventDefault();
@@ -832,16 +818,15 @@ var LibraryHTML5 = {
832818
#if PTHREADS
833819
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
834820
#endif
835-
JSEvents.deviceMotionEvent ||= _malloc({{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
821+
var eventSize = {{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}};
822+
JSEvents.deviceMotionEvent ||= _malloc(eventSize);
836823

837824
var deviceMotionEventHandlerFunc = (e = event) => {
838825
fillDeviceMotionEventData(JSEvents.deviceMotionEvent, e, target); // TODO: Thread-safety with respect to emscripten_get_devicemotion_status()
839826

840827
#if PTHREADS
841828
if (targetThread) {
842-
var deviceMotionEvent = _malloc({{{ C_STRUCTS.EmscriptenDeviceMotionEvent.__size__ }}});
843-
fillDeviceMotionEventData(deviceMotionEvent, e, target);
844-
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, deviceMotionEvent, userData);
829+
__emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, JSEvents.deviceMotionEvent, eventSize, userData);
845830
} else
846831
#endif
847832
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, JSEvents.deviceMotionEvent, userData)) e.preventDefault();
@@ -915,19 +900,15 @@ var LibraryHTML5 = {
915900
#if PTHREADS
916901
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
917902
#endif
918-
JSEvents.orientationChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenOrientationChangeEvent.__size__ }}});
903+
var eventSize = {{{ C_STRUCTS.EmscriptenOrientationChangeEvent.__size__ }}};
904+
JSEvents.orientationChangeEvent ||= _malloc(eventSize);
919905

920906
var orientationChangeEventHandlerFunc = (e = event) => {
921-
#if PTHREADS
922-
var orientationChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenOrientationChangeEvent.__size__ }}}) : JSEvents.orientationChangeEvent;
923-
#else
924907
var orientationChangeEvent = JSEvents.orientationChangeEvent;
925-
#endif
926-
927908
fillOrientationChangeEventData(orientationChangeEvent);
928909

929910
#if PTHREADS
930-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, userData);
911+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, orientationChangeEvent, eventSize, userData);
931912
else
932913
#endif
933914
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, orientationChangeEvent, userData)) e.preventDefault();
@@ -1026,19 +1007,15 @@ var LibraryHTML5 = {
10261007
#if PTHREADS
10271008
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
10281009
#endif
1029-
JSEvents.fullscreenChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.__size__ }}});
1010+
var eventSize = {{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.__size__ }}};
1011+
JSEvents.fullscreenChangeEvent ||= _malloc(eventSize);
10301012

10311013
var fullscreenChangeEventhandlerFunc = (e = event) => {
1032-
#if PTHREADS
1033-
var fullscreenChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenFullscreenChangeEvent.__size__ }}}) : JSEvents.fullscreenChangeEvent;
1034-
#else
10351014
var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent;
1036-
#endif
1037-
10381015
fillFullscreenChangeEventData(fullscreenChangeEvent);
10391016

10401017
#if PTHREADS
1041-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, userData);
1018+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, fullscreenChangeEvent, eventSize, userData);
10421019
else
10431020
#endif
10441021
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault();
@@ -1528,18 +1505,15 @@ var LibraryHTML5 = {
15281505
#if PTHREADS
15291506
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
15301507
#endif
1531-
JSEvents.pointerlockChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.__size__ }}});
1508+
var eventSize = {{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.__size__ }}};
1509+
JSEvents.pointerlockChangeEvent ||= _malloc(eventSize);
15321510

15331511
var pointerlockChangeEventHandlerFunc = (e = event) => {
1534-
#if PTHREADS
1535-
var pointerlockChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenPointerlockChangeEvent.__size__ }}}) : JSEvents.pointerlockChangeEvent;
1536-
#else
15371512
var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent;
1538-
#endif
15391513
fillPointerlockChangeEventData(pointerlockChangeEvent);
15401514

15411515
#if PTHREADS
1542-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, userData);
1516+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, pointerlockChangeEvent, eventSize, userData);
15431517
else
15441518
#endif
15451519
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault();
@@ -1725,19 +1699,15 @@ var LibraryHTML5 = {
17251699
#if PTHREADS
17261700
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
17271701
#endif
1728-
JSEvents.visibilityChangeEvent ||= _malloc({{{ C_STRUCTS.EmscriptenVisibilityChangeEvent.__size__ }}});
1702+
var eventSize = {{{ C_STRUCTS.EmscriptenVisibilityChangeEvent.__size__ }}};
1703+
JSEvents.visibilityChangeEvent ||= _malloc(eventSize);
17291704

17301705
var visibilityChangeEventHandlerFunc = (e = event) => {
1731-
#if PTHREADS
1732-
var visibilityChangeEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenVisibilityChangeEvent.__size__ }}}) : JSEvents.visibilityChangeEvent;
1733-
#else
17341706
var visibilityChangeEvent = JSEvents.visibilityChangeEvent;
1735-
#endif
1736-
17371707
fillVisibilityChangeEventData(visibilityChangeEvent);
17381708

17391709
#if PTHREADS
1740-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, userData);
1710+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, visibilityChangeEvent, eventSize, userData);
17411711
else
17421712
#endif
17431713
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault();
@@ -1780,7 +1750,8 @@ var LibraryHTML5 = {
17801750
#if PTHREADS
17811751
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
17821752
#endif
1783-
JSEvents.touchEvent ||= _malloc({{{ C_STRUCTS.EmscriptenTouchEvent.__size__ }}});
1753+
var eventSize = {{{ C_STRUCTS.EmscriptenTouchEvent.__size__ }}};
1754+
JSEvents.touchEvent ||= _malloc(eventSize);
17841755

17851756
target = findEventTarget(target);
17861757

@@ -1809,11 +1780,7 @@ var LibraryHTML5 = {
18091780
touches[t.identifier].onTarget = 1;
18101781
}
18111782

1812-
#if PTHREADS
1813-
var touchEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenTouchEvent.__size__ }}}) : JSEvents.touchEvent;
1814-
#else
18151783
var touchEvent = JSEvents.touchEvent;
1816-
#endif
18171784
{{{ makeSetValue('touchEvent', C_STRUCTS.EmscriptenTouchEvent.timestamp, 'e.timeStamp', 'double') }}};
18181785
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.ctrlKey }}}] = e.ctrlKey;
18191786
HEAP8[touchEvent + {{{ C_STRUCTS.EmscriptenTouchEvent.shiftKey }}}] = e.shiftKey;
@@ -1852,7 +1819,7 @@ var LibraryHTML5 = {
18521819
{{{ makeSetValue('touchEvent', C_STRUCTS.EmscriptenTouchEvent.numTouches, 'numTouches', 'i32') }}};
18531820

18541821
#if PTHREADS
1855-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, touchEvent, userData);
1822+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, touchEvent, eventSize, userData);
18561823
else
18571824
#endif
18581825
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, touchEvent, userData)) e.preventDefault();
@@ -1927,18 +1894,15 @@ var LibraryHTML5 = {
19271894
#if PTHREADS
19281895
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
19291896
#endif
1930-
JSEvents.gamepadEvent ||= _malloc({{{ C_STRUCTS.EmscriptenGamepadEvent.__size__ }}});
1897+
var eventSize = {{{ C_STRUCTS.EmscriptenGamepadEvent.__size__ }}};
1898+
JSEvents.gamepadEvent ||= _malloc(eventSize);
19311899

19321900
var gamepadEventHandlerFunc = (e = event) => {
1933-
#if PTHREADS
1934-
var gamepadEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenGamepadEvent.__size__ }}}) : JSEvents.gamepadEvent;
1935-
#else
19361901
var gamepadEvent = JSEvents.gamepadEvent;
1937-
#endif
19381902
fillGamepadEventData(gamepadEvent, e["gamepad"]);
19391903

19401904
#if PTHREADS
1941-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, gamepadEvent, userData);
1905+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, gamepadEvent, eventSize, userData);
19421906
else
19431907
#endif
19441908
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, gamepadEvent, userData)) e.preventDefault();
@@ -2069,18 +2033,15 @@ var LibraryHTML5 = {
20692033
#if PTHREADS
20702034
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
20712035
#endif
2072-
JSEvents.batteryEvent ||= _malloc({{{ C_STRUCTS.EmscriptenBatteryEvent.__size__ }}});
2036+
var eventSize = {{{ C_STRUCTS.EmscriptenBatteryEvent.__size__ }}};
2037+
JSEvents.batteryEvent ||= _malloc(eventSize)
20732038

20742039
var batteryEventHandlerFunc = (e = event) => {
2075-
#if PTHREADS
2076-
var batteryEvent = targetThread ? _malloc({{{ C_STRUCTS.EmscriptenBatteryEvent.__size__ }}}) : JSEvents.batteryEvent;
2077-
#else
20782040
var batteryEvent = JSEvents.batteryEvent;
2079-
#endif
20802041
fillBatteryEventData(batteryEvent, battery);
20812042

20822043
#if PTHREADS
2083-
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, userData);
2044+
if (targetThread) __emscripten_run_callback_on_thread(targetThread, callbackfunc, eventTypeId, batteryEvent, eventSize, userData);
20842045
else
20852046
#endif
20862047
if ({{{ makeDynCall('iipp', 'callbackfunc') }}}(eventTypeId, batteryEvent, userData)) e.preventDefault();

system/lib/html5/callback.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* found in the LICENSE file.
66
*/
77
#include <assert.h>
8+
#include <string.h>
89
#include <emscripten/html5.h>
910

1011
#include "emscripten_internal.h"
@@ -14,8 +15,8 @@ typedef bool (*event_callback)(int event_type, void *event_data __attribute__((n
1415
typedef struct callback_args_t {
1516
event_callback callback;
1617
int event_type;
17-
void *event_data;
1818
void *user_data;
19+
uint8_t event_data[];
1920
} callback_args_t;
2021

2122
static void do_callback(void* arg) {
@@ -28,13 +29,14 @@ void _emscripten_run_callback_on_thread(pthread_t t,
2829
event_callback f,
2930
int event_type,
3031
void* event_data,
32+
size_t event_data_size,
3133
void* user_data) {
3234
em_proxying_queue* q = emscripten_proxy_get_system_queue();
33-
callback_args_t* arg = malloc(sizeof(callback_args_t));
35+
callback_args_t* arg = malloc(sizeof(callback_args_t) + event_data_size);
3436
arg->callback = f;
3537
arg->event_type = event_type;
36-
arg->event_data = event_data;
3738
arg->user_data = user_data;
39+
memcpy(arg->event_data, event_data, event_data_size);
3840

3941
if (!emscripten_proxy_async(q, t, do_callback, arg)) {
4042
assert(false && "emscripten_proxy_async failed");

test/codesize/test_codesize_hello_dylink_all.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"a.out.js": 245483,
3-
"a.out.nodebug.wasm": 573907,
4-
"total": 819390,
3+
"a.out.nodebug.wasm": 573921,
4+
"total": 819404,
55
"sent": [
66
"IMG_Init",
77
"IMG_Load",

tools/emscripten.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1145,7 +1145,7 @@ def create_pointer_conversion_wrappers(metadata):
11451145
'emscripten_main_runtime_thread_id': 'p',
11461146
'_emscripten_set_offscreencanvas_size_on_thread': '_pp__',
11471147
'fileno': '_p',
1148-
'_emscripten_run_callback_on_thread': '_pp_pp',
1148+
'_emscripten_run_callback_on_thread': '_pp_ppp',
11491149
'_emscripten_find_dylib': 'ppppp',
11501150
}
11511151

0 commit comments

Comments
 (0)