/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: SOOPrimitives.hpp Date: 2023-3-21 Author: Reece ***/ #pragma once #if defined(AURORA_COMPILER_MSVC) #pragma warning(push) #pragma warning(disable: 4141) #endif namespace Aurora::Threading::Primitives { static const auto kDefaultPrimitiveSize = 128; static const auto kPrimitiveSizeNTMutex = 16; static const auto kPrimitiveSizeNTSemaphore = 64; static const auto kPrimitiveSizeNTCS = 32; static const auto kPrimitiveSizeNTEvent = 64; static const auto kPrimitiveSizeNTRWLock = 104; static const auto kPrimitiveSizeNTCond = 32; static const auto kPrimitiveSizeNTCondMutex = 16; #if defined(AURORA_IS_MODERNNT_DERIVED) static const auto kPrimitiveSizeMutex = kPrimitiveSizeNTMutex; static const auto kPrimitiveSizeSemaphore = kPrimitiveSizeNTSemaphore; static const auto kPrimitiveSizeCS = kPrimitiveSizeNTCS; static const auto kPrimitiveSizeEvent = kPrimitiveSizeNTEvent; static const auto kPrimitiveSizeRWLock = kPrimitiveSizeNTRWLock; static const auto kPrimitiveSizeCond = kPrimitiveSizeNTCond; static const auto kPrimitiveSizeCondMutex = kPrimitiveSizeNTCondMutex; // fuck you, its time to overtake the STL in even Windows 11 micro-benchmarks #define AURT_ENABLE_HYPER_MUTEX //#elif defined(AURORA_IS_LINUX_DERIVED) // #else static const auto kPrimitiveSizeMutex = kDefaultPrimitiveSize; static const auto kPrimitiveSizeSemaphore = kDefaultPrimitiveSize; static const auto kPrimitiveSizeCS = kDefaultPrimitiveSize; static const auto kPrimitiveSizeEvent = kDefaultPrimitiveSize; static const auto kPrimitiveSizeRWLock = kDefaultPrimitiveSize; static const auto kPrimitiveSizeCond = kDefaultPrimitiveSize; static const auto kPrimitiveSizeCondMutex = kDefaultPrimitiveSize; #endif struct AUKN_SYM HyperWaitable : IWaitable { auline inline void Lock() final override { if (AuAtomicTestAndSet(&this->state_, 0u) == 0) { return; } SlowLock(); } virtual void SlowLock() = 0; protected: volatile AuUInt32 state_ {}; }; #if defined(AURT_ENABLE_HYPER_MUTEX) using IHyperWaitable = HyperWaitable; #else using IHyperWaitable = IWaitable; #endif } #if defined(AURORA_COMPILER_MSVC) #pragma warning(pop) #endif