[PATCH v2] win32: close handles of threads that have been joined
- From
- Rose via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Dec 20, 2022, 18:57 UTC
- Message-ID
- <pull.1406.v2.git.git.1671562663899.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1406.git.git.1671474876207.gitgitgadget@gmail.com>
From: Seija Kijin <doremylover123@gmail.com>
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@gmail.com>
---
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@gmail.comPublished-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1406%2FAtariDreams%2Fjoin-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1406/AtariDreams/join-v2 Pull-Request: https://github.com/git/git/pull/1406
Range-diff vs v1:
1: e53b274ab4b ! 1: 8b20c4149be win32: close handles of threads that have been joined
@@ compat/win32/pthread.c: int win32_pthread_join(pthread_t *thread, void **value_p
+ return 0;
+ case WAIT_ABANDONED:
+ /* either thread is not joinable or another thread is waiting on
-+ * this, so we do not detatch */
++ * this, so do not detatch */
+ return EINVAL;
-+ default:
+ case WAIT_FAILED:
++ default:
+ /* the function failed so we do not detach */
+ return err_win_to_posix(GetLastError());
}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..0d62c45ecc2 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 do not detatch */ + return EINVAL; + case WAIT_FAILED: + default: + /* the function failed so we do not detach */ + return err_win_to_posix(GetLastError()); } } base-commit: 7c2ef319c52c4997256f5807564523dfd4acdfc7
-- gitgitgadget