1f25ce65dSSergey Makeev // The MIT License (MIT)
2f25ce65dSSergey Makeev //
3f25ce65dSSergey Makeev // 	Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev
4f25ce65dSSergey Makeev //
5f25ce65dSSergey Makeev // 	Permission is hereby granted, free of charge, to any person obtaining a copy
6f25ce65dSSergey Makeev // 	of this software and associated documentation files (the "Software"), to deal
7f25ce65dSSergey Makeev // 	in the Software without restriction, including without limitation the rights
8f25ce65dSSergey Makeev // 	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9f25ce65dSSergey Makeev // 	copies of the Software, and to permit persons to whom the Software is
10f25ce65dSSergey Makeev // 	furnished to do so, subject to the following conditions:
11f25ce65dSSergey Makeev //
12f25ce65dSSergey Makeev //  The above copyright notice and this permission notice shall be included in
13f25ce65dSSergey Makeev // 	all copies or substantial portions of the Software.
14f25ce65dSSergey Makeev //
15f25ce65dSSergey Makeev // 	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f25ce65dSSergey Makeev // 	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f25ce65dSSergey Makeev // 	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18f25ce65dSSergey Makeev // 	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19f25ce65dSSergey Makeev // 	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20f25ce65dSSergey Makeev // 	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21f25ce65dSSergey Makeev // 	THE SOFTWARE.
2247d53e4dSSergey Makeev 
23f25ce65dSSergey Makeev #pragma once
2402d170cfSs.makeev_local #include <MTConfig.h>
2547d53e4dSSergey Makeev #include <MTTypes.h>
2647d53e4dSSergey Makeev #include <MTDebug.h>
2747d53e4dSSergey Makeev 
2847d53e4dSSergey Makeev typedef void (*TThreadEntryPoint)(void* userData);
2947d53e4dSSergey Makeev 
3034a394c3SSergey Makeev #define MT_ARRAY_SIZE( arr ) ( sizeof( arr ) / sizeof( (arr)[0] ) )
3147d53e4dSSergey Makeev 
3247d53e4dSSergey Makeev namespace MT
3347d53e4dSSergey Makeev {
3447d53e4dSSergey Makeev 	namespace EventReset
3547d53e4dSSergey Makeev 	{
3647d53e4dSSergey Makeev 		enum Type
3747d53e4dSSergey Makeev 		{
3847d53e4dSSergey Makeev 			AUTOMATIC = 0,
3947d53e4dSSergey Makeev 			MANUAL = 1,
4047d53e4dSSergey Makeev 		};
4147d53e4dSSergey Makeev 	}
4247d53e4dSSergey Makeev }
4347d53e4dSSergey Makeev 
4447d53e4dSSergey Makeev 
45efd3d0d5SSergey Makeev 
4602d170cfSs.makeev_local #if MT_PLATFORM_WINDOWS
4747d53e4dSSergey Makeev 	#include <Platform/Windows/MTCommon.h>
4802d170cfSs.makeev_local #elif MT_PLATFORM_POSIX || MT_PLATFORM_OSX
4947d53e4dSSergey Makeev 	#include <Platform/Posix/MTCommon.h>
5002d170cfSs.makeev_local #else
5102d170cfSs.makeev_local 	#error Platfrom is not supported
5247d53e4dSSergey Makeev #endif
5347d53e4dSSergey Makeev 
5466de1283SSergey Makeev #include <Platform/Common/MTAtomic.h>
553cb1fd8eSs.makeev_local #include <Platform/Common/MTSpinWait.h>
5666de1283SSergey Makeev 
5747d53e4dSSergey Makeev namespace MT
5847d53e4dSSergey Makeev {
5947d53e4dSSergey Makeev 	//
6047d53e4dSSergey Makeev 	//
6147d53e4dSSergey Makeev 	//
6247d53e4dSSergey Makeev 	class ScopedGuard
6347d53e4dSSergey Makeev 	{
6447d53e4dSSergey Makeev 		MT::Mutex & mutex;
6547d53e4dSSergey Makeev 
66*111120ceSs.makeev_local 		ScopedGuard( const ScopedGuard & );
67*111120ceSs.makeev_local 		void operator=( const ScopedGuard &);
6847d53e4dSSergey Makeev 
6947d53e4dSSergey Makeev 	public:
7047d53e4dSSergey Makeev 
ScopedGuard(MT::Mutex & _mutex)7147d53e4dSSergey Makeev 		ScopedGuard(MT::Mutex & _mutex) : mutex(_mutex)
7247d53e4dSSergey Makeev 		{
7347d53e4dSSergey Makeev 			mutex.Lock();
7447d53e4dSSergey Makeev 		}
7547d53e4dSSergey Makeev 
~ScopedGuard()7647d53e4dSSergey Makeev 		~ScopedGuard()
7747d53e4dSSergey Makeev 		{
7847d53e4dSSergey Makeev 			mutex.Unlock();
7947d53e4dSSergey Makeev 		}
8047d53e4dSSergey Makeev 	};
812b4df162SSergey Makeev 
822b4df162SSergey Makeev 	//
832b4df162SSergey Makeev 	// Simple Linear congruential generator
842b4df162SSergey Makeev 	//
852b4df162SSergey Makeev 	class LcgRandom
862b4df162SSergey Makeev 	{
872b4df162SSergey Makeev 		uint32 state;
882b4df162SSergey Makeev 
892b4df162SSergey Makeev 	public:
902b4df162SSergey Makeev 
LcgRandom()912b4df162SSergey Makeev 		LcgRandom()
922b4df162SSergey Makeev 			: state(2578432553)
932b4df162SSergey Makeev 		{
942b4df162SSergey Makeev 		}
952b4df162SSergey Makeev 
SetSeed(uint32 seed)962b4df162SSergey Makeev 		void SetSeed(uint32 seed)
972b4df162SSergey Makeev 		{
982b4df162SSergey Makeev 			state = seed;
992b4df162SSergey Makeev 		}
1002b4df162SSergey Makeev 
Get()1012b4df162SSergey Makeev 		uint16 Get()
1022b4df162SSergey Makeev 		{
1032b4df162SSergey Makeev 			state = 214013 * state + 2531011;
1042b4df162SSergey Makeev 			uint16 rnd = (state >> 16);
1052b4df162SSergey Makeev 			return rnd;
1062b4df162SSergey Makeev 		}
1072b4df162SSergey Makeev 
1082b4df162SSergey Makeev 
1092b4df162SSergey Makeev 	};
1102b4df162SSergey Makeev 
11147d53e4dSSergey Makeev }
11247d53e4dSSergey Makeev 
1132e846c40SSergey Makeev 
11402d170cfSs.makeev_local #if MT_CPP11_SUPPORTED
1152e846c40SSergey Makeev #define mt_thread_local _Thread_local
11602d170cfSs.makeev_local #elif MT_GCC_COMPILER_FAMILY
11702d170cfSs.makeev_local #define mt_thread_local __thread
11802d170cfSs.makeev_local #elif MT_MSVC_COMPILER_FAMILY
1192e846c40SSergey Makeev #define mt_thread_local __declspec(thread)
1202e846c40SSergey Makeev #else
1212009a825SSergey Makeev #error Can not define mt_thread_local. Unknown platform.
1222e846c40SSergey Makeev #endif
1232e846c40SSergey Makeev 
1242e846c40SSergey Makeev 
125