[*] Windows 7 optimization [?]
This commit is contained in:
parent
2fc4564f5d
commit
e88718a48b
@ -194,16 +194,9 @@ namespace Aurora::Threading::Primitives
|
||||
this->writersPending_--;
|
||||
return false;
|
||||
}
|
||||
|
||||
uSecondTimeout = AuNSToMS<AuUInt64>(uSecondTimeout);
|
||||
if (!uSecondTimeout)
|
||||
{
|
||||
this->writersPending_--;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!this->condition_.WaitForSignal(uSecondTimeout))
|
||||
if (!this->condition_.WaitForSignalNS(uSecondTimeout))
|
||||
{
|
||||
this->writersPending_--;
|
||||
return false;
|
||||
|
@ -13,15 +13,10 @@
|
||||
#if !defined(_AURUNTIME_GENERIC_SEMAPHORE)
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
Semaphore::Semaphore(long iIntialValue)
|
||||
Semaphore::Semaphore(long iIntialValue) :
|
||||
var(AuUnsafeRaiiToShared(&this->mutex))
|
||||
{
|
||||
this->value_ = iIntialValue;
|
||||
|
||||
if (!pWaitOnAddress)
|
||||
{
|
||||
::InitializeSRWLock(&this->lock_);
|
||||
::InitializeConditionVariable(&this->winCond_);
|
||||
}
|
||||
}
|
||||
|
||||
Semaphore::~Semaphore()
|
||||
@ -103,38 +98,31 @@ namespace Aurora::Threading::Primitives
|
||||
}
|
||||
else
|
||||
{
|
||||
::AcquireSRWLockShared(&this->lock_);
|
||||
this->mutex.Lock();
|
||||
|
||||
while (!TryLock())
|
||||
{
|
||||
AuUInt32 dwTimeoutMs = INFINITE;
|
||||
AuUInt32 dwTimeoutNs = INFINITE;
|
||||
|
||||
if (uTimeout != 0)
|
||||
{
|
||||
uStart = Time::SteadyClockNS();
|
||||
if (uStart >= uEnd)
|
||||
{
|
||||
::ReleaseSRWLockShared(&this->lock_);
|
||||
this->mutex.Unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
dwTimeoutMs = AuNSToMS<AuInt64>(uEnd - uStart);
|
||||
}
|
||||
|
||||
if (!dwTimeoutMs)
|
||||
{
|
||||
::ReleaseSRWLockShared(&this->lock_);
|
||||
SMPPause();
|
||||
AuThreading::ContextYield();
|
||||
::AcquireSRWLockShared(&this->lock_);
|
||||
dwTimeoutNs = uEnd - uStart;
|
||||
var.WaitForSignalNS(dwTimeoutNs);
|
||||
}
|
||||
else
|
||||
{
|
||||
(void)SleepConditionVariableSRW(&this->winCond_, &this->lock_, dwTimeoutMs, CONDITION_VARIABLE_LOCKMODE_SHARED);
|
||||
var.WaitForSignalNS(0);
|
||||
}
|
||||
}
|
||||
|
||||
::ReleaseSRWLockShared(&this->lock_);
|
||||
this->mutex.Unlock();
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -150,10 +138,22 @@ namespace Aurora::Threading::Primitives
|
||||
{
|
||||
if (!pWaitOnAddress)
|
||||
{
|
||||
::AcquireSRWLockExclusive(&this->lock_);
|
||||
this->mutex.Lock();
|
||||
AuAtomicAdd<AuInt32>(&this->value_, count);
|
||||
::WakeAllConditionVariable(&this->winCond_);
|
||||
::ReleaseSRWLockExclusive(&this->lock_);
|
||||
|
||||
if (count)
|
||||
{
|
||||
this->var.Signal();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (AU_ITERATE_N(i, count))
|
||||
{
|
||||
(void)i;
|
||||
this->var.Signal();
|
||||
}
|
||||
}
|
||||
this->mutex.Unlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -7,6 +7,9 @@
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "AuConditionMutex.Generic.hpp"
|
||||
#include "AuConditionVariable.NT.hpp"
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
struct Semaphore : ISemaphore
|
||||
@ -25,7 +28,7 @@ namespace Aurora::Threading::Primitives
|
||||
|
||||
private:
|
||||
AuInt32 value_ {};
|
||||
CONDITION_VARIABLE winCond_;
|
||||
SRWLOCK lock_;
|
||||
ConditionMutexImpl mutex;
|
||||
ConditionVariableImpl var;
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user