class event_impl
{
private:
std::mutex _lock;
std::condition_variable _condition;
bool _signaled;
public:
static const unsigned int timeout_infinite = 0xFFFFFFFF;
event_impl() : _signaled(false) {}
void set()
{
std::lock_guard<std::mutex> lock(_lock);
_signaled = true;
_condition.notify_all();
}
void reset()
{
std::lock_guard<std::mutex> lock(_lock);
_signaled = false;
}
unsigned int wait(unsigned int timeout)
{
std::unique_lock<std::mutex> lock(_lock);
if (timeout == event_impl::timeout_infinite)
{
_condition.wait(lock, [this]() -> bool { return _signaled; });
return 0;
}
else
{
std::chrono::milliseconds period(timeout);
auto status = _condition.wait_for(lock, period, [this]() -> bool { return _signaled; });
_ASSERTE(status == _signaled);
// Return 0 if the wait completed as a result of signaling the event. Otherwise, return timeout_infinite
// Note: this must be consistent with the behavior of the Windows version, which is based on
// WaitForSingleObjectEx
return status ? 0 : event_impl::timeout_infinite;
}
}
unsigned int wait() { return wait(event_impl::timeout_infinite); }
};