⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recursive_mutex.cpp

📁 java开源的企业总线.xmlBlaster
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#   else    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    bool ret = false;    pthread_t tid = pthread_self();    if (m_valid_id && pthread_equal(m_thread_id, tid))    {        ++m_count;        ret = true;    }    else if (!m_valid_id)    {        m_thread_id = tid;        m_valid_id = true;        m_count = 1;        ret = true;    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);    return ret;#   endif}void recursive_try_mutex::do_unlock(){#   if defined(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE)    if (--m_count == 0)    {        int res = 0;        res = pthread_mutex_unlock(&m_mutex);        assert(res == 0);    }#   else    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    pthread_t tid = pthread_self();    if (m_valid_id && !pthread_equal(m_thread_id, tid))    {        res = pthread_mutex_unlock(&m_mutex);        assert(res == 0);        throw lock_error();    }    if (--m_count == 0)    {        assert(m_valid_id);        m_valid_id = false;        res = pthread_cond_signal(&m_unlocked);        assert(res == 0);    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);#   endif}void recursive_try_mutex::do_lock(cv_state& state){#   if defined(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE)    m_count = state.count;#   else    int res = 0;    while (m_valid_id)    {        res = pthread_cond_wait(&m_unlocked, &m_mutex);        assert(res == 0);    }    m_thread_id = pthread_self();    m_valid_id = true;    m_count = state.count;    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);#   endif}void recursive_try_mutex::do_unlock(cv_state& state){#   if !defined(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE)    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    assert(m_valid_id);    m_valid_id = false;    res = pthread_cond_signal(&m_unlocked);    assert(res == 0);#   endif    state.pmutex = &m_mutex;    state.count = m_count;}recursive_timed_mutex::recursive_timed_mutex()    : m_valid_id(false), m_count(0){    int res = 0;    res = pthread_mutex_init(&m_mutex, 0);    if (res != 0)        throw thread_resource_error();    res = pthread_cond_init(&m_unlocked, 0);    if (res != 0)    {        pthread_mutex_destroy(&m_mutex);        throw thread_resource_error();    }}recursive_timed_mutex::~recursive_timed_mutex(){    int res = 0;    res = pthread_mutex_destroy(&m_mutex);    assert(res == 0);    res = pthread_cond_destroy(&m_unlocked);    assert(res == 0);}void recursive_timed_mutex::do_lock(){    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    pthread_t tid = pthread_self();    if (m_valid_id && pthread_equal(m_thread_id, tid))        ++m_count;    else    {        while (m_valid_id)        {            res = pthread_cond_wait(&m_unlocked, &m_mutex);            assert(res == 0);        }        m_thread_id = tid;        m_valid_id = true;        m_count = 1;    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);}bool recursive_timed_mutex::do_trylock(){    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    bool ret = false;    pthread_t tid = pthread_self();    if (m_valid_id && pthread_equal(m_thread_id, tid))    {        ++m_count;        ret = true;    }    else if (!m_valid_id)    {        m_thread_id = tid;        m_valid_id = true;        m_count = 1;        ret = true;    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);    return ret;}bool recursive_timed_mutex::do_timedlock(const xtime& xt){    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    bool ret = false;    pthread_t tid = pthread_self();    if (m_valid_id && pthread_equal(m_thread_id, tid))    {        ++m_count;        ret = true;    }    else    {        timespec ts;        to_timespec(xt, ts);        while (m_valid_id)        {            res = pthread_cond_timedwait(&m_unlocked, &m_mutex, &ts);            if (res == ETIMEDOUT)                break;            assert(res == 0);        }        if (!m_valid_id)        {            m_thread_id = tid;            m_valid_id = true;            m_count = 1;            ret = true;        }    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);    return ret;}void recursive_timed_mutex::do_unlock(){    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    pthread_t tid = pthread_self();    if (m_valid_id && !pthread_equal(m_thread_id, tid))    {        res = pthread_mutex_unlock(&m_mutex);        assert(res == 0);        throw lock_error();    }    if (--m_count == 0)    {        assert(m_valid_id);        m_valid_id = false;        res = pthread_cond_signal(&m_unlocked);        assert(res == 0);    }    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);}void recursive_timed_mutex::do_lock(cv_state& state){    int res = 0;    while (m_valid_id)    {        res = pthread_cond_wait(&m_unlocked, &m_mutex);        assert(res == 0);    }    m_thread_id = pthread_self();    m_valid_id = true;    m_count = state.count;    res = pthread_mutex_unlock(&m_mutex);    assert(res == 0);}void recursive_timed_mutex::do_unlock(cv_state& state){    int res = 0;    res = pthread_mutex_lock(&m_mutex);    assert(res == 0);    assert(m_valid_id);    m_valid_id = false;    res = pthread_cond_signal(&m_unlocked);    assert(res == 0);    state.pmutex = &m_mutex;    state.count = m_count;}#elif defined(BOOST_HAS_MPTASKS)using threads::mac::detail::safe_enter_critical_region;recursive_mutex::recursive_mutex()    : m_count(0){}recursive_mutex::~recursive_mutex(){}void recursive_mutex::do_lock(){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    if (++m_count > 1)    {        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}void recursive_mutex::do_unlock(){    if (--m_count == 0)    {        OSStatus lStatus = noErr;        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}void recursive_mutex::do_lock(cv_state& state){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    m_count = state;}void recursive_mutex::do_unlock(cv_state& state){    state = m_count;    m_count = 0;    OSStatus lStatus = noErr;    lStatus = MPExitCriticalRegion(m_mutex);    assert(lStatus == noErr);}recursive_try_mutex::recursive_try_mutex()    : m_count(0){}recursive_try_mutex::~recursive_try_mutex(){}void recursive_try_mutex::do_lock(){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    if (++m_count > 1)    {        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}bool recursive_try_mutex::do_trylock(){    OSStatus lStatus = noErr;    lStatus = MPEnterCriticalRegion(m_mutex, kDurationImmediate);    assert(lStatus == noErr || lStatus == kMPTimeoutErr);    if (lStatus == noErr)    {        if (++m_count > 1)        {            lStatus = MPExitCriticalRegion(m_mutex);            assert(lStatus == noErr);        }        return true;    }    return false;}void recursive_try_mutex::do_unlock(){    if (--m_count == 0)    {        OSStatus lStatus = noErr;        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}void recursive_try_mutex::do_lock(cv_state& state){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    m_count = state;}void recursive_try_mutex::do_unlock(cv_state& state){    state = m_count;    m_count = 0;    OSStatus lStatus = noErr;    lStatus = MPExitCriticalRegion(m_mutex);    assert(lStatus == noErr);}recursive_timed_mutex::recursive_timed_mutex()    : m_count(0){}recursive_timed_mutex::~recursive_timed_mutex(){}void recursive_timed_mutex::do_lock(){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    if (++m_count > 1)    {        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}bool recursive_timed_mutex::do_trylock(){    OSStatus lStatus = noErr;    lStatus = MPEnterCriticalRegion(m_mutex, kDurationImmediate);    assert(lStatus == noErr || lStatus == kMPTimeoutErr);    if (lStatus == noErr)    {        if (++m_count > 1)        {            lStatus = MPExitCriticalRegion(m_mutex);            assert(lStatus == noErr);        }        return true;    }    return false;}bool recursive_timed_mutex::do_timedlock(const xtime& xt){    int microseconds;    to_microduration(xt, microseconds);    Duration lDuration = kDurationMicrosecond * microseconds;    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, lDuration, m_mutex_mutex);    assert(lStatus == noErr || lStatus == kMPTimeoutErr);    if (lStatus == noErr)    {        if (++m_count > 1)        {            lStatus = MPExitCriticalRegion(m_mutex);            assert(lStatus == noErr);        }        return true;    }    return false;}void recursive_timed_mutex::do_unlock(){    if (--m_count == 0)    {        OSStatus lStatus = noErr;        lStatus = MPExitCriticalRegion(m_mutex);        assert(lStatus == noErr);    }}void recursive_timed_mutex::do_lock(cv_state& state){    OSStatus lStatus = noErr;    lStatus = safe_enter_critical_region(m_mutex, kDurationForever, m_mutex_mutex);    assert(lStatus == noErr);    m_count = state;}void recursive_timed_mutex::do_unlock(cv_state& state){    state = m_count;    m_count = 0;    OSStatus lStatus = noErr;    lStatus = MPExitCriticalRegion(m_mutex);    assert(lStatus == noErr);}#endif} // namespace boost// Change Log://   8 Feb 01  WEKEMPF Initial version.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -