Reece
d755a9d651
[*] Refactor ambiguous IWaitable::Lock(timeoutMs) to LockMS to prevent final using collisions
82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
/***
|
|
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 |