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 + -
显示快捷键?