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

Re: [PATCH] win32: use _endthreadex to terminate threads, not ExitThread

From
Johannes Sixt <j6t@kdbg.org>
Date
Dec 24, 2022, 08:01 UTC
Message-ID
<0b039029-97ce-bbc3-d9af-7f1eb1fd8b64@kdbg.org>
In-Reply-To
<pull.1414.git.git.1671742750504.gitgitgadget@gmail.com>
Am 22.12.22 um 21:59 schrieb Rose via GitGitGadget:
Show 16 quoted lines
> From: Seija Kijin <doremylover123@gmail.com>
> 
> This is a pretty serious bug actually:
> Because we use the C runtime and
> use _beginthreadex to create pthreads,
> pthread_exit MUST use _endthreadex.
> 
> Otherwise, according to Microsoft:
> "Failure to do so results in small
> memory leaks when the thread
> calls ExitThread."
> 
> Simply put, this is not the same as ExitThread.
> 
> Signed-off-by: Seija Kijin <doremylover123@gmail.com>
> ---
Show 16 quoted lines
>  compat/win32/pthread.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h
> index 737983d00ba..cc3221cb2c8 100644
> --- a/compat/win32/pthread.h
> +++ b/compat/win32/pthread.h
> @@ -66,7 +66,7 @@ pthread_t pthread_self(void);
>  
>  static inline void NORETURN pthread_exit(void *ret)
>  {
> -	ExitThread((DWORD)(intptr_t)ret);
> +	_endthreadex((unsigned)(uintptr_t)ret);
>  }
>  
>  typedef DWORD pthread_key_t;
Nice find! FWIW, this passes the test suite on Windows.
The patch text is:
Acked-by: Johannes Sixt <j6t@kdbg.org>

The commit message is highly exaggerated, though. The bug is by no means serious. After all, we've been living with it for a decade. Notice that pthread_exit() is only called when a thread runs into die(). Even though we have a small memory leak, it does not occur in a loop because, after one thread dies, we do not tend to keep starting many, many more that all die.

-- Hannes
Previous: Rose via GitGitGadgetNext: Rose via GitGitGadget
Message 2 of 5 in “win32: use _endthreadex to terminate threads, not ExitThread”
  1. win32: use _endthreadex to terminate threads, not ExitThreadRose via GitGitGadget, Dec 22, 2022
  2. Johannes SixtDec 24, 2022
  3. win32: use _endthreadex to terminate threads, not ExitThreadRose via GitGitGadget, Dec 25, 2022
  4. Johannes SixtDec 25, 2022
  5. Junio C HamanoDec 25, 2022

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.