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 Seija Kijin (2): win32: close handles of threads that have been joined prep compat/win32/pthread.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) base-commit: 7c2ef319c52c4997256f5807564523dfd4acdfc7 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1406%2FAtariDreams%2Fjoin-v4 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1406/AtariDreams/join-v4 Pull-Request: https://github.com/git/git/pull/1406 Range-diff vs v3: -: ----------- > 1: 526ef7cc339 win32: close handles of threads that have been joined 1: 2049576b193 ! 2: 2cb4d5c7007 win32: close handles of threads that have been joined @@ Metadata Author: Seija Kijin <doremylover123@xxxxxxxxx> ## Commit message ## - 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. + prep Signed-off-by: Seija Kijin <doremylover123@xxxxxxxxx> ## compat/win32/pthread.c ## +@@ compat/win32/pthread.c: static unsigned __stdcall win32_start_routine(void *arg) + } + + int pthread_create(pthread_t *thread, const void *unused, +- void *(*start_routine)(void*), void *arg) ++ void *(*start_routine)(void *), void *arg) + { + thread->arg = arg; + thread->start_routine = start_routine; +- thread->handle = (HANDLE) +- _beginthreadex(NULL, 0, win32_start_routine, thread, 0, NULL); ++ thread->handle = (HANDLE)_beginthreadex(NULL, 0, win32_start_routine, ++ thread, 0, NULL); + + if (!thread->handle) + return errno; @@ compat/win32/pthread.c: int win32_pthread_join(pthread_t *thread, void **value_ptr) { DWORD result = WaitForSingleObject(thread->handle, INFINITE); @@ compat/win32/pthread.c: int win32_pthread_join(pthread_t *thread, void **value_p - 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 do not detatch */ - return EINVAL; - default: +- /* the function failed, so do not detach */ - return err_win_to_posix(GetLastError()); + case WAIT_OBJECT_0: + if (value_ptr) @@ compat/win32/pthread.c: int win32_pthread_join(pthread_t *thread, void **value_p + CloseHandle(thread->handle); + return 0; + case WAIT_ABANDONED: -+ /* either thread is not joinable or another thread is waiting on -+ * this, so do not detatch */ ++ /* either thread is not joinable or another thread is ++ * waiting on this, so do not detatch */ + return EINVAL; -+ case WAIT_FAILED: + default: + /* the function failed, so do not detach */ + return err_win_to_posix(GetLastError()); -- gitgitgadget