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