Skip to content

Commit 9a10937

Browse files
sbc100mrolig5267319
authored andcommitted
[test] Fix test_pthread_run_on_main_thread under asan. NFC (emscripten-core#21301)
The output of this test is racey without this change and has been failing on the emscripten-releases waterfall in the asan configuration. We only just started caring about the precise output in emscripten-core#21296.
1 parent 7d5403e commit 9a10937

File tree

3 files changed

+31
-17
lines changed

3 files changed

+31
-17
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ jobs:
522522
asan.test_wasm_worker_hello
523523
asan.test_externref_emjs_dynlink
524524
asan.test_asyncify_longjmp
525+
asan.test_pthread_run_on_main_thread
525526
lsan.test_stdio_locking
526527
lsan.test_dlfcn_basic
527528
lsan.test_pthread_create

test/pthread/test_pthread_run_on_main_thread.c

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,80 +8,87 @@
88
#include <assert.h>
99
#include <math.h>
1010

11-
int v_called = 0;
11+
_Atomic int v_called = 0;
1212
void v() {
1313
assert(emscripten_is_main_runtime_thread());
1414
emscripten_outf("Hello!");
1515
v_called = 1;
1616
}
1717

18-
int vi_called = 0;
18+
_Atomic int vi_called = 0;
1919
void vi(int param0) {
2020
assert(emscripten_is_main_runtime_thread());
2121
emscripten_outf("Hello %d!", param0);
2222
vi_called = 1;
2323
}
2424

25-
int vii_called = 0;
25+
_Atomic int vii_called = 0;
2626
void vii(int param0, int param1) {
2727
assert(emscripten_is_main_runtime_thread());
2828
emscripten_outf("Hello %d %d!", param0, param1);
2929
vii_called = 1;
3030
}
3131

32-
int viii_called = 0;
32+
_Atomic int viii_called = 0;
3333
void viii(int param0, int param1, int param2) {
3434
assert(emscripten_is_main_runtime_thread());
3535
emscripten_outf("Hello %d %d %d!", param0, param1, param2);
3636
viii_called = 1;
3737
}
3838

39-
int i_called = 0;
39+
_Atomic int i_called = 0;
4040
int i() {
4141
assert(emscripten_is_main_runtime_thread());
4242
emscripten_outf("Hello i!");
4343
i_called = 1;
4444
return 84;
4545
}
4646

47-
int ii_called = 0;
47+
_Atomic int ii_called = 0;
4848
int ii(int param0) {
4949
assert(emscripten_is_main_runtime_thread());
5050
emscripten_outf("Hello ii %d!", param0);
5151
ii_called = 1;
5252
return 85;
5353
}
5454

55-
int iii_called = 0;
55+
_Atomic int iii_called = 0;
5656
int iii(int param0, int param1) {
5757
assert(emscripten_is_main_runtime_thread());
5858
emscripten_outf("Hello iii %d %d!", param0, param1);
5959
iii_called = 1;
6060
return 86;
6161
}
6262

63-
int iiii_called = 0;
63+
_Atomic int iiii_called = 0;
6464
int iiii(int param0, int param1, int param2) {
6565
assert(emscripten_is_main_runtime_thread());
6666
emscripten_outf("Hello iiii %d %d %d!", param0, param1, param2);
6767
iiii_called = 1;
6868
return 87;
6969
}
7070

71+
void reset_state() {
72+
v_called = vi_called = vii_called = viii_called = 0;
73+
i_called = ii_called = iii_called = iiii_called = 0;
74+
}
75+
7176
void test_sync() {
77+
reset_state();
7278
emscripten_outf("Testing sync proxied runs:");
7379
int ret;
74-
v_called = 0; emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_V, v); assert(v_called == 1);
75-
vi_called = 0; emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VI, vi, 42); assert(vi_called == 1);
76-
vii_called = 0; emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VII, vii, 42, 43); assert(vii_called == 1);
77-
viii_called = 0; emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, viii, 42, 43, 44); assert(viii_called == 1);
78-
i_called = 0; ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_I, i); assert(i_called == 1); assert(ret == 84);
79-
ii_called = 0; ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_II, ii, 42); assert(ii_called == 1); assert(ret == 85);
80-
iii_called = 0; ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_III, iii, 42, 43); assert(iii_called == 1); assert(ret == 86);
81-
iiii_called = 0; ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_IIII, iiii, 42, 43, 44); assert(iiii_called == 1); assert(ret == 87);
80+
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_V, v); assert(v_called == 1);
81+
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VI, vi, 42); assert(vi_called == 1);
82+
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VII, vii, 42, 43); assert(vii_called == 1);
83+
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, viii, 42, 43, 44); assert(viii_called == 1);
84+
ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_I, i); assert(i_called == 1); assert(ret == 84);
85+
ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_II, ii, 42); assert(ii_called == 1); assert(ret == 85);
86+
ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_III, iii, 42, 43); assert(iii_called == 1); assert(ret == 86);
87+
ret = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_IIII, iiii, 42, 43, 44); assert(iiii_called == 1); assert(ret == 87);
8288
}
8389

8490
void test_async() {
91+
reset_state();
8592
emscripten_outf("Testing async proxied runs:");
8693
emscripten_async_run_in_main_runtime_thread(EM_FUNC_SIG_V, v);
8794
emscripten_async_run_in_main_runtime_thread(EM_FUNC_SIG_VI, vi, 42);
@@ -91,6 +98,12 @@ void test_async() {
9198
emscripten_async_run_in_main_runtime_thread(EM_FUNC_SIG_II, ii, 42);
9299
emscripten_async_run_in_main_runtime_thread(EM_FUNC_SIG_III, iii, 42, 43);
93100
emscripten_async_run_in_main_runtime_thread(EM_FUNC_SIG_IIII, iiii, 42, 43, 44);
101+
102+
// Busy loop until all the async jobs are done
103+
while (!(v_called && vi_called && vii_called && viii_called &&
104+
i_called && ii_called && iii_called && iiii_called)) {
105+
sched_yield();
106+
}
94107
}
95108

96109
void test_async_waitable() {

test/pthread/test_pthread_run_on_main_thread.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ Hello ii 42!
2626
Hello iii 42 43!
2727
Hello iiii 42 43 44!
2828
Testing async proxied runs:
29-
Testing waitable async proxied runs:
3029
Hello!
3130
Hello 42!
3231
Hello 42 43!
@@ -35,6 +34,7 @@ Hello i!
3534
Hello ii 42!
3635
Hello iii 42 43!
3736
Hello iiii 42 43 44!
37+
Testing waitable async proxied runs:
3838
Hello!
3939
Hello 42!
4040
Hello 42 43!

0 commit comments

Comments
 (0)