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

📄 wycond.cpp

📁 一个不错
💻 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 + -