-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Closed
Labels
Description
On windows, when using workers for compression it looks it's leaking thread-handles (not threads). This issue got reported by user of zstd-jni
but it looks that's issue with the underlying native code: luben/zstd-jni#203 - he was able to reproduce by using only the zstd
CLI.
I don't have Windows system to confirm or test a fix, but it looks we need to call https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle after joining the thread:
Lines 23 to 77 in 12c045f
#if defined(ZSTD_MULTITHREAD) && defined(_WIN32) | |
/** | |
* Windows minimalist Pthread Wrapper, based on : | |
* http://www.cse.wustl.edu/~schmidt/win32-cv-1.html | |
*/ | |
/* === Dependencies === */ | |
#include <process.h> | |
#include <errno.h> | |
/* === Implementation === */ | |
static unsigned __stdcall worker(void *arg) | |
{ | |
ZSTD_pthread_t* const thread = (ZSTD_pthread_t*) arg; | |
thread->arg = thread->start_routine(thread->arg); | |
return 0; | |
} | |
int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, | |
void* (*start_routine) (void*), void* arg) | |
{ | |
(void)unused; | |
thread->arg = arg; | |
thread->start_routine = start_routine; | |
thread->handle = (HANDLE) _beginthreadex(NULL, 0, worker, thread, 0, NULL); | |
if (!thread->handle) | |
return errno; | |
else | |
return 0; | |
} | |
int ZSTD_pthread_join(ZSTD_pthread_t thread, void **value_ptr) | |
{ | |
DWORD result; | |
if (!thread.handle) return 0; | |
result = WaitForSingleObject(thread.handle, INFINITE); | |
switch (result) { | |
case WAIT_OBJECT_0: | |
if (value_ptr) *value_ptr = thread.arg; | |
return 0; | |
case WAIT_ABANDONED: | |
return EINVAL; | |
default: | |
return GetLastError(); | |
} | |
} | |
#endif /* ZSTD_MULTITHREAD */ |
Cyan4973 and ub3rmind