Thread safety for Win32. SourceForge bug #1507315.
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 16 Jun 2006 14:50:05 +0000 (14:50 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 16 Jun 2006 14:50:05 +0000 (14:50 +0000)
src/mesa/drivers/windows/gdi/InitCritSections.cpp [new file with mode: 0644]
src/mesa/glapi/glapi.c
src/mesa/glapi/glthread.c
src/mesa/glapi/glthread.h

diff --git a/src/mesa/drivers/windows/gdi/InitCritSections.cpp b/src/mesa/drivers/windows/gdi/InitCritSections.cpp
new file mode 100644 (file)
index 0000000..7145bff
--- /dev/null
@@ -0,0 +1,32 @@
+#include "glapi.h"
+#include "glThread.h"
+
+#ifdef WIN32_THREADS
+extern "C" _glthread_Mutex OneTimeLock;
+extern "C" _glthread_Mutex GenTexturesLock;
+
+extern "C" void FreeAllTSD(void);
+
+class _CriticalSectionInit
+{
+public:
+       static _CriticalSectionInit     m_inst;
+
+       _CriticalSectionInit()
+       {
+               _glthread_INIT_MUTEX(OneTimeLock);
+               _glthread_INIT_MUTEX(GenTexturesLock);
+       }
+
+       ~_CriticalSectionInit()
+       {
+               _glthread_DESTROY_MUTEX(OneTimeLock);
+               _glthread_DESTROY_MUTEX(GenTexturesLock);
+               FreeAllTSD();
+       }
+};
+
+_CriticalSectionInit _CriticalSectionInit::m_inst;
+
+
+#endif
index e353dd4..c095de3 100644 (file)
@@ -185,6 +185,15 @@ static GLboolean ThreadSafe = GL_FALSE;  /**< In thread-safe mode? */
 _glthread_TSD _gl_DispatchTSD;           /**< Per-thread dispatch pointer */
 static _glthread_TSD ContextTSD;         /**< Per-thread context pointer */
 
+#if defined(WIN32_THREADS)
+void FreeTSD(_glthread_TSD *p);
+void FreeAllTSD(void)
+{
+   FreeTSD(&_gl_DispatchTSD);
+   FreeTSD(&ContextTSD);
+}
+#endif /* defined(WIN32_THREADS) */
+
 #endif /* defined(THREADS) */
 
 PUBLIC struct _glapi_table *_glapi_Dispatch = 
index 0683c1e..4513853 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  6.5.1
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -186,11 +185,23 @@ _glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
  */
 #ifdef WIN32_THREADS
 
+void FreeTSD(_glthread_TSD *p)
+{
+   if (p->initMagic==INIT_MAGIC) {
+      TlsFree(p->key);
+      p->initMagic=0;
+   }
+}
+
+void InsteadOf_exit(int nCode)
+{
+   DWORD dwErr=GetLastError();
+}
+
 unsigned long
 _glthread_GetID(void)
 {
-   abort();   /* XXX not implemented yet */
-   return (unsigned long) 0;
+   return GetCurrentThreadId();
 }
 
 
@@ -198,11 +209,9 @@ void
 _glthread_InitTSD(_glthread_TSD *tsd)
 {
    tsd->key = TlsAlloc();
-   if (tsd->key == 0xffffffff) {
-      /* Can Windows handle stderr messages for non-console
-         applications? Does Windows have perror? */
-      /* perror(SET_INIT_ERROR);*/
-      exit(-1);
+   if (tsd->key == TLS_OUT_OF_INDEXES) {
+      perror("Mesa:_glthread_InitTSD");
+      InsteadOf_exit(-1);
    }
    tsd->initMagic = INIT_MAGIC;
 }
@@ -227,10 +236,8 @@ _glthread_SetTSD(_glthread_TSD *tsd, void *ptr)
       _glthread_InitTSD(tsd);
    }
    if (TlsSetValue(tsd->key, ptr) == 0) {
-      /* Can Windows handle stderr messages for non-console
-         applications? Does Windows have perror? */
-      /* perror(SET_TSD_ERROR);*/
-      exit(-1);
+         perror("Mesa:_glthread_SetTSD");
+         InsteadOf_exit(-1);
    }
 }
 
index 53592aa..0958cd1 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.3
+ * Version:  6.5.1
  *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -163,12 +163,11 @@ typedef HANDLE _glthread_Thread;
 
 typedef CRITICAL_SECTION _glthread_Mutex;
 
-/* XXX need to really implement mutex-related macros */
-#define _glthread_DECLARE_STATIC_MUTEX(name)  static _glthread_Mutex name = 0
-#define _glthread_INIT_MUTEX(name)  (void) name
-#define _glthread_DESTROY_MUTEX(name)  (void) name
-#define _glthread_LOCK_MUTEX(name)  (void) name
-#define _glthread_UNLOCK_MUTEX(name)  (void) name
+#define _glthread_DECLARE_STATIC_MUTEX(name)  /*static*/ _glthread_Mutex name = {0,0,0,0,0,0}
+#define _glthread_INIT_MUTEX(name)  InitializeCriticalSection(&name)
+#define _glthread_DESTROY_MUTEX(name)  DeleteCriticalSection(&name)
+#define _glthread_LOCK_MUTEX(name)  EnterCriticalSection(&name)
+#define _glthread_UNLOCK_MUTEX(name)  LeaveCriticalSection(&name)
 
 #endif /* WIN32_THREADS */