mapi: rewrite u_current_init() function without u_thread_self()
Remove u_thread_self() since u_thread.h is going away soon. Create a simple thread ID abstraction which wraps WIN32 or c11 threads. This also gets rid of the questionable casting of thrd_t to an unsigned long. Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: José Fonseca <jfonseca@vmware.com>
This commit is contained in:
@@ -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);
|
||||
|
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user