Thread safety for Win32.  SourceForge bug #1507315.
diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
index e353dd4..c095de3 100644
--- a/src/mesa/glapi/glapi.c
+++ b/src/mesa/glapi/glapi.c
@@ -185,6 +185,15 @@
 _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 = 
diff --git a/src/mesa/glapi/glthread.c b/src/mesa/glapi/glthread.c
index 0683c1e..4513853 100644
--- a/src/mesa/glapi/glthread.c
+++ b/src/mesa/glapi/glthread.c
@@ -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 @@
  */
 #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 @@
 _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_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);
    }
 }
 
diff --git a/src/mesa/glapi/glthread.h b/src/mesa/glapi/glthread.h
index 53592aa..0958cd1 100644
--- a/src/mesa/glapi/glthread.h
+++ b/src/mesa/glapi/glthread.h
@@ -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 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 */