//===-- Condition.cpp -------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include #include "lldb/Host/Condition.h" #include "lldb/Host/TimeValue.h" using namespace lldb_private; //---------------------------------------------------------------------- // Default constructor // // The default constructor will initialize a new pthread condition // and maintain the condition in the object state. //---------------------------------------------------------------------- Condition::Condition () : m_condition() { InitializeConditionVariable(&m_condition); } //---------------------------------------------------------------------- // Destructor // // Destroys the pthread condition that the object owns. //---------------------------------------------------------------------- Condition::~Condition () { } //---------------------------------------------------------------------- // Unblock all threads waiting for a condition variable //---------------------------------------------------------------------- int Condition::Broadcast () { WakeAllConditionVariable(&m_condition); return 0; } //---------------------------------------------------------------------- // Unblocks one thread waiting for the condition variable //---------------------------------------------------------------------- int Condition::Signal () { WakeConditionVariable(&m_condition); return 0; } //---------------------------------------------------------------------- // The Wait() function atomically blocks the current thread // waiting on the owned condition variable, and unblocks the mutex // specified by "mutex". The waiting thread unblocks only after // another thread calls Signal(), or Broadcast() with the same // condition variable, or if "abstime" is valid (non-NULL) this // function will return when the system time reaches the time // specified in "abstime". If "abstime" is NULL this function will // wait for an infinite amount of time for the condition variable // to be signaled or broadcasted. // // The current thread re-acquires the lock on "mutex". //---------------------------------------------------------------------- int Condition::Wait (Mutex &mutex, const TimeValue *abstime, bool *timed_out) { DWORD wait = INFINITE; if (abstime != NULL) { int wval = (*abstime - TimeValue::Now()) / 1000000; if (wval < 0) wval = 0; wait = wval; } int err = SleepConditionVariableCS(&m_condition, &mutex.m_mutex, wait); if (timed_out != NULL) { if ((err == 0) && GetLastError() == ERROR_TIMEOUT) *timed_out = true; else *timed_out = false; } return err != 0; }