Merge branch 'sk/win32-close-handle-upon-pthread-join'

Pthread emulation on Win32 leaked thread handle when a thread is
joined.

* sk/win32-close-handle-upon-pthread-join:
  win32: close handles of threads that have been joined
  win32: prepare pthread.c for change by formatting
This commit is contained in:
Junio C Hamano 2023-01-23 13:39:51 -08:00
commit 6e0f966efe
1 changed files with 14 additions and 11 deletions

View File

@ -22,12 +22,12 @@ 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;
@ -39,14 +39,17 @@ 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;
CloseHandle(thread->handle);
return 0;
case WAIT_ABANDONED:
CloseHandle(thread->handle);
return EINVAL;
default:
/* the wait failed, so do not detach */
return err_win_to_posix(GetLastError());
}
}