#include "flag.hpp"

#include "../win32/except.hpp"

using cruft::thread::flag;


///////////////////////////////////////////////////////////////////////////////
flag::flag ():
    fired (false)
{ ; }


///////////////////////////////////////////////////////////////////////////////
void
flag::wait (void)
{
    while (!fired) {
        std::unique_lock lk (m_mutex);
        m_condition.wait (lk, [this] () { return !!fired; });
    }
}

///////////////////////////////////////////////////////////////////////////////
void
flag::notify_one (void)
{
    std::unique_lock lk (m_mutex);
    fired = true;
    m_condition.notify_one ();
}


//-----------------------------------------------------------------------------
void
flag::notify_all (void)
{
    std::unique_lock lk (m_mutex);
    fired = true;
    m_condition.notify_all ();
}