mapi: rewrite u_current_init() function without u_thread_self()
authorBrian Paul <brianp@vmware.com>
Thu, 5 Mar 2015 02:17:57 +0000 (19:17 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 5 Mar 2015 13:59:43 +0000 (06:59 -0700)
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>
src/mapi/u_current.c
src/mapi/u_thread.h

index eb77cc7772fc816a28d05d05f9313ca503a0cbd5..c1a486bd0e1bd4ce5d4ce808232fffe4f660936c 100644 (file)
@@ -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);
index 4dd95150d3fb88f1e753711b6b26a5810927c188..e57c69a243090215f6121012b340db1a2707ec94 100644 (file)
@@ -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)
 {