From 385f23edf91a366b2e81449632ba3862957a2a74 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Fri, 16 Jun 2006 14:50:05 +0000 Subject: [PATCH] Thread safety for Win32. SourceForge bug #1507315. --- src/mesa/drivers/windows/gdi/InitCritSections.cpp | 32 +++++++++++++++++++++ src/mesa/glapi/glapi.c | 9 ++++++ src/mesa/glapi/glthread.c | 35 ++++++++++++++--------- src/mesa/glapi/glthread.h | 15 +++++----- 4 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 src/mesa/drivers/windows/gdi/InitCritSections.cpp diff --git a/src/mesa/drivers/windows/gdi/InitCritSections.cpp b/src/mesa/drivers/windows/gdi/InitCritSections.cpp new file mode 100644 index 0000000..7145bff --- /dev/null +++ b/src/mesa/drivers/windows/gdi/InitCritSections.cpp @@ -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 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 @@ 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 = 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 @@ _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); } } 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 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 */ -- 2.7.4