124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- PThreadEvent.cpp ----------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 6/16/07. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadEvent.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "errno.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBLog.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::PThreadEvent(uint32_t bits, uint32_t validBits) : 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex(), 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_condition(), 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reset_condition(), 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bits(bits), 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_validBits(validBits), 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reset_ack_mask(0) 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x, 0x%8.8x)", this, __FUNCTION__, bits, validBits); 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::~PThreadEvent() 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p %s", this, __PRETTY_FUNCTION__); 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::NewEventBit() 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p %s", this, __PRETTY_FUNCTION__); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t mask = 1; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (mask & m_validBits) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner mask <<= 1; 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_validBits |= mask; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return mask; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::FreeEventBits(const uint32_t mask) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x)", this, __FUNCTION__, mask); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mask) 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bits &= ~mask; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_validBits &= ~mask; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::GetEventBits() const 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p %s", this, __PRETTY_FUNCTION__); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bits = m_bits; 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bits; 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Replace the event bits with a new bitmask value 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::ReplaceEventBits(const uint32_t bits) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x)", this, __FUNCTION__, bits); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have some bits and that they aren't already set... 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_bits != bits) 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Figure out which bits are changing 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t changed_bits = m_bits ^ bits; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the new bit values 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bits = bits; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If any new bits are set, then broadcast 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (changed_bits & m_bits) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_condition.Broadcast(); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set one or more event bits and broadcast if any new event bits get set 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// that weren't already set. 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::SetEvents(const uint32_t mask) 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x)", this, __FUNCTION__, mask); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure we have some bits to set 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mask) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the old event bit state so we can tell if things change 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t old = m_bits; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the all event bits that are set in 'mask' 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bits |= mask; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Broadcast only if any extra bits got set. 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (old != m_bits) 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_condition.Broadcast(); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Reset one or more event bits 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::ResetEvents(const uint32_t mask) 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x)", this, __FUNCTION__, mask); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mask) 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Save the old event bit state so we can tell if things change 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t old = m_bits; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the all event bits that are set in 'mask' 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_bits &= ~mask; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Broadcast only if any extra bits got reset. 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (old != m_bits) 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reset_condition.Broadcast(); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Wait until 'timeout_abstime' for any events that are set in 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 'mask'. If 'timeout_abstime' is NULL, then wait forever. 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::WaitForSetEvents(const uint32_t mask, const struct timespec *timeout_abstime) const 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x, %p)", this, __FUNCTION__, mask, timeout_abstime); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int err = 0; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // pthread_cond_timedwait() or pthread_cond_wait() will atomically 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // unlock the mutex and wait for the condition to be set. When either 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // function returns, they will re-lock the mutex. We use an auto lock/unlock 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // class (PThreadMutex::Locker) to allow us to return at any point in this 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // function and not have to worry about unlocking the mutex. 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner do 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check our predicate (event bits) in case any are already set 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mask & m_bits) 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bits_set = mask & m_bits; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Our PThreadMutex::Locker will automatically unlock our mutex 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bits_set; 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timeout_abstime) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Wait for condition to get broadcast, or for a timeout. If we get 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a timeout we will drop out of the do loop and return false which 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is what we want. 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_cond_timedwait (m_set_condition.Condition(), m_mutex.Mutex(), timeout_abstime); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Retest our predicate in case of a race condition right at the end 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of the timeout. 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (err == ETIMEDOUT) 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t bits_set = mask & m_bits; 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bits_set; 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Wait for condition to get broadcast. The only error this function 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // should return is if 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_cond_wait (m_set_condition.Condition(), m_mutex.Mutex()); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } while (err == 0); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Wait until 'timeout_abstime' for any events in 'mask' to reset. 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// If 'timeout_abstime' is NULL, then wait forever. 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::WaitForEventsToReset(const uint32_t mask, const struct timespec *timeout_abstime) const 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x, %p)", this, __FUNCTION__, mask, timeout_abstime); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int err = 0; 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // pthread_cond_timedwait() or pthread_cond_wait() will atomically 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // unlock the mutex and wait for the condition to be set. When either 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // function returns, they will re-lock the mutex. We use an auto lock/unlock 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // class (PThreadMutex::Locker) to allow us to return at any point in this 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // function and not have to worry about unlocking the mutex. 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PTHREAD_MUTEX_LOCKER (locker, m_mutex); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner do 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Check our predicate (event bits) each time through this do loop 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((mask & m_bits) == 0) 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // All the bits requested have been reset, return zero indicating 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // which bits from the mask were still set (none of them) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (timeout_abstime) 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Wait for condition to get broadcast, or for a timeout. If we get 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a timeout we will drop out of the do loop and return false which 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is what we want. 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_cond_timedwait (m_reset_condition.Condition(), m_mutex.Mutex(), timeout_abstime); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Wait for condition to get broadcast. The only error this function 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // should return is if 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_cond_wait (m_reset_condition.Condition(), m_mutex.Mutex()); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } while (err == 0); 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return a mask indicating which bits (if any) were still set 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return mask & m_bits; 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerPThreadEvent::WaitForResetAck (const uint32_t mask, const struct timespec *timeout_abstime) const 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (mask & m_reset_ack_mask) 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // DNBLogThreadedIf(LOG_EVENTS, "%p PThreadEvent::%s (0x%8.8x, %p)", this, __FUNCTION__, mask, timeout_abstime); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return WaitForEventsToReset (mask & m_reset_ack_mask, timeout_abstime); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 228