11#include <assert.h>
2+ #include <stdlib.h>
23#include <wasi/api.h>
34
45static const int64_t SECOND = 1000 * 1000 * 1000 ;
56
6- typedef struct {
7+ typedef struct
8+ {
9+ char * stack ;
710 int th_ready ;
811 int th_continue ;
912 int th_done ;
@@ -12,16 +15,16 @@ typedef struct {
1215 int value ;
1316} shared_t ;
1417
15- __attribute__((export_name ("wasi_thread_start" ))) void
16- wasi_thread_start (int thread_id , int * start_arg )
18+ void __wasi_thread_start_C (int thread_id , int * start_arg )
1719{
1820 shared_t * data = (shared_t * )start_arg ;
1921
2022 data -> th_ready = 1 ;
2123 __builtin_wasm_memory_atomic_notify (& data -> th_ready , 1 );
2224
2325 // so we can have all the threads alive at the same time
24- if (__builtin_wasm_memory_atomic_wait32 (& data -> th_continue , 0 , SECOND ) == 2 ) {
26+ if (__builtin_wasm_memory_atomic_wait32 (& data -> th_continue , 0 , SECOND ) == 2 )
27+ {
2528 data -> failed = 1 ;
2629 return ;
2730 }
@@ -35,36 +38,42 @@ wasi_thread_start(int thread_id, int *start_arg)
3538 __builtin_wasm_memory_atomic_notify (& data -> th_done , 1 );
3639}
3740
38- int
39- main (int argc , char * * argv )
41+ int main (int argc , char * * argv )
4042{
41- shared_t data [3 ] = { 0 };
43+ shared_t data [3 ] = {0 };
44+ int tid [3 ];
4245 int data_count = sizeof (data ) / sizeof (data [0 ]);
4346 int i , j ;
4447
45- for (i = 0 ; i < data_count ; i ++ ) {
48+ for (i = 0 ; i < data_count ; i ++ )
49+ {
50+ data [i ].stack = malloc (128 );
4651 data [i ].value = 52 ;
47- assert (__wasi_thread_spawn (& data [i ]) == 0 );
52+ tid [i ] = __wasi_thread_spawn (& data [i ]);
53+ assert (tid [i ] > 0 );
4854 assert (__builtin_wasm_memory_atomic_wait32 (& data [i ].th_ready , 0 ,
49- SECOND )
50- != 2 ); // not a timeout
55+ SECOND ) != 2 ); // not a timeout
5156 }
5257
53- for (i = 0 ; i < data_count ; i ++ ) {
58+ for (i = 0 ; i < data_count ; i ++ )
59+ {
5460 __builtin_wasm_memory_atomic_notify (& data [i ].th_continue , 1 );
5561 }
5662
57- for (i = 0 ; i < data_count ; i ++ ) {
63+ for (i = 0 ; i < data_count ; i ++ )
64+ {
5865 assert (__builtin_wasm_memory_atomic_wait32 (& data [i ].th_done , 0 ,
59- SECOND )
60- != 2 ); // not a timeout
66+ SECOND ) != 2 ); // not a timeout
67+ assert ( data [ i ]. tid == tid [ i ]);
6168 assert (data [i ].value == 60 );
6269
63- for (j = i + 1 ; j < data_count ; j ++ ) {
70+ for (j = i + 1 ; j < data_count ; j ++ )
71+ {
6472 assert (data [i ].tid != data [j ].tid );
6573 }
6674
6775 assert (data [i ].failed == 0 );
76+ free (data [i ].stack );
6877 }
6978
7079 return 0 ;
0 commit comments