From: Seija Kijin <doremylover123@xxxxxxxxx> After joining threads, the handle to the original thread should be closed as it no longer needs to be open. Signed-off-by: Seija Kijin <doremylover123@xxxxxxxxx> --- win32: close handles of threads that have been joined After joining threads, the handle to the original thread should be closed as it no longer needs to be open. Signed-off-by: Seija Kijin doremylover123@xxxxxxxxx Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1406%2FAtariDreams%2Fjoin-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1406/AtariDreams/join-v1 Pull-Request: https://github.com/git/git/pull/1406 compat/win32/pthread.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/compat/win32/pthread.c b/compat/win32/pthread.c index 2e7eead42cb..de89667ef70 100644 --- a/compat/win32/pthread.c +++ b/compat/win32/pthread.c @@ -39,14 +39,20 @@ int win32_pthread_join(pthread_t *thread, void **value_ptr) { DWORD 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 err_win_to_posix(GetLastError()); + case WAIT_OBJECT_0: + if (value_ptr) + *value_ptr = thread->arg; + /* detach the thread once the join succeeds */ + CloseHandle(thread->handle); + return 0; + case WAIT_ABANDONED: + /* either thread is not joinable or another thread is waiting on + * this, so we do not detatch */ + return EINVAL; + default: + case WAIT_FAILED: + /* the function failed so we do not detach */ + return err_win_to_posix(GetLastError()); } } base-commit: 7c2ef319c52c4997256f5807564523dfd4acdfc7 -- gitgitgadget