Apply the Apache 2.0 license.

Change-Id: I4a7aeefedcd2d891093520d5a10ebefadcddb5be
Reviewed-on: https://swiftshader-review.googlesource.com/5320
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Common/Thread.hpp b/src/Common/Thread.hpp
index d57dd41..deb8b29 100644
--- a/src/Common/Thread.hpp
+++ b/src/Common/Thread.hpp
@@ -1,250 +1,253 @@
-// SwiftShader Software Renderer

-//

-// Copyright(c) 2005-2012 TransGaming Inc.

-//

-// All rights reserved. No part of this software may be copied, distributed, transmitted,

-// transcribed, stored in a retrieval system, translated into any human or computer

-// language by any means, or disclosed to third parties without the explicit written

-// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express

-// or implied, including but not limited to any patent rights, are granted to you.

-//

-

-#ifndef sw_Thread_hpp

-#define sw_Thread_hpp

-

-#if defined(_WIN32)

-	#ifndef WIN32_LEAN_AND_MEAN

-		#define WIN32_LEAN_AND_MEAN

-	#endif

-	#include <windows.h>

-	#include <intrin.h>

-#else

-	#include <pthread.h>

-	#include <sched.h>

-	#include <unistd.h>

-	#define TLS_OUT_OF_INDEXES (~0)

-#endif

-

-namespace sw

-{

-	class Event;

-

-	class Thread

-	{

-	public:

-		Thread(void (*threadFunction)(void *parameters), void *parameters);

-

-		~Thread();

-

-		void join();

-

-		static void yield();

-		static void sleep(int milliseconds);

-

-		#if defined(_WIN32)

-			typedef DWORD LocalStorageKey;

-		#else

-			typedef pthread_key_t LocalStorageKey;

-		#endif

-

-		static LocalStorageKey allocateLocalStorageKey();

-		static void freeLocalStorageKey(LocalStorageKey key);

-		static void setLocalStorage(LocalStorageKey key, void *value);

-		static void *getLocalStorage(LocalStorageKey key);

-

-	private:

-		struct Entry

-		{

-			void (*const threadFunction)(void *parameters);

-			void *threadParameters;

-			Event *init;

-		};

-

-		#if defined(_WIN32)

-			static unsigned long __stdcall startFunction(void *parameters);

-			HANDLE handle;

-		#else

-			static void *startFunction(void *parameters);

-			pthread_t handle;

-		#endif

-	};

-

-	class Event

-	{

-		friend class Thread;

-

-	public:

-		Event();

-

-		~Event();

-

-		void signal();

-		void wait();

-

-	private:

-		#if defined(_WIN32)

-			HANDLE handle;

-		#else

-			pthread_cond_t handle;

-			pthread_mutex_t mutex;

-			volatile bool signaled;

-		#endif

-	};

-

-	#if PERF_PROFILE

-	int64_t atomicExchange(int64_t volatile *target, int64_t value);

-	#endif

-

-	int atomicExchange(int volatile *target, int value);

-	int atomicIncrement(int volatile *value);

-	int atomicDecrement(int volatile *value);

-	int atomicAdd(int volatile *target, int value);

-	void nop();

-}

-

-namespace sw

-{

-	inline void Thread::yield()

-	{

-		#if defined(_WIN32)

-			Sleep(0);

-		#elif defined(__APPLE__)

-			pthread_yield_np();

-		#else

-			sched_yield();

-		#endif

-	}

-

-	inline void Thread::sleep(int milliseconds)

-	{

-		#if defined(_WIN32)

-			Sleep(milliseconds);

-		#else

-			usleep(1000 * milliseconds);

-		#endif

-	}

-

-	inline Thread::LocalStorageKey Thread::allocateLocalStorageKey()

-	{

-		#if defined(_WIN32)

-			return TlsAlloc();

-		#else

-			LocalStorageKey key;

-			pthread_key_create(&key, 0);

-			return key;

-		#endif

-	}

-	

-	inline void Thread::freeLocalStorageKey(LocalStorageKey key)

-	{

-		#if defined(_WIN32)

-			TlsFree(key);

-		#else

-			pthread_key_delete(key);

-		#endif

-	}

-

-	inline void Thread::setLocalStorage(LocalStorageKey key, void *value)

-	{

-		#if defined(_WIN32)

-			TlsSetValue(key, value);

-		#else

-			pthread_setspecific(key, value);

-		#endif

-	}

-

-	inline void *Thread::getLocalStorage(LocalStorageKey key)

-	{

-		#if defined(_WIN32)

-			return TlsGetValue(key);

-		#else

-			return pthread_getspecific(key);

-		#endif

-	}

-

-	inline void Event::signal()

-	{

-		#if defined(_WIN32)

-			SetEvent(handle);

-		#else

-			pthread_mutex_lock(&mutex);

-			signaled = true;

-			pthread_cond_signal(&handle);

-			pthread_mutex_unlock(&mutex);

-		#endif

-	}

-

-	inline void Event::wait()

-	{

-		#if defined(_WIN32)

-			WaitForSingleObject(handle, INFINITE);

-		#else

-			pthread_mutex_lock(&mutex);

-			while(!signaled) pthread_cond_wait(&handle, &mutex);

-			signaled = false;

-			pthread_mutex_unlock(&mutex);

-		#endif

-	}

-

-	#if PERF_PROFILE

-	inline int64_t atomicExchange(volatile int64_t *target, int64_t value)

-	{

-		#if defined(_WIN32)

-			return InterlockedExchange64(target, value);

-		#else

-			int ret;

-			__asm__ __volatile__("lock; xchg8 %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" );

-			return ret;

-		#endif

-	}

-	#endif

-

-	inline int atomicExchange(volatile int *target, int value)

-	{

-		#if defined(_WIN32)

-			return InterlockedExchange((volatile long*)target, (long)value);

-		#else

-			int ret;

-			__asm__ __volatile__("lock; xchgl %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" );

-			return ret;

-		#endif

-	}

-

-	inline int atomicIncrement(volatile int *value)

-	{

-		#if defined(_WIN32)

-			return InterlockedIncrement((volatile long*)value);

-		#else

-			return __sync_add_and_fetch(value, 1);

-		#endif

-	}

-

-	inline int atomicDecrement(volatile int *value)

-	{

-		#if defined(_WIN32)

-			return InterlockedDecrement((volatile long*)value);

-		#else

-			return __sync_sub_and_fetch(value, 1);

-		#endif

-	}

-

-	inline int atomicAdd(volatile int* target, int value)

-	{

-		#if defined(_MSC_VER)

-			return InterlockedExchangeAdd((volatile long*)target, value) + value;

-		#else

-			return __sync_add_and_fetch(target, value);

-		#endif

-	}

-

-	inline void nop()

-	{

-		#if defined(_WIN32)

-			__nop();

-		#else

-			__asm__ __volatile__ ("nop");

-		#endif

-	}

-}

-

-#endif   // sw_Thread_hpp

+// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef sw_Thread_hpp
+#define sw_Thread_hpp
+
+#if defined(_WIN32)
+	#ifndef WIN32_LEAN_AND_MEAN
+		#define WIN32_LEAN_AND_MEAN
+	#endif
+	#include <windows.h>
+	#include <intrin.h>
+#else
+	#include <pthread.h>
+	#include <sched.h>
+	#include <unistd.h>
+	#define TLS_OUT_OF_INDEXES (~0)
+#endif
+
+namespace sw
+{
+	class Event;
+
+	class Thread
+	{
+	public:
+		Thread(void (*threadFunction)(void *parameters), void *parameters);
+
+		~Thread();
+
+		void join();
+
+		static void yield();
+		static void sleep(int milliseconds);
+
+		#if defined(_WIN32)
+			typedef DWORD LocalStorageKey;
+		#else
+			typedef pthread_key_t LocalStorageKey;
+		#endif
+
+		static LocalStorageKey allocateLocalStorageKey();
+		static void freeLocalStorageKey(LocalStorageKey key);
+		static void setLocalStorage(LocalStorageKey key, void *value);
+		static void *getLocalStorage(LocalStorageKey key);
+
+	private:
+		struct Entry
+		{
+			void (*const threadFunction)(void *parameters);
+			void *threadParameters;
+			Event *init;
+		};
+
+		#if defined(_WIN32)
+			static unsigned long __stdcall startFunction(void *parameters);
+			HANDLE handle;
+		#else
+			static void *startFunction(void *parameters);
+			pthread_t handle;
+		#endif
+	};
+
+	class Event
+	{
+		friend class Thread;
+
+	public:
+		Event();
+
+		~Event();
+
+		void signal();
+		void wait();
+
+	private:
+		#if defined(_WIN32)
+			HANDLE handle;
+		#else
+			pthread_cond_t handle;
+			pthread_mutex_t mutex;
+			volatile bool signaled;
+		#endif
+	};
+
+	#if PERF_PROFILE
+	int64_t atomicExchange(int64_t volatile *target, int64_t value);
+	#endif
+
+	int atomicExchange(int volatile *target, int value);
+	int atomicIncrement(int volatile *value);
+	int atomicDecrement(int volatile *value);
+	int atomicAdd(int volatile *target, int value);
+	void nop();
+}
+
+namespace sw
+{
+	inline void Thread::yield()
+	{
+		#if defined(_WIN32)
+			Sleep(0);
+		#elif defined(__APPLE__)
+			pthread_yield_np();
+		#else
+			sched_yield();
+		#endif
+	}
+
+	inline void Thread::sleep(int milliseconds)
+	{
+		#if defined(_WIN32)
+			Sleep(milliseconds);
+		#else
+			usleep(1000 * milliseconds);
+		#endif
+	}
+
+	inline Thread::LocalStorageKey Thread::allocateLocalStorageKey()
+	{
+		#if defined(_WIN32)
+			return TlsAlloc();
+		#else
+			LocalStorageKey key;
+			pthread_key_create(&key, 0);
+			return key;
+		#endif
+	}
+
+	inline void Thread::freeLocalStorageKey(LocalStorageKey key)
+	{
+		#if defined(_WIN32)
+			TlsFree(key);
+		#else
+			pthread_key_delete(key);
+		#endif
+	}
+
+	inline void Thread::setLocalStorage(LocalStorageKey key, void *value)
+	{
+		#if defined(_WIN32)
+			TlsSetValue(key, value);
+		#else
+			pthread_setspecific(key, value);
+		#endif
+	}
+
+	inline void *Thread::getLocalStorage(LocalStorageKey key)
+	{
+		#if defined(_WIN32)
+			return TlsGetValue(key);
+		#else
+			return pthread_getspecific(key);
+		#endif
+	}
+
+	inline void Event::signal()
+	{
+		#if defined(_WIN32)
+			SetEvent(handle);
+		#else
+			pthread_mutex_lock(&mutex);
+			signaled = true;
+			pthread_cond_signal(&handle);
+			pthread_mutex_unlock(&mutex);
+		#endif
+	}
+
+	inline void Event::wait()
+	{
+		#if defined(_WIN32)
+			WaitForSingleObject(handle, INFINITE);
+		#else
+			pthread_mutex_lock(&mutex);
+			while(!signaled) pthread_cond_wait(&handle, &mutex);
+			signaled = false;
+			pthread_mutex_unlock(&mutex);
+		#endif
+	}
+
+	#if PERF_PROFILE
+	inline int64_t atomicExchange(volatile int64_t *target, int64_t value)
+	{
+		#if defined(_WIN32)
+			return InterlockedExchange64(target, value);
+		#else
+			int ret;
+			__asm__ __volatile__("lock; xchg8 %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" );
+			return ret;
+		#endif
+	}
+	#endif
+
+	inline int atomicExchange(volatile int *target, int value)
+	{
+		#if defined(_WIN32)
+			return InterlockedExchange((volatile long*)target, (long)value);
+		#else
+			int ret;
+			__asm__ __volatile__("lock; xchgl %0,(%1)" : "=r" (ret) :"r" (target), "0" (value) : "memory" );
+			return ret;
+		#endif
+	}
+
+	inline int atomicIncrement(volatile int *value)
+	{
+		#if defined(_WIN32)
+			return InterlockedIncrement((volatile long*)value);
+		#else
+			return __sync_add_and_fetch(value, 1);
+		#endif
+	}
+
+	inline int atomicDecrement(volatile int *value)
+	{
+		#if defined(_WIN32)
+			return InterlockedDecrement((volatile long*)value);
+		#else
+			return __sync_sub_and_fetch(value, 1);
+		#endif
+	}
+
+	inline int atomicAdd(volatile int* target, int value)
+	{
+		#if defined(_MSC_VER)
+			return InterlockedExchangeAdd((volatile long*)target, value) + value;
+		#else
+			return __sync_add_and_fetch(target, value);
+		#endif
+	}
+
+	inline void nop()
+	{
+		#if defined(_WIN32)
+			__nop();
+		#else
+			__asm__ __volatile__ ("nop");
+		#endif
+	}
+}
+
+#endif   // sw_Thread_hpp