1
0
mirror of https://github.com/janet-lang/janet synced 2025-06-05 16:14:12 +00:00

Avoid leaking memory used for JanetThreadedTimeout struct

This commit is contained in:
Michael Camilleri 2025-03-25 22:02:53 +09:00
parent a24e5b1eaa
commit eac37ab869
No known key found for this signature in database
GPG Key ID: 7EB218A48DF8B572

View File

@ -661,28 +661,30 @@ static void janet_timeout_cb(JanetEVGenericMessage msg) {
#ifdef JANET_WINDOWS #ifdef JANET_WINDOWS
static DWORD WINAPI janet_timeout_body(LPVOID ptr) { static DWORD WINAPI janet_timeout_body(LPVOID ptr) {
JanetThreadedTimeout *tto = (JanetThreadedTimeout *)ptr; JanetThreadedTimeout tto = *(JanetThreadedTimeout *)ptr;
SleepEx((DWORD)(tto->sec * 1000), TRUE); janet_free(ptr);
if (janet_fiber_can_resume(tto->fiber)) { SleepEx((DWORD)(tto.sec * 1000), TRUE);
janet_interpreter_interrupt(tto->vm); if (janet_fiber_can_resume(tto.fiber)) {
janet_interpreter_interrupt(tto.vm);
JanetEVGenericMessage msg = {0}; JanetEVGenericMessage msg = {0};
janet_ev_post_event(tto->vm, janet_timeout_cb, msg); janet_ev_post_event(tto.vm, janet_timeout_cb, msg);
} }
return 0; return 0;
} }
#else #else
static void *janet_timeout_body(void *ptr) { static void *janet_timeout_body(void *ptr) {
JanetThreadedTimeout *tto = (JanetThreadedTimeout *)ptr; JanetThreadedTimeout tto = *(JanetThreadedTimeout *)ptr;
janet_free(ptr);
struct timespec ts; struct timespec ts;
ts.tv_sec = (time_t) tto->sec; ts.tv_sec = (time_t) tto.sec;
ts.tv_nsec = (tto->sec <= UINT32_MAX) ts.tv_nsec = (tto.sec <= UINT32_MAX)
? (long)((tto->sec - ((uint32_t)tto->sec)) * 1000000000) ? (long)((tto.sec - ((uint32_t)tto.sec)) * 1000000000)
: 0; : 0;
nanosleep(&ts, &ts); nanosleep(&ts, &ts);
if (janet_fiber_can_resume(tto->fiber)) { if (janet_fiber_can_resume(tto.fiber)) {
janet_interpreter_interrupt(tto->vm); janet_interpreter_interrupt(tto.vm);
JanetEVGenericMessage msg = {0}; JanetEVGenericMessage msg = {0};
janet_ev_post_event(tto->vm, janet_timeout_cb, msg); janet_ev_post_event(tto.vm, janet_timeout_cb, msg);
} }
return NULL; return NULL;
} }