diff options
-rw-r--r-- | src/mapi/u_current.c | 43 | ||||
-rw-r--r-- | src/mapi/u_thread.h | 24 |
2 files changed, 40 insertions, 27 deletions
diff --git a/src/mapi/u_current.c b/src/mapi/u_current.c index eb77cc7772f..c1a486bd0e1 100644 --- a/src/mapi/u_current.c +++ b/src/mapi/u_current.c @@ -146,6 +146,43 @@ u_current_init_tsd(void) */ static mtx_t ThreadCheckMutex = _MTX_INITIALIZER_NP; + +#ifdef _WIN32 +typedef DWORD thread_id; +#else +typedef thrd_t thread_id; +#endif + + +static inline thread_id +get_thread_id(void) +{ + /* + * XXX: Callers of of this function assume it is a lightweight function. + * But unfortunately C11's thrd_current() gives no such guarantees. In + * fact, it's pretty hard to have a compliant implementation of + * thrd_current() on Windows with such characteristics. So for now, we + * side-step this mess and use Windows thread primitives directly here. + */ +#ifdef _WIN32 + return GetCurrentThreadId(); +#else + return thrd_current(); +#endif +} + + +static inline int +thread_id_equal(thread_id t1, thread_id t2) +{ +#ifdef _WIN32 + return t1 == t2; +#else + return thrd_equal(t1, t2); +#endif +} + + /** * We should call this periodically from a function such as glXMakeCurrent * in order to test if multiple threads are being used. @@ -153,7 +190,7 @@ static mtx_t ThreadCheckMutex = _MTX_INITIALIZER_NP; void u_current_init(void) { - static unsigned long knownID; + static thread_id knownID; static int firstCall = 1; if (ThreadSafe) @@ -163,10 +200,10 @@ u_current_init(void) if (firstCall) { u_current_init_tsd(); - knownID = u_thread_self(); + knownID = get_thread_id(); firstCall = 0; } - else if (knownID != u_thread_self()) { + else if (!thread_id_equal(knownID, get_thread_id())) { ThreadSafe = 1; u_current_set_table(NULL); u_current_set_context(NULL); diff --git a/src/mapi/u_thread.h b/src/mapi/u_thread.h index 4dd95150d3f..e57c69a2430 100644 --- a/src/mapi/u_thread.h +++ b/src/mapi/u_thread.h @@ -80,30 +80,6 @@ struct u_tsd { }; -static inline unsigned long -u_thread_self(void) -{ - /* - * XXX: Callers of u_thread_self assume it is a lightweight function, - * returning a numeric value. But unfortunately C11's thrd_current() gives - * no such guarantees. In fact, it's pretty hard to have a compliant - * implementation of thrd_current() on Windows with such characteristics. - * So for now, we side-step this mess and use Windows thread primitives - * directly here. - * - * FIXME: On the other hand, u_thread_self() is a bad - * abstraction. Even with pthreads, there is no guarantee that - * pthread_self() will return numeric IDs -- we should be using - * pthread_equal() instead of assuming we can compare thread ids... - */ -#ifdef _WIN32 - return GetCurrentThreadId(); -#else - return (unsigned long) (uintptr_t) thrd_current(); -#endif -} - - static inline void u_tsd_init(struct u_tsd *tsd) { |