Skip to content

Commit d8b705b

Browse files
committed
Use Promise internal for handling run dependencies. NFC
This is a logical followup to #27121, and comes with a codesize saving in many cases. Add `$resolveRunDependencies` to allow awaiting the resolution of all active run dependencies. This is useful for async runtime operations like `emscripten_async_load_script` which need to wait for loaded scripts to finish their own async setup (e.g. file preloading) before triggering their onload callbacks. Codesize impact: - test_codesize_file_preload: -19 bytes (JS) - test_codesize_hello_dylink_all: +40 bytes (JS) - All other tests (including C++ tests): 0 bytes change (fully DCE'd)
1 parent 9253107 commit d8b705b

6 files changed

Lines changed: 43 additions & 43 deletions

File tree

src/lib/libbrowser.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ var LibraryBrowser = {
617617
},
618618

619619
// TODO: currently not callable from a pthread, but immediately calls onerror() if not on main thread.
620-
emscripten_async_load_script__deps: ['$UTF8ToString', '$runDependencies', '$dependenciesFulfilled'],
620+
emscripten_async_load_script__deps: ['$UTF8ToString', '$runDependencies', '$resolveRunDependencies'],
621621
emscripten_async_load_script: async (url, onload, onerror) => {
622622
url = UTF8ToString(url);
623623
#if PTHREADS
@@ -635,12 +635,7 @@ var LibraryBrowser = {
635635
var loadDone = () => {
636636
{{{ runtimeKeepalivePop() }}}
637637
if (onload) {
638-
var onloadCallback = () => callUserCallback({{{ makeDynCall('v', 'onload') }}});
639-
if (runDependencies > 0) {
640-
dependenciesFulfilled = onloadCallback;
641-
} else {
642-
onloadCallback();
643-
}
638+
resolveRunDependencies().then(() => callUserCallback({{{ makeDynCall('v', 'onload') }}}));
644639
}
645640
}
646641

src/lib/libcore.js

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,24 +2268,32 @@ addToLibrary({
22682268
// it happens right before run - run will be postponed until
22692269
// the dependencies are met.
22702270
$runDependencies__internal: true,
2271+
$runDependencies__deps: ['$resolveRunDependencies'],
22712272
$runDependencies: 0,
2272-
// overridden to take different actions when all run dependencies are fulfilled
2273-
$dependenciesFulfilled__internal: true,
2274-
$dependenciesFulfilled: null,
2273+
$dependenciesPromise__internal: true,
2274+
$dependenciesPromise: null,
2275+
$resolveRunDependencies__internal: true,
2276+
$resolveRunDependencies__deps: ['$dependenciesPromise'],
2277+
$resolveRunDependencies: async () => dependenciesPromise,
22752278
#if ASSERTIONS
22762279
$runDependencyTracking__internal: true,
22772280
$runDependencyTracking: {},
22782281
$runDependencyWatcher__internal: true,
22792282
$runDependencyWatcher: null,
22802283
#endif
22812284

2282-
$addRunDependency__deps: ['$runDependencies', '$removeRunDependency',
2285+
$addRunDependency__deps: ['$runDependencies', '$removeRunDependency', '$dependenciesPromise',
22832286
#if ASSERTIONS
22842287
'$runDependencyTracking',
22852288
'$runDependencyWatcher',
22862289
#endif
22872290
],
22882291
$addRunDependency: (id) => {
2292+
if (!runDependencies) {
2293+
var resolve;
2294+
dependenciesPromise = new Promise((r) => resolve = r);
2295+
dependenciesPromise.resolve = resolve;
2296+
}
22892297
runDependencies++;
22902298

22912299
#if expectToReceiveOnModule('monitorRunDependencies')
@@ -2328,7 +2336,7 @@ addToLibrary({
23282336
#endif
23292337
},
23302338

2331-
$removeRunDependency__deps: ['$runDependencies', '$dependenciesFulfilled',
2339+
$removeRunDependency__deps: ['$runDependencies', '$dependenciesPromise',
23322340
#if ASSERTIONS
23332341
'$runDependencyTracking',
23342342
'$runDependencyWatcher',
@@ -2349,18 +2357,14 @@ addToLibrary({
23492357
assert(runDependencyTracking[id]);
23502358
delete runDependencyTracking[id];
23512359
#endif
2352-
if (runDependencies == 0) {
2360+
if (!runDependencies) {
23532361
#if ASSERTIONS
23542362
if (runDependencyWatcher !== null) {
23552363
clearInterval(runDependencyWatcher);
23562364
runDependencyWatcher = null;
23572365
}
23582366
#endif
2359-
if (dependenciesFulfilled) {
2360-
var callback = dependenciesFulfilled;
2361-
dependenciesFulfilled = null;
2362-
callback(); // can add another dependenciesFulfilled
2363-
}
2367+
dependenciesPromise.resolve();
23642368
}
23652369
},
23662370
#endif

src/postamble.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,11 @@ function stackCheckInit() {
134134
preRun();
135135

136136
#if '$runDependencies' in addedLibraryItems
137-
if (runDependencies > 0) {
137+
if (runDependencies) {
138138
#if RUNTIME_DEBUG
139139
dbg('run: waiting on runDependencies');
140140
#endif
141-
await new Promise((resolve) => dependenciesFulfilled = resolve);
141+
await resolveRunDependencies();
142142
}
143143
#endif
144144

test/codesize/test_codesize_file_preload.expected.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,22 +1305,25 @@ var FS_createDataFile = (...args) => FS.createDataFile(...args);
13051305

13061306
var getUniqueRunDependency = id => id;
13071307

1308-
var runDependencies = 0;
1308+
var dependenciesPromise = null;
1309+
1310+
var resolveRunDependencies = async () => dependenciesPromise;
13091311

1310-
var dependenciesFulfilled = null;
1312+
var runDependencies = 0;
13111313

13121314
var removeRunDependency = id => {
13131315
runDependencies--;
1314-
if (runDependencies == 0) {
1315-
if (dependenciesFulfilled) {
1316-
var callback = dependenciesFulfilled;
1317-
dependenciesFulfilled = null;
1318-
callback();
1319-
}
1316+
if (!runDependencies) {
1317+
dependenciesPromise.resolve();
13201318
}
13211319
};
13221320

13231321
var addRunDependency = id => {
1322+
if (!runDependencies) {
1323+
var resolve;
1324+
dependenciesPromise = new Promise(r => resolve = r);
1325+
dependenciesPromise.resolve = resolve;
1326+
}
13241327
runDependencies++;
13251328
};
13261329

@@ -3180,8 +3183,8 @@ function callMain() {
31803183

31813184
async function run() {
31823185
preRun();
3183-
if (runDependencies > 0) {
3184-
await new Promise(resolve => dependenciesFulfilled = resolve);
3186+
if (runDependencies) {
3187+
await resolveRunDependencies();
31853188
}
31863189
if (ABORT) return;
31873190
initRuntime();

test/codesize/test_codesize_file_preload.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"a.out.js": 22157,
3-
"a.out.js.gz": 9192,
2+
"a.out.js": 22138,
3+
"a.out.js.gz": 9190,
44
"a.out.nodebug.wasm": 1666,
55
"a.out.nodebug.wasm.gz": 945,
6-
"total": 23823,
7-
"total_gz": 10137,
6+
"total": 23804,
7+
"total_gz": 10135,
88
"sent": [
99
"a (fd_write)"
1010
],

test/codesize/test_codesize_hello_dylink_all.json

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"a.out.js": 268405,
3-
"a.out.nodebug.wasm": 587745,
4-
"total": 856150,
2+
"a.out.js": 268450,
3+
"a.out.nodebug.wasm": 587575,
4+
"total": 856025,
55
"sent": [
66
"IMG_Init",
77
"IMG_Load",
@@ -256,8 +256,6 @@
256256
"__syscall_rmdir",
257257
"__syscall_sendmsg",
258258
"__syscall_sendto",
259-
"__syscall_setsockopt",
260-
"__syscall_shutdown",
261259
"__syscall_socket",
262260
"__syscall_stat64",
263261
"__syscall_statfs64",
@@ -1777,8 +1775,6 @@
17771775
"env.__syscall_rmdir",
17781776
"env.__syscall_sendmsg",
17791777
"env.__syscall_sendto",
1780-
"env.__syscall_setsockopt",
1781-
"env.__syscall_shutdown",
17821778
"env.__syscall_socket",
17831779
"env.__syscall_stat64",
17841780
"env.__syscall_statfs64",
@@ -2231,6 +2227,8 @@
22312227
"__syscall_setpgid",
22322228
"__syscall_setpriority",
22332229
"__syscall_setsid",
2230+
"__syscall_setsockopt",
2231+
"__syscall_shutdown",
22342232
"__syscall_socketpair",
22352233
"__syscall_sync",
22362234
"__syscall_uname",
@@ -4098,7 +4096,8 @@
40984096
"$__syscall_setdomainname",
40994097
"$__syscall_setpgid",
41004098
"$__syscall_setpriority",
4101-
"$__syscall_socketpair",
4099+
"$__syscall_setsockopt",
4100+
"$__syscall_shutdown",
41024101
"$__syscall_sync",
41034102
"$__syscall_uname",
41044103
"$__syscall_wait4",
@@ -5090,7 +5089,6 @@
50905089
"$shm_open",
50915090
"$shm_unlink",
50925091
"$shr",
5093-
"$shutdown",
50945092
"$sift",
50955093
"$sigaddset",
50965094
"$sigaltstack",

0 commit comments

Comments
 (0)