git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v5] win32: close handles of threads that have been joined

From
RGRose via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 20, 2022, 21:18 UTC
Message-ID
<pull.1406.v5.git.git.1671571084753.gitgitgadget@gmail.com>
In-Reply-To
<pull.1406.v4.git.git.1671566641.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.

Because this only needs to happen if the WaitForSingleObject fails, the function was rewritten to accommodate this change.

The function is still POSIX compliant.
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.com
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1406%2FAtariDreams%2Fjoin-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1406/AtariDreams/join-v5
Pull-Request: https://github.com/git/git/pull/1406
Range-diff vs v4:
 1:  526ef7cc339 < -:  ----------- win32: close handles of threads that have been joined
 2:  2cb4d5c7007 ! 1:  94ed068d25b prep
     @@ Metadata
      Author: Seija Kijin <doremylover123@gmail.com>
      
       ## Commit message ##
     -    prep
     +    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.
     +
     +    Because this only needs to happen if the
     +    WaitForSingleObject fails, the function was
     +    rewritten to accommodate this change.
     +
     +    The function is still POSIX compliant.
      
          Signed-off-by: Seija Kijin <doremylover123@gmail.com>
      
       ## 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);
     +@@ compat/win32/pthread.c: int pthread_create(pthread_t *thread, const void *unused,
       
     - 	if (!thread->handle)
     - 		return errno;
     -@@ compat/win32/pthread.c: int win32_pthread_join(pthread_t *thread, void **value_ptr)
     + int win32_pthread_join(pthread_t *thread, void **value_ptr)
       {
     - 	DWORD result = WaitForSingleObject(thread->handle, INFINITE);
     - 	switch (result) {
     +-	DWORD result = WaitForSingleObject(thread->handle, INFINITE);
     +-	switch (result) {
      -		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)
     -+			*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 */
     ++	if (WaitForSingleObject(thread->handle, INFINITE) == WAIT_FAILED)
      +		return err_win_to_posix(GetLastError());
     ++
     ++	if (value_ptr) {
     ++		*value_ptr = thread->arg;
       	}
     ++
     ++	CloseHandle(thread->handle);
     ++	return 0;
       }
       
     + pthread_t pthread_self(void)
 compat/win32/pthread.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/compat/win32/pthread.c b/compat/win32/pthread.c
index 2e7eead42cb..7f8503b4b50 100644
--- a/compat/win32/pthread.c
+++ b/compat/win32/pthread.c
@@ -37,17 +37,15 @@ int pthread_create(pthread_t *thread, const void *unused,
 
 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());
+	if (WaitForSingleObject(thread->handle, INFINITE) == WAIT_FAILED)
+		return err_win_to_posix(GetLastError());
+
+	if (value_ptr) {
+		*value_ptr = thread->arg;
 	}
+
+	CloseHandle(thread->handle);
+	return 0;
 }
 
 pthread_t pthread_self(void)

base-commit: 7c2ef319c52c4997256f5807564523dfd4acdfc7
-- 
gitgitgadget
Previous: Seija Kijin via GitGitGadgetNext: Johannes Sixt
Message 9 of 41 in “win32: close handles of threads that have been joined”
  1. win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 19, 2022
  2. Ævar Arnfjörð BjarmasonDec 19, 2022
  3. Johannes SixtDec 20, 2022
  4. win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 20, 2022
  5. win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 20, 2022
  6. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 20, 2022
  7. 1/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 20, 2022
  8. 2/2 prepSeija Kijin via GitGitGadget, Dec 20, 2022
  9. win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 20, 2022
  10. Johannes SixtDec 20, 2022
  11. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 21, 2022
  12. 1/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 21, 2022
  13. 2/2 prepSeija Kijin via GitGitGadget, Dec 21, 2022
  14. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 21, 2022
  15. 2/2 prepSeija Kijin via GitGitGadget, Dec 21, 2022
  16. 1/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 21, 2022
  17. Johannes SixtDec 22, 2022
  18. win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 22, 2022
  19. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 22, 2022
  20. 2/2 prep: reformat pthread.c to fit coding guidelinesSeija Kijin via GitGitGadget, Dec 22, 2022
  21. Junio C HamanoDec 23, 2022
  22. 1/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 22, 2022
  23. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 23, 2022
  24. 1/2 win32-pthread: prepare pthread.c for change by formattingSeija Kijin via GitGitGadget, Dec 23, 2022
  25. 2/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 23, 2022
  26. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 23, 2022
  27. 1/2 win32-pthread: prepare pthread.c for change by formattingSeija Kijin via GitGitGadget, Dec 23, 2022
  28. 2/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 23, 2022
  29. René ScharfeDec 24, 2022
  30. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Dec 25, 2022
  31. 2/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Dec 25, 2022
  32. Junio C HamanoDec 26, 2022
  33. 1/2 win32-pthread: prepare pthread.c for change by formattingSeija Kijin via GitGitGadget, Dec 25, 2022
  34. Junio C HamanoDec 26, 2022
  35. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Jan 3, 2023
  36. 1/2 win32: prepare pthread.c for change by formattingSeija Kijin via GitGitGadget, Jan 3, 2023
  37. 2/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Jan 3, 2023
  38. 0/2 win32: close handles of threads that have been joinedRose via GitGitGadget, Jan 5, 2023
  39. 1/2 win32: prepare pthread.c for change by formattingSeija Kijin via GitGitGadget, Jan 5, 2023
  40. 2/2 win32: close handles of threads that have been joinedSeija Kijin via GitGitGadget, Jan 5, 2023
  41. Junio C HamanoJan 6, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.