Skip to content

Commit aca5428

Browse files
committed
Use SetEvent rather than QueueUserAPC on Windows
1 parent 8e7b1e9 commit aca5428

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

src/core/ev.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
620623
static 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) {
693700
static 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
}

src/core/state.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ typedef struct {
6565
int has_worker;
6666
#ifdef JANET_WINDOWS
6767
HANDLE worker;
68+
HANDLE worker_event;
6869
#else
6970
pthread_t worker;
7071
#endif

0 commit comments

Comments
 (0)