From 5f6892e23c9eed8c308bc16e145abccaacacb6b7 Mon Sep 17 00:00:00 2001
From: Pyry Haulos <phaulos@google.com>
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 0277ef295..73f8d89b5
--- 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 e351e8b9f..000000000
--- 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 <pthread.h>
-#include <semaphore.h>
-#include <assert.h>
-#include <errno.h>
-
-#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 d66beadbb..7dee4df17 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 <pthread.h>
+#include <semaphore.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdint.h>
+
 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 fc19a403e..000000000
--- 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 456611458..b5ce18c23 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 <process.h>
 #include <psapi.h>
 #include <stdio.h>
+#include <stdint.h>
 
 //
 // 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 ca2624203..0f370a005 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
-- 
GitLab