wycond.cpp

来自「一个不错」· C++ 代码 · 共 109 行

CPP
109 行
字号
/* Copyright is licensed under GNU LGPL.                 by I.J.Wang 2003*/#define WYLIB_SOURCE#include "wycond.h"const char WyCond::class_name[]="WyCond";WyCond::WyCond() WY__TSPC()#ifndef NDEBUG : _sig(WYCOND_ID)#endif{ // man says never return error code (always return 0?) // WyCond uses default pthread_cond_t. As there is static initializer // ,pthread_cond_init(&_cond,NULL) should be always successful. // const int v=::pthread_cond_init(&_cond,NULL); if(v!=0) {   WY_TERMINATE(""); }};WyCond::~WyCond() WY__TSPC(){#ifndef NDEBUG if(_sig!=WYCOND_ID) {   WY_TERMINATE(""); } _sig=WY_NONE_ID;#endif for(;;) {   const int v( ::pthread_cond_destroy(&_cond) );   if(v==0) {     return;      // succeed   }   if(v==EBUSY) {     // Try to wakeup threads waiting on _cond to have them chance     // to leave (with bad object signature)     //     ::pthread_cond_broadcast(&_cond);     Wy__Base::yield();     continue;   }   break; } WY_TERMINATE("");};void WyCond::signal(void) WY__TSPC(){#ifndef NDEBUG if(_sig!=WYCOND_ID) {   WY_TERMINATE(""); }#endif ::pthread_cond_signal(&_cond);  // man. never return error code return;};void WyCond::broadcast(void) WY__TSPC(){#ifndef NDEBUG if(_sig!=WYCOND_ID) {   WY_TERMINATE(""); }#endif ::pthread_cond_broadcast(&_cond); // man. never return error code return;};WyRet WyCond::wait(WyLock &mtx){#ifndef NDEBUG if(_sig!=WYCOND_ID) {   WY_THROW( WyRet() ); }#endif if(mtx._pmtx==NULL) {   WY_THROW( WyRet(Wym_EINVAL) );   // WyLock is empty } const int retv( ::pthread_cond_wait(&_cond,&((mtx._pmtx)->_mtx)) ); // man says never return errcode, other source says it may if(retv!=0) {   WY_RETURN( WyReply(retv) ); } return(Ok);};WyRet WyCond::wait(WyLock &mtx, WyTimeSpec abstime){#ifndef NDEBUG if(_sig!=WYCOND_ID) {   WY_TERMINATE(""); }#endif if(mtx._pmtx==NULL) {   WY_THROW( WyRet(Wym_EINVAL) );   // WyLock is empty }  const int v( ::pthread_cond_timedwait(&_cond,&((mtx._pmtx)->_mtx),                                       &abstime.wy_timespec()) ); if(v!=0) {   WY_RETURN(WyReply(v)); } return(Ok);};

⌨️ 快捷键说明

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