[Mesa-dev] [PATCH 3/3] c11/threads: Don't implement thrd_current on Windows.
Brian Paul
brianp at vmware.com
Mon Mar 3 13:46:39 PST 2014
On 03/03/2014 02:41 PM, jfonseca at vmware.com wrote:
> From: José Fonseca <jfonseca at vmware.com>
>
> GetCurrentThread() returns a pseudo-handle (a constant which can only
> be used within the calling thread) and not a real handle.
>
> DuplicateHandle will return a real handle, but it will create a new handle
> every time we call. Calling
> DuplicateHandle here means we will leak handles, which is also very bad.
Can you fix the word wrapping in that paragraph?
Otherwise, the series LGTM. Reviewed-by: Brian Paul <brianp at vmware.com>
And these could probably go into the next stable release(s):
Cc: "10.0" "10.1" <mesa-stable at lists.freedesktop.org>
>
> In short, the Windows implementation of thrd_t needs a thorough make over.
> And it won't be pretty. It looks like C11 committee over-simplified
> things: it would be much better to have seperate objects for threads and
> thread IDs like C++11.
>
> For now, just comment out the thrd_current() implementation, so we get
> build errors if anybody tries to use them.
>
> Thanks to Brian Paul for spotting and diagnosing this problem.
> ---
> include/c11/threads_win32.h | 34 ++++++++++++++++++++++++++++++++--
> 1 file changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/include/c11/threads_win32.h b/include/c11/threads_win32.h
> index 771db94..d4c2a72 100644
> --- a/include/c11/threads_win32.h
> +++ b/include/c11/threads_win32.h
> @@ -492,12 +492,42 @@ thrd_create(thrd_t *thr, thrd_start_t func, void *arg)
> return thrd_success;
> }
>
> +#if 0
> // 7.25.5.2
> static inline thrd_t
> thrd_current(void)
> {
> - return GetCurrentThread();
> + HANDLE hCurrentThread;
> + BOOL bRet;
> +
> + /* GetCurrentThread() returns a pseudo-handle, which is useless. We need
> + * to call DuplicateHandle to get a real handle. However the handle value
> + * will not match the one returned by thread_create.
> + *
> + * Other potential solutions would be:
> + * - define thrd_t as a thread Ids, but this would mean we'd need to OpenThread for many operations
> + * - use malloc'ed memory for thrd_t. This would imply using TLS for current thread.
> + *
> + * Neither is particularly nice.
> + *
> + * Life would be much easier if C11 threads had different abstractions for
> + * threads and thread IDs, just like C++11 threads does...
> + */
> +
> + bRet = DuplicateHandle(GetCurrentProcess(), // source process (pseudo) handle
> + GetCurrentThread(), // source (pseudo) handle
> + GetCurrentProcess(), // target process
> + &hCurrentThread, // target handle
> + 0,
> + FALSE,
> + DUPLICATE_SAME_ACCESS);
> + assert(bRet);
> + if (!bRet) {
> + hCurrentThread = GetCurrentThread();
> + }
> + return hCurrentThread;
> }
> +#endif
>
> // 7.25.5.3
> static inline int
> @@ -511,7 +541,7 @@ thrd_detach(thrd_t thr)
> static inline int
> thrd_equal(thrd_t thr0, thrd_t thr1)
> {
> - return (thr0 == thr1);
> + return GetThreadId(thr0) == GetThreadId(thr1);
> }
>
> // 7.25.5.5
>
More information about the mesa-dev
mailing list