From 5f6892e23c9eed8c308bc16e145abccaacacb6b7 Mon Sep 17 00:00:00 2001 From: Pyry Haulos Date: Tue, 1 Dec 2015 12:59:53 -0800 Subject: [PATCH] Use generic osinclude.h Using platform-neutral osinclude.h makes it easier to substitute implementation when necessary and eliminates some variability between build configurations. --- StandAlone/StandAlone.cpp | 6 +-- glslang/OSDependent/Unix/osinclude.h | 87 -------------------------------- glslang/OSDependent/Unix/ossource.cpp | 34 +++++++++++-- glslang/OSDependent/Windows/osinclude.h | 75 --------------------------- glslang/OSDependent/Windows/ossource.cpp | 29 ++++++++--- glslang/OSDependent/osinclude.h | 43 +++++++++++----- 6 files changed, 83 insertions(+), 191 deletions(-) mode change 100755 => 100644 StandAlone/StandAlone.cpp delete mode 100644 glslang/OSDependent/Unix/osinclude.h delete mode 100644 glslang/OSDependent/Windows/osinclude.h diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp old mode 100755 new mode 100644 index 0277ef2..73f8d89 --- a/StandAlone/StandAlone.cpp +++ b/StandAlone/StandAlone.cpp @@ -621,11 +621,7 @@ void SetMessageOptions(EShMessages& messages) // // Return 0 for failure, 1 for success. // -unsigned int -#ifdef _WIN32 - __stdcall -#endif -CompileShaders(void*) +unsigned int CompileShaders(void*) { glslang::TWorkItem* workItem; while (Worklist.remove(workItem)) { diff --git a/glslang/OSDependent/Unix/osinclude.h b/glslang/OSDependent/Unix/osinclude.h deleted file mode 100644 index e351e8b..0000000 --- a/glslang/OSDependent/Unix/osinclude.h +++ /dev/null @@ -1,87 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// - -#ifndef __OSINCLUDE_H -#define __OSINCLUDE_H - -// -// This file contains any Linux specific functions. -// - -#include -#include -#include -#include - -#define _vsnprintf vsnprintf - -namespace glslang { - -void DetachThreadLinux(void *); - -// -// Thread Local Storage Operations -// -typedef pthread_key_t OS_TLSIndex; -#define OS_INVALID_TLS_INDEX ((pthread_key_t)0xFFFFFFFF) - -OS_TLSIndex OS_AllocTLSIndex(); -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue); -bool OS_FreeTLSIndex(OS_TLSIndex nIndex); - - -inline void* OS_GetTLSValue(OS_TLSIndex nIndex) -{ - // - // This function should return 0 if nIndex is invalid. - // - assert(nIndex != OS_INVALID_TLS_INDEX); - return pthread_getspecific(nIndex); -} - -void InitGlobalLock(); -void GetGlobalLock(); -void ReleaseGlobalLock(); - -typedef unsigned int (*TThreadEntrypoint)(void*); -void* OS_CreateThread(TThreadEntrypoint); -void OS_WaitForAllThreads(void* threads, int numThreads); - -void OS_Sleep(int milliseconds); - -void OS_DumpMemoryCounters(); - -} // end namespace glslang - -#endif // __OSINCLUDE_H diff --git a/glslang/OSDependent/Unix/ossource.cpp b/glslang/OSDependent/Unix/ossource.cpp index d66bead..7dee4df 100644 --- a/glslang/OSDependent/Unix/ossource.cpp +++ b/glslang/OSDependent/Unix/ossource.cpp @@ -35,9 +35,15 @@ // // This file contains the Linux-specific functions // -#include "osinclude.h" +#include "../osinclude.h" #include "../../../OGLCompilersDLL/InitializeDll.h" +#include +#include +#include +#include +#include + namespace glslang { // @@ -95,6 +101,16 @@ void OS_CleanupThreadData(void) // // Thread Local Storage Operations // +inline OS_TLSIndex PthreadKeyToTLSIndex(pthread_key_t key) +{ + return (OS_TLSIndex)((uintptr_t)key + 1); +} + +inline pthread_key_t TLSIndexToPthreadKey(OS_TLSIndex nIndex) +{ + return (pthread_key_t)((uintptr_t)nIndex - 1); +} + OS_TLSIndex OS_AllocTLSIndex() { pthread_key_t pPoolIndex; @@ -104,10 +120,10 @@ OS_TLSIndex OS_AllocTLSIndex() // if ((pthread_key_create(&pPoolIndex, NULL)) != 0) { assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); - return false; + return OS_INVALID_TLS_INDEX; } else - return pPoolIndex; + return PthreadKeyToTLSIndex(pPoolIndex); } @@ -118,12 +134,20 @@ bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) return false; } - if (pthread_setspecific(nIndex, lpvValue) == 0) + if (pthread_setspecific(TLSIndexToPthreadKey(nIndex), lpvValue) == 0) return true; else return false; } +void* OS_GetTLSValue(OS_TLSIndex nIndex) +{ + // + // This function should return 0 if nIndex is invalid. + // + assert(nIndex != OS_INVALID_TLS_INDEX); + return pthread_getspecific(TLSIndexToPthreadKey(nIndex)); +} bool OS_FreeTLSIndex(OS_TLSIndex nIndex) { @@ -135,7 +159,7 @@ bool OS_FreeTLSIndex(OS_TLSIndex nIndex) // // Delete the global pool key. // - if (pthread_key_delete(nIndex) == 0) + if (pthread_key_delete(TLSIndexToPthreadKey(nIndex)) == 0) return true; else return false; diff --git a/glslang/OSDependent/Windows/osinclude.h b/glslang/OSDependent/Windows/osinclude.h deleted file mode 100644 index fc19a40..0000000 --- a/glslang/OSDependent/Windows/osinclude.h +++ /dev/null @@ -1,75 +0,0 @@ -// -//Copyright (C) 2002-2005 3Dlabs Inc. Ltd. -//All rights reserved. -// -//Redistribution and use in source and binary forms, with or without -//modification, are permitted provided that the following conditions -//are met: -// -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// -// Neither the name of 3Dlabs Inc. Ltd. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -//COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -//ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -//POSSIBILITY OF SUCH DAMAGE. -// - -#ifndef __OSINCLUDE_H -#define __OSINCLUDE_H - -// -// This file contains contains the window's specific datatypes and -// declares any windows specific functions. -// - -#if !(defined(_WIN32) || defined(_WIN64)) -#error Trying to include a windows specific file in a non windows build. -#endif - -namespace glslang { - -// -// Thread Local Storage Operations -// -typedef unsigned long OS_TLSIndex; -#define OS_INVALID_TLS_INDEX ((unsigned long)0xFFFFFFFF) - -OS_TLSIndex OS_AllocTLSIndex(); -bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue); -bool OS_FreeTLSIndex(OS_TLSIndex nIndex); - -void* OS_GetTLSValue(OS_TLSIndex nIndex); - -void InitGlobalLock(); -void GetGlobalLock(); -void ReleaseGlobalLock(); - -typedef unsigned int (__stdcall *TThreadEntrypoint)(void*); -void* OS_CreateThread(TThreadEntrypoint); -void OS_WaitForAllThreads(void* threads, int numThreads); - -void OS_Sleep(int milliseconds); - -void OS_DumpMemoryCounters(); - -} // end namespace glslang - -#endif // __OSINCLUDE_H diff --git a/glslang/OSDependent/Windows/ossource.cpp b/glslang/OSDependent/Windows/ossource.cpp index 4566114..b5ce18c 100644 --- a/glslang/OSDependent/Windows/ossource.cpp +++ b/glslang/OSDependent/Windows/ossource.cpp @@ -32,7 +32,7 @@ //POSSIBILITY OF SUCH DAMAGE. // -#include "osinclude.h" +#include "../osinclude.h" #define STRICT #define VC_EXTRALEAN 1 @@ -41,6 +41,7 @@ #include #include #include +#include // // This file contains contains the Window-OS-specific functions @@ -52,6 +53,16 @@ namespace glslang { +inline OS_TLSIndex ToGenericTLSIndex (DWORD handle) +{ + return (OS_TLSIndex)((uintptr_t)handle + 1); +} + +inline DWORD ToNativeTLSIndex (OS_TLSIndex nIndex) +{ + return (DWORD)((uintptr_t)nIndex - 1); +} + // // Thread Local Storage Operations // @@ -63,7 +74,7 @@ OS_TLSIndex OS_AllocTLSIndex() return OS_INVALID_TLS_INDEX; } - return dwIndex; + return ToGenericTLSIndex(dwIndex); } @@ -74,7 +85,7 @@ bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) return false; } - if (TlsSetValue(nIndex, lpvValue)) + if (TlsSetValue(ToNativeTLSIndex(nIndex), lpvValue)) return true; else return false; @@ -83,7 +94,7 @@ bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) void* OS_GetTLSValue(OS_TLSIndex nIndex) { assert(nIndex != OS_INVALID_TLS_INDEX); - return TlsGetValue(nIndex); + return TlsGetValue(ToNativeTLSIndex(nIndex)); } bool OS_FreeTLSIndex(OS_TLSIndex nIndex) @@ -93,7 +104,7 @@ bool OS_FreeTLSIndex(OS_TLSIndex nIndex) return false; } - if (TlsFree(nIndex)) + if (TlsFree(ToNativeTLSIndex(nIndex))) return true; else return false; @@ -116,10 +127,14 @@ void ReleaseGlobalLock() ReleaseMutex(GlobalLock); } +unsigned int __stdcall EnterGenericThread (void* entry) +{ + return ((TThreadEntrypoint)entry)(0); +} + void* OS_CreateThread(TThreadEntrypoint entry) { - return (void*)_beginthreadex(0, 0, entry, 0, 0, 0); - //return CreateThread(0, 0, entry, 0, 0, 0); + return (void*)_beginthreadex(0, 0, EnterGenericThread, entry, 0, 0); } void OS_WaitForAllThreads(void* threads, int numThreads) diff --git a/glslang/OSDependent/osinclude.h b/glslang/OSDependent/osinclude.h index ca26242..0f370a0 100644 --- a/glslang/OSDependent/osinclude.h +++ b/glslang/OSDependent/osinclude.h @@ -32,15 +32,34 @@ //POSSIBILITY OF SUCH DAMAGE. // -#ifndef __ROOT_OSINCLUDE_H -#define __ROOT_OSINCLUDE_H - -#if defined(GLSLANG_OSINCLUDE_WIN32) -#include "Windows/osinclude.h" -#elif defined(GLSLANG_OSINCLUDE_UNIX) -#include "Unix/osinclude.h" -#else -#error "Unknown platform" -#endif - -#endif // __ROOT_OSINCLUDE_H +#ifndef __OSINCLUDE_H +#define __OSINCLUDE_H + +namespace glslang { + +// +// Thread Local Storage Operations +// +typedef void* OS_TLSIndex; +#define OS_INVALID_TLS_INDEX ((void*)0) + +OS_TLSIndex OS_AllocTLSIndex(); +bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue); +bool OS_FreeTLSIndex(OS_TLSIndex nIndex); +void* OS_GetTLSValue(OS_TLSIndex nIndex); + +void InitGlobalLock(); +void GetGlobalLock(); +void ReleaseGlobalLock(); + +typedef unsigned int (*TThreadEntrypoint)(void*); +void* OS_CreateThread(TThreadEntrypoint); +void OS_WaitForAllThreads(void* threads, int numThreads); + +void OS_Sleep(int milliseconds); + +void OS_DumpMemoryCounters(); + +} // end namespace glslang + +#endif // __OSINCLUDE_H -- 2.7.4