@@ -117,6 +117,9 @@ typedef struct {
117117 double sec ;
118118 JanetVM * vm ;
119119 JanetFiber * fiber ;
120+ #ifdef JANET_WINDOWS
121+ HANDLE cancel_event ;
122+ #endif
120123} JanetThreadedTimeout ;
121124
122125#define JANET_MAX_Q_CAPACITY 0x7FFFFFF
@@ -620,10 +623,14 @@ static void janet_timeout_stop(int sig_num) {
620623static void handle_timeout_worker (JanetTimeout to , int cancel ) {
621624 if (!to .has_worker ) return ;
622625#ifdef JANET_WINDOWS
623- (void ) cancel ;
624- QueueUserAPC (janet_timeout_stop , to .worker , 0 );
626+ if (cancel && to .worker_event ) {
627+ SetEvent (to .worker_event );
628+ }
625629 WaitForSingleObject (to .worker , INFINITE );
626630 CloseHandle (to .worker );
631+ if (to .worker_event ) {
632+ CloseHandle (to .worker_event );
633+ }
627634#else
628635#ifdef JANET_ANDROID
629636 if (cancel ) janet_assert (!pthread_kill (to .worker , SIGUSR1 ), "pthread_kill" );
@@ -693,10 +700,13 @@ static void janet_timeout_cb(JanetEVGenericMessage msg) {
693700static DWORD WINAPI janet_timeout_body (LPVOID ptr ) {
694701 JanetThreadedTimeout tto = * (JanetThreadedTimeout * )ptr ;
695702 janet_free (ptr );
696- SleepEx ((DWORD )(tto .sec * 1000 ), TRUE);
697- janet_interpreter_interrupt (tto .vm );
698- JanetEVGenericMessage msg = {0 };
699- janet_ev_post_event (tto .vm , janet_timeout_cb , msg );
703+ DWORD res = WaitForSingleObject (tto .cancel_event , (DWORD )(tto .sec * 1000 ));
704+ /* only send interrupt message if result is WAIT_TIMEOUT */
705+ if (res == WAIT_TIMEOUT ) {
706+ janet_interpreter_interrupt (tto .vm );
707+ JanetEVGenericMessage msg = {0 };
708+ janet_ev_post_event (tto .vm , janet_timeout_cb , msg );
709+ }
700710 return 0 ;
701711}
702712#else
@@ -3270,6 +3280,12 @@ JANET_CORE_FN(cfun_ev_deadline,
32703280 tto -> vm = & janet_vm ;
32713281 tto -> fiber = tocheck ;
32723282#ifdef JANET_WINDOWS
3283+ HANDLE cancel_event = CreateEvent (NULL , TRUE, FALSE, NULL );
3284+ if (NULL == cancel_event ) {
3285+ janet_free (tto );
3286+ janet_panic ("failed to create cancel event" );
3287+ }
3288+ tto -> cancel_event = cancel_event ;
32733289 HANDLE worker = CreateThread (NULL , 0 , janet_timeout_body , tto , 0 , NULL );
32743290 if (NULL == worker ) {
32753291 janet_free (tto );
@@ -3285,6 +3301,9 @@ JANET_CORE_FN(cfun_ev_deadline,
32853301#endif
32863302 to .has_worker = 1 ;
32873303 to .worker = worker ;
3304+ #ifdef JANET_WINDOWS
3305+ to .worker_event = cancel_event ;
3306+ #endif
32883307 } else {
32893308 to .has_worker = 0 ;
32903309 }
0 commit comments