Hi Paul,
On 01/31/16 22:58, Paul Gofman wrote:
> + /* _beginthread: handle is not closed on ExitProcess and _endthreadex */
> + hThread = (HANDLE)_beginthread(test_thread_func, 0, (void*)0);
> + Sleep(150);
> + ret = WaitForSingleObject(hThread, INFINITE);
> + ok(ret == WAIT_FAILED, "ret = %d\n", ret);
This test may fail if for some reason thread has not finished during
150ms sleep. You can workaround this issue following way:
hThread = (HANDLE)_beginthread(test_thread_func, 0, (void*)0);
ok(hThread != INVALID_HANDLE_VALUE, "_beginthread failed (%d)\n", errno);
WaitForSingleObject(hThread, INFINITE);
ret = CloseHandle(hThread);
ok(!ret, "ret = %d\n", ret);
> @@ -69,6 +69,9 @@ static DWORD CALLBACK _beginthread_trampoline(LPVOID arg)
> MSVCRT_free(arg);
>
> local_trampoline.start_address(local_trampoline.arglist);
> +
> + CloseHandle(data->handle);
> + data->handle = NULL;
According to MSDN _endthread should be called here. Because it's
documented I think we should implement it in similar way.
> @@ -136,8 +139,18 @@ MSVCRT_uintptr_t CDECL _beginthreadex(
> */
> void CDECL _endthread(void)
> {
> + thread_data_t *tls;
> +
> TRACE("(void)\n");
>
> + tls = TlsGetValue(msvcrt_tls_index);
> + if (tls && tls->handle)
You should check for INVALID_HANDLE_VALUE instead of NULL here. It's
doesn't really matter but for sake of consistency tls->handle should be
set to INVALID_HANDLE_VALUE after close.
Thanks,
Piotr