📄 wycond.cpp
字号:
/* 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -