Thread safety for Win32. SourceForge bug #1507315.

This commit is contained in:
Brian Paul
2006-06-16 14:50:05 +00:00
parent c0168fabed
commit 385f23edf9
4 changed files with 69 additions and 22 deletions

View File

@@ -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

View 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 =

View 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);
}
}

View 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 */