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