1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "CriticalSection.h"
#include <algorithm>
CriticalSection::CriticalSection() noexcept
{
InitializeCriticalSection(&mtx);
}
CriticalSection::~CriticalSection()
{
DeleteCriticalSection(&mtx);
}
void CriticalSection::lock()
{
EnterCriticalSection(&mtx);
}
bool CriticalSection::try_lock() noexcept
{
return TryEnterCriticalSection(&mtx);
}
void CriticalSection::unlock()
{
LeaveCriticalSection(&mtx);
}
win_signal::win_signal() noexcept
: sleepers(false)
{
event = CreateEvent(NULL, true, false, NULL);
}
win_signal::~win_signal()
{
CloseHandle(event);
}
void win_signal::wait()
{
wait_for(spring_notime);
}
void win_signal::wait_for(spring_time t)
{
++sleepers;
const DWORD timeout_milliseconds = t.toMilliSecsi();
DWORD dwWaitResult;
do {
dwWaitResult = WaitForSingleObject(event, timeout_milliseconds);
} while (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_TIMEOUT);
--sleepers;
}
void win_signal::notify_all(const int min_sleepers)
{
if (sleepers.load() < std::max(1, min_sleepers))
return;
PulseEvent(event);
}
|