44
55#define IS32BIT (x ) !((x)+0x80000000ULL>>32)
66
7+ #ifdef __EMSCRIPTEN__
8+ #include <signal.h>
9+ #include <stdio.h>
10+ #include <emscripten/emscripten.h>
11+ static double _emscripten_timers [3 ];
12+ static double _emscripten_intervals [3 ];
13+
14+ #define MAX (a ,b ) ((a)>(b)?(a):(b))
15+
16+ int _setitimer_js (int which , double timeout );
17+
18+ void __getitimer (int which , struct itimerval * old , double now )
19+ {
20+ double remaining_ms = MAX (_emscripten_timers [which ] - now , 0 );
21+ old -> it_value .tv_sec = remaining_ms / 1000 ;
22+ old -> it_value .tv_usec = remaining_ms * 1000 ;
23+ old -> it_interval .tv_sec = _emscripten_intervals [which ] / 1000 ;
24+ old -> it_interval .tv_usec = _emscripten_intervals [which ] * 1000 ;
25+ }
26+
27+ void _emscripten_timeout (int which , double now )
28+ {
29+ int signum = SIGALRM ;
30+ if (which == ITIMER_PROF ) {
31+ signum = SIGPROF ;
32+ } else if (which == ITIMER_VIRTUAL ) {
33+ signum = SIGVTALRM ;
34+ }
35+ int next_timeout = _emscripten_intervals [which ];
36+ if (next_timeout ) {
37+ _emscripten_timers [which ] = now + next_timeout ;
38+ } else {
39+ _emscripten_timers [which ] = 0 ;
40+ }
41+ _setitimer_js (which , next_timeout );
42+ raise (signum );
43+ }
44+
45+ void _emscripten_check_timers (double now )
46+ {
47+ if (!now ) now = emscripten_get_now ();
48+ for (int which = 0 ; which < 3 ; which ++ ) {
49+ if (_emscripten_timers [which ] && now >= _emscripten_timers [which ]) {
50+ _emscripten_timeout (which , now );
51+ }
52+ }
53+ }
54+ #endif
55+
756int setitimer (int which , const struct itimerval * restrict new , struct itimerval * restrict old )
857{
58+ #ifdef __EMSCRIPTEN__
59+ if (which > ITIMER_PROF ) return EINVAL ;
60+ double now = emscripten_get_now ();
61+ if (old ) {
62+ __getitimer (which , old , now );
63+ }
64+ if (new -> it_value .tv_sec || new -> it_value .tv_usec ) {
65+ _emscripten_timers [which ] = now + new -> it_value .tv_sec * 1000 + new -> it_value .tv_usec / 1000 ;
66+ _emscripten_intervals [which ] = new -> it_interval .tv_sec * 1000 + new -> it_interval .tv_usec / 1000 ;
67+ } else {
68+ _emscripten_timers [which ] = 0 ;
69+ _emscripten_intervals [which ] = 0 ;
70+ }
71+ return _setitimer_js (which , new -> it_value .tv_sec * 1000 + new -> it_value .tv_usec / 1000 );
72+ #else
973 if (sizeof (time_t ) > sizeof (long )) {
1074 time_t is = new -> it_interval .tv_sec , vs = new -> it_value .tv_sec ;
1175 long ius = new -> it_interval .tv_usec , vus = new -> it_value .tv_usec ;
@@ -23,4 +87,5 @@ int setitimer(int which, const struct itimerval *restrict new, struct itimerval
2387 return __syscall_ret (r );
2488 }
2589 return syscall (SYS_setitimer , which , new , old );
90+ #endif
2691}
0 commit comments