<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>thread.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.10 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> </center> <hr><h1>thread.h</h1><a href="thread_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <font class="comment">// Copyright (C) 1999-2001 Open Source Telecom Corporation.</font> 00002 <font class="comment">// </font> 00003 <font class="comment">// This program is free software; you can redistribute it and/or modify</font> 00004 <font class="comment">// it under the terms of the GNU General Public License as published by</font> 00005 <font class="comment">// the Free Software Foundation; either version 2 of the License, or</font> 00006 <font class="comment">// (at your option) any later version.</font> 00007 <font class="comment">// </font> 00008 <font class="comment">// This program is distributed in the hope that it will be useful,</font> 00009 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00010 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00011 <font class="comment">// GNU General Public License for more details.</font> 00012 <font class="comment">// </font> 00013 <font class="comment">// You should have received a copy of the GNU General Public License</font> 00014 <font class="comment">// along with this program; if not, write to the Free Software </font> 00015 <font class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</font> 00016 <font class="comment">// </font> 00017 <font class="comment">// As a special exception to the GNU General Public License, permission is </font> 00018 <font class="comment">// granted for additional uses of the text contained in its release </font> 00019 <font class="comment">// of Common C++.</font> 00020 <font class="comment">// </font> 00021 <font class="comment">// The exception is that, if you link the Common C++ library with other</font> 00022 <font class="comment">// files to produce an executable, this does not by itself cause the</font> 00023 <font class="comment">// resulting executable to be covered by the GNU General Public License.</font> 00024 <font class="comment">// Your use of that executable is in no way restricted on account of</font> 00025 <font class="comment">// linking the Common C++ library code into it.</font> 00026 <font class="comment">//</font> 00027 <font class="comment">// This exception does not however invalidate any other reasons why</font> 00028 <font class="comment">// the executable file might be covered by the GNU General Public License.</font> 00029 <font class="comment">// </font> 00030 <font class="comment">// This exception applies only to the code released under the </font> 00031 <font class="comment">// name Common C++. If you copy code from other releases into a copy of</font> 00032 <font class="comment">// Common C++, as the General Public License permits, the exception does</font> 00033 <font class="comment">// not apply to the code that you add in this way. To avoid misleading</font> 00034 <font class="comment">// anyone as to the status of such modified files, you must delete</font> 00035 <font class="comment">// this exception notice from them.</font> 00036 <font class="comment">// </font> 00037 <font class="comment">// If you write modifications of your own for Common C++, it is your choice</font> 00038 <font class="comment">// whether to permit this exception to apply to your modifications.</font> 00039 <font class="comment">// If you do not wish that, delete this exception notice. </font> 00040 00041 <font class="preprocessor">#ifndef CCXX_THREAD_H_</font> 00042 <font class="preprocessor"></font><font class="preprocessor">#define CCXX_THREAD_H_</font> 00043 <font class="preprocessor"></font> 00044 <font class="preprocessor">#ifndef WIN32</font> <a name="l00045"></a><a class="code" href="thread_8h.html#a0">00045</a> <font class="preprocessor"></font><font class="preprocessor">#define CCXX_POSIX</font> 00046 <font class="preprocessor"></font><font class="preprocessor">#endif // !WIN32</font> 00047 <font class="preprocessor"></font> 00048 <font class="preprocessor">#ifndef CCXX_CONFIG_H_</font> 00049 <font class="preprocessor"></font><font class="preprocessor">#include <cc++/config.h></font> 00050 <font class="preprocessor">#endif</font> 00051 <font class="preprocessor"></font> 00052 <font class="preprocessor">#ifndef CCXX_EXCEPTION_H_</font> 00053 <font class="preprocessor"></font><font class="preprocessor">#include <<a class="code" href="exception_8h.html">cc++/exception.h</a>></font> 00054 <font class="preprocessor">#endif</font> 00055 <font class="preprocessor"></font> 00056 <font class="preprocessor">#ifndef WIN32</font> 00057 <font class="preprocessor"></font><font class="preprocessor">#if defined(__FreeBSD__) && __FreeBSD__ <= 3</font> 00058 <font class="preprocessor"></font><font class="preprocessor">#define CCXX_SYSV_SEMAPHORES</font> 00059 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00060 <font class="preprocessor"></font> 00061 <font class="preprocessor">#ifndef HAVE_PTHREAD_H</font> 00062 <font class="preprocessor"></font><font class="preprocessor">#include <pthread.h></font> 00063 <font class="preprocessor">#ifndef CCXX_SYSV_SEMAPHORES</font> 00064 <font class="preprocessor"></font><font class="preprocessor">#include <semaphore.h></font> 00065 <font class="preprocessor">#endif</font> 00066 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00067 <font class="preprocessor"></font><font class="preprocessor">#endif // !WIN32</font> 00068 <font class="preprocessor"></font> 00069 <font class="preprocessor">#include <setjmp.h></font> <font class="comment">// for jmp_buf, longjmp</font> 00070 00071 <font class="preprocessor">#ifndef WIN32</font> 00072 <font class="preprocessor"></font><font class="preprocessor">#include <time.h></font> 00073 <font class="preprocessor">#include <signal.h></font> 00074 <font class="preprocessor">#include <unistd.h></font> 00075 00076 <font class="preprocessor">#ifdef __linux__</font> 00077 <font class="preprocessor"></font><font class="preprocessor">#define CCXX_SIG_THREAD_ALARM</font> 00078 <font class="preprocessor"></font><font class="preprocessor">#define CCXX_SIG_THREAD_STOPCONT </font> 00079 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00080 <font class="preprocessor"></font> 00081 <font class="preprocessor">#ifdef _THR_UNIXWARE</font> 00082 <font class="preprocessor"></font><font class="preprocessor">#undef PTHREAD_MUTEXTYPE_RECURSIVE</font> 00083 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00084 <font class="preprocessor"></font> <a name="l00085"></a><a class="code" href="thread_8h.html#a10">00085</a> <font class="keyword">typedef</font> pthread_t cctid_t; <a name="l00086"></a><a class="code" href="thread_8h.html#a11">00086</a> <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> timeout_t; 00087 <font class="preprocessor">#else // WIN32</font> 00088 <font class="preprocessor"></font><font class="keyword">typedef</font> DWORD cctid_t; 00089 <font class="keyword">typedef</font> DWORD timeout_t; 00090 00091 <font class="preprocessor">#define MAX_SEM_VALUE 1000000</font> 00092 <font class="preprocessor"></font><font class="preprocessor">#if defined(__MINGW32__) || defined(__CYGWIN32__)</font> 00093 <font class="preprocessor"></font><font class="preprocessor">#include <Windows32/CommonFunctions.h></font> 00094 <font class="preprocessor">#else</font> 00095 <font class="preprocessor"></font>__declspec(dllimport) <font class="keywordtype">long</font> __stdcall InterlockedIncrement(<font class="keywordtype">long</font> *); 00096 __declspec(dllimport) <font class="keywordtype">long</font> __stdcall InterlockedDecrement(<font class="keywordtype">long</font> *); 00097 __declspec(dllimport) <font class="keywordtype">long</font> __stdcall InterlockedExchange(<font class="keywordtype">long</font> *, <font class="keywordtype">long</font>); 00098 <font class="preprocessor">#endif</font> 00099 <font class="preprocessor"></font> 00100 <font class="preprocessor">#endif // !WIN32</font> 00101 <font class="preprocessor"></font> 00102 <font class="preprocessor">#ifdef CCXX_NAMESPACES</font> 00103 <font class="preprocessor"></font><font class="keyword">namespace </font>ost { 00104 <font class="preprocessor">#endif</font> 00105 <font class="preprocessor"></font> <a name="l00106"></a><a class="code" href="namespaceost.html#a253">00106</a> <font class="keyword">enum</font> throw_t { 00107 THROW_NOTHING, 00108 THROW_OBJECT, 00109 THROW_EXCEPTION 00110 }; <a name="l00111"></a><a class="code" href="namespaceost.html#a138">00111</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> throw_t throw_t; 00112 <font class="keyword">class </font>Thread; 00113 <a name="l00114"></a><a class="code" href="thread_8h.html#a1">00114</a> <font class="preprocessor">#define TIMEOUT_INF ~((timeout_t) 0)</font> 00115 <font class="preprocessor"></font> <a name="l00116"></a><a class="code" href="thread_8h.html#a2">00116</a> <font class="preprocessor">#define ENTER_CRITICAL EnterMutex();</font> <a name="l00117"></a><a class="code" href="thread_8h.html#a3">00117</a> <font class="preprocessor"></font><font class="preprocessor">#define LEAVE_CRITICAL LeaveMutex();</font> <a name="l00118"></a><a class="code" href="thread_8h.html#a4">00118</a> <font class="preprocessor"></font><font class="preprocessor">#define ENTER_DEFERRED setCancel(THREAD_CANCEL_DEFERRED);</font> <a name="l00119"></a><a class="code" href="thread_8h.html#a5">00119</a> <font class="preprocessor"></font><font class="preprocessor">#define LEAVE_DEFERRED setCancel(THREAD_CANCEL_IMMEDIATE);</font> 00120 <font class="preprocessor"></font> <a name="l00121"></a><a class="code" href="namespaceost.html#a254">00121</a> <font class="keyword">enum</font> thread_cancel_t 00122 { 00123 THREAD_CANCEL_INITIAL=0, 00124 THREAD_CANCEL_DEFERRED=1, 00125 THREAD_CANCEL_IMMEDIATE, 00126 THREAD_CANCEL_DISABLED, 00127 THREAD_CANCEL_DEFAULT=THREAD_CANCEL_DEFERRED 00128 }; <a name="l00129"></a><a class="code" href="namespaceost.html#a139">00129</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> thread_cancel_t thread_cancel_t; 00130 <a name="l00131"></a><a class="code" href="namespaceost.html#a255">00131</a> <font class="keyword">enum</font> thread_suspend_t 00132 { 00133 THREAD_SUSPEND_ENABLE, 00134 THREAD_SUSPEND_DISABLE 00135 }; <a name="l00136"></a><a class="code" href="namespaceost.html#a140">00136</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> thread_suspend_t thread_suspend_t; 00137 00138 <font class="preprocessor">#ifndef WIN32</font> 00139 <font class="preprocessor"></font><font class="comment">// These macros override common functions with thread-safe versions. In</font> 00140 <font class="comment">// particular the common "libc" sleep() has problems since it normally</font> 00141 <font class="comment">// uses SIGARLM (as actually defined by "posix"). The pthread_delay and</font> 00142 <font class="comment">// usleep found in libpthread are gaurenteed not to use SIGALRM and offer</font> 00143 <font class="comment">// higher resolution. psleep() is defined to call the old process sleep.</font> 00144 00145 <font class="preprocessor">#undef sleep</font> <a name="l00146"></a><a class="code" href="thread_8h.html#a6">00146</a> <font class="preprocessor"></font><font class="preprocessor">#define psleep(x) (sleep)(x)</font> 00147 <font class="preprocessor"></font> 00148 <font class="preprocessor">#ifndef CCXX_SIG_THREAD_STOPCONT</font> 00149 <font class="preprocessor"></font><font class="preprocessor">#ifndef _THR_SUNOS5</font> 00150 <font class="preprocessor"></font><font class="preprocessor">#ifndef HAVE_PTHREAD_SUSPEND</font> 00151 <font class="preprocessor"></font><font class="keyword">static</font> RETSIGTYPE ccxx_sigsuspend(<font class="keywordtype">int</font>); 00152 <font class="preprocessor">#endif</font> 00153 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00154 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00155 <font class="preprocessor"></font><font class="keyword">extern</font> <font class="stringliteral">"C"</font> <font class="keywordtype">void</font> <a class="code" href="namespaceost.html#a218">execHandler</a>(Thread *th); 00156 00157 <font class="preprocessor">#endif // !WIN32</font> 00158 <font class="preprocessor"></font> 00159 00160 CCXX_EXPORT(Thread*) <a class="code" href="namespaceost.html#a219">getThread</a>(<font class="keywordtype">void</font>); 00161 CCXX_EXPORT(throw_t) <a class="code" href="namespaceost.html#a220">getException</a>(<font class="keywordtype">void</font>); 00162 CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="namespaceost.html#a221">setException</a>(throw_t mode); 00163 CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="namespaceost.html#a222">ccxx_sleep</a>(timeout_t msec); 00164 CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="namespaceost.html#a223">ccxx_yield</a>(<font class="keywordtype">void</font>); 00165 00166 <font class="preprocessor">#undef Yield</font> <a name="l00167"></a><a class="code" href="thread_8h.html#a7">00167</a> <font class="preprocessor"></font><font class="preprocessor">#define sleep(x) ccxx_sleep((x) * 1000)</font> <a name="l00168"></a><a class="code" href="thread_8h.html#a8">00168</a> <font class="preprocessor"></font><font class="preprocessor">#define yield() ccxx_yield()</font> 00169 <font class="preprocessor"></font> 00170 <font class="preprocessor">#ifdef WIN32</font> 00171 <font class="preprocessor"></font>CCXX_EXPORT(DWORD) waitThread(HANDLE hRef, timeout_t timeout); 00172 <font class="preprocessor">#endif</font> 00173 <font class="preprocessor"></font> 00174 <font class="keyword">class </font>Conditional; 00175 <font class="keyword">class </font>CCXX_CLASS_EXPORT Event; 00176 <a name="l00220"></a><a class="code" href="classost_1_1_mutex.html">00220</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT Mutex 00221 { <a name="l00222"></a><a class="code" href="classost_1_1_mutex.html#l0">00222</a> <font class="keyword">friend</font> <font class="keyword">class </font>Conditional; <a name="l00223"></a><a class="code" href="classost_1_1_mutex.html#l1">00223</a> <font class="keyword">friend</font> <font class="keyword">class </font>Event; 00224 <font class="keyword">private</font>: 00225 <font class="preprocessor">#ifndef WIN32</font> 00226 <font class="preprocessor"></font><font class="preprocessor">#ifndef PTHREAD_MUTEXTYPE_RECURSIVE</font> 00227 <font class="preprocessor"></font> <font class="keyword">volatile</font> <font class="keywordtype">int</font> _level; 00228 <font class="keyword">volatile</font> Thread *_tid; 00229 <font class="preprocessor">#endif</font> 00230 <font class="preprocessor"></font> 00238 pthread_mutex_t _mutex; 00239 <font class="preprocessor">#else</font> 00240 <font class="preprocessor"></font> HANDLE mutex; 00241 <font class="preprocessor">#endif</font> 00242 <font class="preprocessor"></font> 00243 <font class="keyword">public</font>: 00247 <a class="code" href="classost_1_1_mutex.html#a0">Mutex</a>(); 00248 00254 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_mutex.html#a1">~Mutex</a>(); 00255 00263 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_mutex.html#a2">EnterMutex</a>(<font class="keywordtype">void</font>); 00264 00275 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_mutex.html#a3">TryEnterMutex</a>(<font class="keywordtype">void</font>); 00276 00287 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_mutex.html#a4">LeaveMutex</a>(<font class="keywordtype">void</font>); 00288 }; 00289 <a name="l00311"></a><a class="code" href="classost_1_1_mutex_lock.html">00311</a> <font class="keyword">class </font>MutexLock 00312 { 00313 <font class="keyword">private</font>: 00314 Mutex& mutex; 00315 <font class="keyword">public</font>: <a name="l00319"></a><a class="code" href="classost_1_1_mutex_lock.html#a0">00319</a> <a class="code" href="classost_1_1_mutex_lock.html#a0">MutexLock</a>( Mutex& _mutex ) : mutex( _mutex ) 00320 { mutex.EnterMutex(); } 00324 <font class="comment">// this should be not-virtual</font> <a name="l00325"></a><a class="code" href="classost_1_1_mutex_lock.html#a1">00325</a> <a class="code" href="classost_1_1_mutex_lock.html#a1">~MutexLock</a>()<font class="keyword"></font> 00326 <font class="keyword"> </font>{ mutex.LeaveMutex(); } 00327 }; 00328 <a name="l00337"></a><a class="code" href="classost_1_1_thread_lock.html">00337</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT ThreadLock 00338 { 00339 <font class="keyword">private</font>: 00340 <font class="preprocessor">#ifdef HAVE_PTHREAD_RWLOCK</font> 00341 <font class="preprocessor"></font> pthread_rwlock_t _lock; 00342 <font class="preprocessor">#else</font> 00343 <font class="preprocessor"></font> Mutex mutex; 00344 <font class="preprocessor">#endif</font> 00345 <font class="preprocessor"></font> 00346 <font class="keyword">public</font>: 00350 <a class="code" href="classost_1_1_thread_lock.html#a0">ThreadLock</a>(); 00351 00355 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_thread_lock.html#a1">~ThreadLock</a>(); 00356 00360 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread_lock.html#a2">ReadLock</a>(<font class="keywordtype">void</font>); 00361 00365 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread_lock.html#a3">WriteLock</a>(<font class="keywordtype">void</font>); 00366 00372 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_thread_lock.html#a4">TryReadLock</a>(<font class="keywordtype">void</font>); 00373 00379 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_thread_lock.html#a5">TryWriteLock</a>(<font class="keywordtype">void</font>); 00380 00384 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread_lock.html#a6">Unlock</a>(<font class="keywordtype">void</font>); 00385 }; 00386 <a name="l00396"></a><a class="code" href="classost_1_1_mutex_counter.html">00396</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT MutexCounter : <font class="keyword">public</font> Mutex 00397 { 00398 <font class="keyword">private</font>: 00399 <font class="keywordtype">int</font> counter; 00400 00401 <font class="keyword">public</font>: 00402 <a class="code" href="classost_1_1_mutex_counter.html#a0">MutexCounter</a>(); 00403 <a class="code" href="classost_1_1_mutex_counter.html#a0">MutexCounter</a>(<font class="keywordtype">int</font> initial); 00404 00405 <font class="keyword">friend</font> CCXX_EXPORT(<font class="keywordtype">int</font>) <a class="code" href="classost_1_1_mutex_counter.html#l0">operator++</a>(MutexCounter &mc); 00406 <font class="keyword">friend</font> CCXX_EXPORT(<font class="keywordtype">int</font>) <a class="code" href="classost_1_1_mutex_counter.html#l1">operator--</a>(MutexCounter &mc); 00407 }; 00408 <a name="l00419"></a><a class="code" href="classost_1_1_atomic_counter.html">00419</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT AtomicCounter 00420 { 00421 <font class="preprocessor">#ifndef WIN32</font> 00422 <font class="preprocessor"></font><font class="keyword">private</font>: 00423 <font class="preprocessor">#ifdef HAVE_ATOMIC</font> 00424 <font class="preprocessor"></font> atomic_t atomic; 00425 <font class="preprocessor">#else</font> 00426 <font class="preprocessor"></font> <font class="keywordtype">int</font> counter; 00427 Mutex lock; 00428 <font class="preprocessor">#endif</font> 00429 <font class="preprocessor"></font> 00430 <font class="keyword">public</font>: 00434 <a class="code" href="classost_1_1_atomic_counter.html#a0">AtomicCounter</a>(); 00435 00441 <a class="code" href="classost_1_1_atomic_counter.html#a0">AtomicCounter</a>(<font class="keywordtype">int</font> value); 00442 00443 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a2">operator++</a>(<font class="keywordtype">void</font>); 00444 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a3">operator--</a>(<font class="keywordtype">void</font>); 00445 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a4">operator+=</a>(<font class="keywordtype">int</font> change); 00446 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a5">operator-=</a>(<font class="keywordtype">int</font> change); 00447 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a6">operator+</a>(<font class="keywordtype">int</font> change); 00448 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a7">operator-</a>(<font class="keywordtype">int</font> change); 00449 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a8">operator=</a>(<font class="keywordtype">int</font> value); 00450 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_atomic_counter.html#a9">operator!</a>(<font class="keywordtype">void</font>); 00451 <a class="code" href="classost_1_1_atomic_counter.html#a10">operator int</a>(); 00452 <font class="preprocessor">#else</font> 00453 <font class="preprocessor"></font><font class="keyword">private</font>: 00454 <font class="keywordtype">long</font> atomic; 00455 00456 <font class="keyword">public</font>: 00457 <font class="keyword">inline</font> <a class="code" href="classost_1_1_atomic_counter.html#a0">AtomicCounter</a>()<font class="keyword"></font> 00458 <font class="keyword"> </font>{atomic = 0;}; 00459 00460 <font class="keyword">inline</font> <a class="code" href="classost_1_1_atomic_counter.html#a0">AtomicCounter</a>(<font class="keywordtype">int</font> value)<font class="keyword"></font> 00461 <font class="keyword"> </font>{atomic = value;}; 00462 00463 <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a2">operator++</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00464 <font class="keyword"> </font>{<font class="keywordflow">return</font> InterlockedIncrement(&atomic);}; 00465 00466 <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a3">operator--</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00467 <font class="keyword"> </font>{<font class="keywordflow">return</font> InterlockedDecrement(&atomic);}; 00468 00469 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a4">operator+=</a>(<font class="keywordtype">int</font> change); 00470 00471 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a5">operator-=</a>(<font class="keywordtype">int</font> change); 00472 00473 <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a6">operator+</a>(<font class="keywordtype">int</font> change)<font class="keyword"></font> 00474 <font class="keyword"> </font>{<font class="keywordflow">return</font> atomic + change;}; 00475 00476 <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a7">operator-</a>(<font class="keywordtype">int</font> change)<font class="keyword"></font> 00477 <font class="keyword"> </font>{<font class="keywordflow">return</font> atomic - change;}; 00478 00479 <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_atomic_counter.html#a8">operator=</a>(<font class="keywordtype">int</font> value)<font class="keyword"></font> 00480 <font class="keyword"> </font>{<font class="keywordflow">return</font> InterlockedExchange(&atomic, value);}; 00481 00482 <font class="keyword">inline</font> <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_atomic_counter.html#a9">operator!</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00483 <font class="keyword"> </font>{<font class="keywordflow">return</font> (atomic == 0) ? <font class="keyword">true</font> : <font class="keyword">false</font>;}; 00484 00485 <font class="keyword">inline</font> <a class="code" href="classost_1_1_atomic_counter.html#a10">operator int</a>()<font class="keyword"></font> 00486 <font class="keyword"> </font>{<font class="keywordflow">return</font> atomic;}; 00487 <font class="preprocessor">#endif</font> 00488 <font class="preprocessor"></font>}; 00489 00490 <font class="comment">// FIXME: implement Conditional class for win32</font> 00491 <font class="preprocessor">#ifndef WIN32</font> 00492 <font class="preprocessor"></font> <a name="l00502"></a><a class="code" href="classost_1_1_conditional.html">00502</a> <font class="keyword">class </font>Conditional : <font class="keyword">public</font> Mutex 00503 { 00504 <font class="keyword">private</font>: 00505 pthread_cond_t _cond; 00506 00507 <font class="keyword">public</font>: 00511 <a class="code" href="classost_1_1_conditional.html#a0">Conditional</a>(); 00512 00516 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_conditional.html#a1">~Conditional</a>(); 00517 00523 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_conditional.html#a2">Signal</a>(<font class="keywordtype">bool</font> broadcast); 00524 00528 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_conditional.html#a3">Wait</a>(timeout_t timer = 0); 00529 }; 00530 <font class="preprocessor">#endif</font> 00531 <font class="preprocessor"></font> <a name="l00549"></a><a class="code" href="classost_1_1_semaphore.html">00549</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT Semaphore 00550 { 00551 <font class="keyword">private</font>: 00552 <font class="preprocessor">#ifndef WIN32</font> 00553 <font class="preprocessor"></font><font class="preprocessor">#ifdef CCXX_SYSV_SEMAPHORES</font> 00554 <font class="preprocessor"></font> <font class="keywordtype">int</font> _semaphore; 00555 <font class="preprocessor">#else</font> 00556 <font class="preprocessor"></font> sem_t _semaphore; 00557 <font class="preprocessor">#endif</font> 00558 <font class="preprocessor"></font><font class="preprocessor">#else // WIN32</font> 00559 <font class="preprocessor"></font> HANDLE semObject; 00560 <font class="preprocessor">#endif // !WIN32</font> 00561 <font class="preprocessor"></font> 00562 <font class="keyword">public</font>: 00571 <a class="code" href="classost_1_1_semaphore.html#a0">Semaphore</a>(size_t resource = 0); 00572 00579 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_semaphore.html#a1">~Semaphore</a>(); 00580 00594 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_semaphore.html#a2">Wait</a>(<font class="keywordtype">void</font>); 00595 00607 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_semaphore.html#a3">TryWait</a>(<font class="keywordtype">void</font>); 00608 00620 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_semaphore.html#a4">Post</a>(<font class="keywordtype">void</font>); 00621 00622 <font class="comment">// FIXME: how implement getValue for posix compatibility ?</font> 00628 <font class="comment"></font><font class="preprocessor">#ifndef WIN32</font> 00629 <font class="preprocessor"></font><font class="preprocessor">#ifndef __CYGWIN32__</font> 00630 <font class="preprocessor"></font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_semaphore.html#a5">getValue</a>(<font class="keywordtype">void</font>); 00631 <font class="preprocessor">#endif</font> 00632 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00633 <font class="preprocessor"></font>}; 00634 <a name="l00648"></a><a class="code" href="classost_1_1_event.html">00648</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT Event 00649 { 00650 <font class="keyword">private</font>: 00651 <font class="preprocessor">#ifndef WIN32</font> 00652 <font class="preprocessor"></font> Mutex mutex; 00653 pthread_cond_t _cond; 00654 <font class="keywordtype">bool</font> _signaled; 00655 <font class="keywordtype">int</font> _count; 00656 <font class="preprocessor">#else</font> 00657 <font class="preprocessor"></font> HANDLE cond; 00658 <font class="preprocessor">#endif</font> 00659 <font class="preprocessor"></font> 00660 <font class="keyword">public</font>: 00661 <a class="code" href="classost_1_1_event.html#a0">Event</a>(); 00662 00663 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_event.html#a1">~Event</a>(); 00664 00671 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_event.html#a2">Reset</a>(<font class="keywordtype">void</font>); 00672 00676 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_event.html#a3">Signal</a>(<font class="keywordtype">void</font>); 00677 00686 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_event.html#a5">Wait</a>(timeout_t timer); 00687 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_event.html#a5">Wait</a>(<font class="keywordtype">void</font>); 00688 }; 00689 <a name="l00711"></a><a class="code" href="classost_1_1_buffer.html">00711</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT Buffer 00712 { 00713 <font class="keyword">private</font>: 00714 Mutex lock_head, lock_tail; 00715 Semaphore size_head, size_tail; 00716 size_t _size; 00717 size_t _used; 00718 00719 <font class="keyword">protected</font>: 00725 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#b0">OnPeek</a>(<font class="keywordtype">void</font> *buf) = 0; 00731 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#b1">OnWait</a>(<font class="keywordtype">void</font> *buf) = 0; 00737 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#b2">OnPost</a>(<font class="keywordtype">void</font> *buf) = 0; 00738 00739 <font class="keyword">public</font>: 00744 <a class="code" href="classost_1_1_buffer.html#a0">Buffer</a>(size_t capacity); <a name="l00749"></a><a class="code" href="classost_1_1_buffer.html#a1">00749</a> <font class="keyword">virtual</font> <a class="code" href="classost_1_1_buffer.html#a1">~Buffer</a>()<font class="keyword"></font> 00750 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 00751 <a name="l00756"></a><a class="code" href="classost_1_1_buffer.html#a2">00756</a> <font class="keyword">inline</font> size_t <a class="code" href="classost_1_1_buffer.html#a2">getSize</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00757 <font class="keyword"> </font>{<font class="keywordflow">return</font> _size;}; 00758 <a name="l00765"></a><a class="code" href="classost_1_1_buffer.html#a3">00765</a> <font class="keyword">inline</font> size_t <a class="code" href="classost_1_1_buffer.html#a3">getUsed</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00766 <font class="keyword"> </font>{<font class="keywordflow">return</font> _used;}; 00767 00776 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#a4">Wait</a>(<font class="keywordtype">void</font> *buf); 00777 00785 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#a5">Post</a>(<font class="keywordtype">void</font> *buf); 00786 00793 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_buffer.html#a6">Peek</a>(<font class="keywordtype">void</font> *buf); 00794 <a name="l00799"></a><a class="code" href="classost_1_1_buffer.html#a7">00799</a> <font class="keyword">virtual</font> <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_buffer.html#a7">isValid</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00800 <font class="keyword"> </font>{<font class="keywordflow">return</font> <font class="keyword">true</font>;}; 00801 }; 00802 <a name="l00810"></a><a class="code" href="classost_1_1_fixed_buffer.html">00810</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT FixedBuffer : <font class="keyword">public</font> Buffer 00811 { 00812 <font class="keyword">private</font>: 00813 <font class="keywordtype">char</font> *buf, *head, *tail; 00814 size_t objsize; 00815 00816 <font class="keyword">protected</font>: 00822 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_fixed_buffer.html#b0">OnPeek</a>(<font class="keywordtype">void</font> *buf); 00823 00829 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_fixed_buffer.html#b1">OnWait</a>(<font class="keywordtype">void</font> *buf); 00830 00836 <font class="keywordtype">int</font> <a class="code" href="classost_1_1_fixed_buffer.html#b2">OnPost</a>(<font class="keywordtype">void</font> *buf); 00837 00838 <font class="keyword">public</font>: 00846 <a class="code" href="classost_1_1_fixed_buffer.html#a0">FixedBuffer</a>(size_t capacity, size_t objsize); 00847 00854 <a class="code" href="classost_1_1_fixed_buffer.html#a0">FixedBuffer</a>(<font class="keyword">const</font> FixedBuffer &fb); 00855 00859 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_fixed_buffer.html#a2">~FixedBuffer</a>(); 00860 00861 FixedBuffer &<a class="code" href="classost_1_1_fixed_buffer.html#a3">operator=</a>(<font class="keyword">const</font> FixedBuffer &fb); 00862 00863 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_fixed_buffer.html#a4">isValid</a>(<font class="keywordtype">void</font>); 00864 }; 00865 <a name="l01013"></a><a class="code" href="classost_1_1_thread.html">01013</a> <font class="keyword">class </font>Thread 01014 { 01015 <font class="preprocessor">#ifndef WIN32</font> <a name="l01016"></a><a class="code" href="classost_1_1_thread.html#l0">01016</a> <font class="preprocessor"></font><font class="keyword">friend</font> <font class="keyword">class </font>PosixThread; 01017 <font class="keyword">friend</font> RETSIGTYPE <a class="code" href="classost_1_1_thread.html#l2">ccxx_sigsuspend</a>(<font class="keywordtype">int</font>); 01018 <font class="preprocessor">#endif</font> 01019 <font class="preprocessor"></font><font class="keyword">private</font>: <a name="l01020"></a><a class="code" href="classost_1_1_thread.html#l1">01020</a> <font class="keyword">friend</font> <font class="keyword">class </font>Slog; 01021 01022 <font class="keyword">static</font> Thread *_main; 01023 01024 Thread *_parent; 01025 <font class="preprocessor">#ifndef WIN32</font> 01026 <font class="preprocessor"></font> pthread_t _tid; 01027 pthread_attr_t _attr; 01028 AtomicCounter _suspendcount; 01029 <font class="preprocessor">#else</font> 01030 <font class="preprocessor"></font> DWORD _tid; 01031 HANDLE _cancellation; 01032 <font class="preprocessor">#endif</font> 01033 <font class="preprocessor"></font> thread_cancel_t _cancel; 01034 jmp_buf _env; 01035 Semaphore *_start; 01036 <font class="keywordtype">int</font> _msgpos; 01037 <font class="keywordtype">char</font> _msgbuf[128]; 01038 throw_t _throw; 01039 01040 <font class="preprocessor">#ifndef WIN32</font> 01041 <font class="preprocessor"></font> <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#l3">execHandler</a>(Thread *th); 01042 <font class="keyword">friend</font> Thread *<a class="code" href="classost_1_1_thread.html#l4">getThread</a>(<font class="keywordtype">void</font>); 01043 <font class="preprocessor">#else</font> 01044 <font class="preprocessor"></font> <font class="keywordtype">bool</font> _active:1; 01045 <font class="keywordtype">bool</font> _suspendEnable:1; 01046 <font class="keyword">static</font> <font class="keywordtype">unsigned</font> __stdcall Execute(Thread *th); 01047 HANDLE _hThread; 01048 <font class="preprocessor">#endif</font> 01049 <font class="preprocessor"></font> 01050 <font class="keyword">protected</font>: 01060 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#b0">Run</a>(<font class="keywordtype">void</font>) = 0; 01061 <a name="l01074"></a><a class="code" href="classost_1_1_thread.html#b1">01074</a> CCXX_MEMBER_EXPORT(<font class="keyword">virtual</font> <font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b1">Final</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01075 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01076 <a name="l01087"></a><a class="code" href="classost_1_1_thread.html#b2">01087</a> CCXX_MEMBER_EXPORT(<font class="keyword">virtual</font> <font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b2">Initial</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01088 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01089 <a name="l01099"></a><a class="code" href="classost_1_1_thread.html#b3">01099</a> CCXX_MEMBER_EXPORT(<font class="keyword">virtual</font> <font class="keywordtype">void</font>*) <a class="code" href="classost_1_1_thread.html#b3">getExtended</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01100 <font class="keyword"> </font>{<font class="keywordflow">return</font> NULL;}; 01101 <a name="l01109"></a><a class="code" href="classost_1_1_thread.html#b4">01109</a> CCXX_MEMBER_EXPORT(<font class="keyword">virtual</font> <font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b4">Notify</a>(Thread *th)<font class="keyword"></font> 01110 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01111 <a name="l01121"></a><a class="code" href="classost_1_1_thread.html#b5">01121</a> CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b5">Sleep</a>(timeout_t msec) 01122 <font class="preprocessor">#ifndef WIN32</font> 01123 <font class="preprocessor"></font> {<a class="code" href="classost_1_1_thread.html#l9">ccxx_sleep</a>(msec);} 01124 <font class="preprocessor">#endif</font> 01125 <font class="preprocessor"></font> ; 01126 01127 <font class="comment">// FIXME: _env can not initialized</font> <a name="l01133"></a><a class="code" href="classost_1_1_thread.html#b6">01133</a> <font class="comment"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#b6">Exit</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01134 <font class="keyword"> </font>{longjmp(_env, 1);}; 01135 01140 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b7">Yield</a>(<font class="keywordtype">void</font>); 01141 01145 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b8">testCancel</a>(<font class="keywordtype">void</font>); 01146 01155 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b9">setCancel</a>(thread_cancel_t mode); 01156 01164 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b10">setSuspend</a>(thread_suspend_t mode); 01165 01174 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#b11">Terminate</a>(<font class="keywordtype">void</font>); 01175 <a name="l01179"></a><a class="code" href="classost_1_1_thread.html#b12">01179</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#b12">clrParent</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01180 <font class="keyword"> </font>{_parent = NULL;}; 01181 01182 <font class="preprocessor">#ifdef WIN32</font> 01183 <font class="preprocessor"></font> <font class="comment">// FIXME: should be private</font> 01184 CCXX_MEMBER_EXPORT(DWORD) WaitHandle(HANDLE obj, timeout_t timeout); 01185 <font class="preprocessor">#endif</font> 01186 <font class="preprocessor"></font> 01187 <font class="keyword">public</font>: 01196 CCXX_MEMBER_EXPORT(CCXX_EMPTY) <a class="code" href="classost_1_1_thread.html#a0">Thread</a>(<font class="keywordtype">bool</font> isMain); 01197 01210 CCXX_MEMBER_EXPORT(CCXX_EMPTY) <a class="code" href="classost_1_1_thread.html#a0">Thread</a>(<font class="keywordtype">int</font> pri = 0, size_t stack = 0); 01211 01212 <font class="comment">// FIXME: win32 lack copy constructor</font> 01213 <font class="preprocessor">#ifndef WIN32</font> 01214 <font class="preprocessor"></font> 01221 <a class="code" href="classost_1_1_thread.html#a0">Thread</a>(<font class="keyword">const</font> Thread &th); 01222 <font class="preprocessor">#endif</font> 01223 <font class="preprocessor"></font> <a name="l01230"></a><a class="code" href="classost_1_1_thread.html#a3">01230</a> CCXX_MEMBER_EXPORT(<font class="keyword">virtual</font>) <a class="code" href="classost_1_1_thread.html#a3">~Thread</a>()<font class="keyword"></font> 01231 <font class="keyword"> </font>{<a class="code" href="classost_1_1_thread.html#b11">Terminate</a>();}; 01232 01245 CCXX_MEMBER_EXPORT(<font class="keywordtype">int</font>) <a class="code" href="classost_1_1_thread.html#a4">Start</a>(Semaphore *start = 0); 01246 01255 CCXX_MEMBER_EXPORT(<font class="keywordtype">int</font>) <a class="code" href="classost_1_1_thread.html#a5">Detach</a>(Semaphore *start = 0); 01256 <a name="l01263"></a><a class="code" href="classost_1_1_thread.html#a6">01263</a> <font class="keyword">inline</font> Thread *<a class="code" href="classost_1_1_thread.html#a6">getParent</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01264 <font class="keyword"> </font>{<font class="keywordflow">return</font> _parent;}; 01265 01272 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#a7">Suspend</a>(<font class="keywordtype">void</font>); 01273 01277 CCXX_MEMBER_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#a8">Resume</a>(<font class="keywordtype">void</font>); 01278 <a name="l01285"></a><a class="code" href="classost_1_1_thread.html#a9">01285</a> <font class="keyword">inline</font> thread_cancel_t <a class="code" href="classost_1_1_thread.html#a9">getCancel</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01286 <font class="keyword"> </font>{<font class="keywordflow">return</font> _cancel;}; 01287 01294 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_thread.html#a10">isRunning</a>(<font class="keywordtype">void</font>) 01295 <font class="preprocessor">#ifdef WIN32</font> 01296 <font class="preprocessor"></font> {<font class="keywordflow">return</font> (_tid != 0) ? <font class="keyword">true</font> : <font class="keyword">false</font>;} 01297 <font class="preprocessor">#endif</font> 01298 <font class="preprocessor"></font> ; 01299 01306 <font class="keywordtype">bool</font> <a class="code" href="classost_1_1_thread.html#a11">isThread</a>(<font class="keywordtype">void</font>) 01307 <font class="preprocessor">#ifdef WIN32</font> 01308 <font class="preprocessor"></font> {<font class="keywordflow">return</font> ((_tid == GetCurrentThreadId())) ? <font class="keyword">true</font> : <font class="keyword">false</font>;} 01309 <font class="preprocessor">#endif</font> 01310 <font class="preprocessor"></font> ; 01311 01317 <font class="keyword">friend</font> CCXX_EXPORT(throw_t) <a class="code" href="classost_1_1_thread.html#l5">getException</a>(<font class="keywordtype">void</font>); 01318 01324 <font class="keyword">friend</font> CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#l6">setException</a>(throw_t mode); 01325 01326 <font class="comment">// FIXME: _start can be NULL</font> <a name="l01333"></a><a class="code" href="classost_1_1_thread.html#l7">01333</a> <font class="comment"></font> <font class="keyword">friend</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#l7">operator++</a>(Thread &th)<font class="keyword"></font> 01334 <font class="keyword"> </font>{th._start->Post();}; 01335 <a name="l01336"></a><a class="code" href="classost_1_1_thread.html#l8">01336</a> <font class="keyword">friend</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread.html#l8">operator--</a>(Thread &th)<font class="keyword"></font> 01337 <font class="keyword"> </font>{th._start->Wait();}; 01338 01344 <font class="keyword">friend</font> CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#l9">ccxx_sleep</a>(timeout_t msec); 01345 01349 <font class="keyword">friend</font> CCXX_EXPORT(<font class="keywordtype">void</font>) <a class="code" href="classost_1_1_thread.html#l10">ccxx_yield</a>(<font class="keywordtype">void</font>); 01350 01351 <font class="preprocessor">#ifdef WIN32</font> 01352 <font class="preprocessor"></font> <font class="comment">// FIXME: not defined in posix</font> 01353 <font class="keyword">inline</font> <font class="keywordtype">bool</font> isCancelled(<font class="keywordtype">void</font>)<font class="keyword"></font> 01354 <font class="keyword"> </font>{<font class="keywordflow">return</font> waitThread(_cancellation, 0) == WAIT_OBJECT_0; }; 01355 01356 <font class="keyword">inline</font> <font class="keywordtype">bool</font> isCancelled(timeout_t timer)<font class="keyword"></font> 01357 <font class="keyword"> </font>{<font class="keywordflow">return</font> waitThread(_cancellation, timer) == WAIT_OBJECT_0; }; 01358 01359 <font class="keyword">friend</font> CCXX_EXPORT(DWORD) waitThread(HANDLE hRef, timeout_t timeout); 01360 <font class="preprocessor">#endif</font> 01361 <font class="preprocessor"></font>}; 01362 01363 <font class="preprocessor">#if !defined(WIN32) && !defined(__CYGWIN32__) && !defined(__MINGW32__)</font> 01364 <font class="preprocessor"></font><font class="keyword">extern</font> <font class="stringliteral">"C"</font> <font class="keywordtype">void</font> <a class="code" href="namespaceost.html#a224">sigHandler</a>(<font class="keywordtype">int</font> signo); 01365 <a name="l01366"></a><a class="code" href="namespaceost.html#a141">01366</a> <font class="keyword">typedef</font> <font class="keywordtype">int</font> signo_t; 01367 <a name="l01368"></a><a class="code" href="classost_1_1_posix_thread.html">01368</a> <font class="keyword">class </font>PosixThread: <font class="keyword">public</font> Thread 01369 { 01370 <font class="keyword">private</font>: 01371 <font class="preprocessor">#ifndef WIN32</font> 01372 <font class="preprocessor"></font> <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#l0">execHandler</a>(Thread *th); 01373 <font class="preprocessor">#endif</font> 01374 <font class="preprocessor"></font><font class="preprocessor">#ifndef CCXX_SIG_THREAD_ALARM</font> 01375 <font class="preprocessor"></font> <font class="keyword">static</font> PosixThread *_timer; 01376 <font class="keyword">static</font> Mutex _arm; 01377 <font class="preprocessor">#endif</font> 01378 <font class="preprocessor"></font> 01379 time_t _alarm; 01380 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#l1">sigHandler</a>(<font class="keywordtype">int</font> signo); 01381 <font class="keyword">inline</font> <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#a0">SignalThread</a>(Thread* th,signo_t signo)<font class="keyword"></font> 01382 <font class="keyword"> </font>{pthread_kill(th->_tid, signo);}; 01383 <font class="keyword">protected</font>: 01384 <a name="l01391"></a><a class="code" href="classost_1_1_posix_thread.html#b0">01391</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b0">SignalParent</a>(signo_t signo)<font class="keyword"></font> 01392 <font class="keyword"> </font>{ <a class="code" href="classost_1_1_posix_thread.html#a0">SignalThread</a>(_parent,signo); }; 01393 <a name="l01400"></a><a class="code" href="classost_1_1_posix_thread.html#b1">01400</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b1">SignalMain</a>(signo_t signo)<font class="keyword"></font> 01401 <font class="keyword"> </font>{ <a class="code" href="classost_1_1_posix_thread.html#a0">SignalThread</a>(_main,signo);}; 01402 <a name="l01407"></a><a class="code" href="classost_1_1_posix_thread.html#b2">01407</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b2">OnTimer</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01408 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01409 <a name="l01414"></a><a class="code" href="classost_1_1_posix_thread.html#b3">01414</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b3">OnHangup</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01415 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01416 <a name="l01421"></a><a class="code" href="classost_1_1_posix_thread.html#b4">01421</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b4">OnException</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01422 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01423 <a name="l01428"></a><a class="code" href="classost_1_1_posix_thread.html#b5">01428</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b5">OnDisconnect</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01429 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01430 <a name="l01435"></a><a class="code" href="classost_1_1_posix_thread.html#b6">01435</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b6">OnPolling</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01436 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01437 <a name="l01444"></a><a class="code" href="classost_1_1_posix_thread.html#b7">01444</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b7">OnSignal</a>(<font class="keywordtype">int</font> signo)<font class="keyword"></font> 01445 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01446 01456 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b8">setTimer</a>(timeout_t timer); 01457 01464 timeout_t <a class="code" href="classost_1_1_posix_thread.html#b9">getTimer</a>(<font class="keywordtype">void</font>); 01465 01471 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b10">endTimer</a>(<font class="keywordtype">void</font>); 01472 01479 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b11">WaitSignal</a>(signo_t signo); 01480 01487 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#b12">setSignal</a>(<font class="keywordtype">int</font> signo, <font class="keywordtype">bool</font> mode); 01488 <font class="keyword">public</font>: 01489 <a name="l01495"></a><a class="code" href="classost_1_1_posix_thread.html#a0">01495</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#a0">SignalThread</a>(<font class="keywordtype">int</font> signo)<font class="keyword"></font> 01496 <font class="keyword"> </font>{<a class="code" href="classost_1_1_posix_thread.html#a0">SignalThread</a>(<font class="keyword">this</font>, signo);}; 01497 01504 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="classost_1_1_posix_thread.html#l2">siginstall</a>(<font class="keywordtype">int</font> signo); 01505 }; 01506 <font class="preprocessor">#endif</font> 01507 <font class="preprocessor"></font> <a name="l01522"></a><a class="code" href="classost_1_1_thread_key.html">01522</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT ThreadKey 01523 { 01524 <font class="keyword">private</font>: 01525 <font class="preprocessor">#ifndef WIN32</font> 01526 <font class="preprocessor"></font> pthread_key_t key; 01527 <font class="preprocessor">#else</font> 01528 <font class="preprocessor"></font> DWORD key; 01529 <font class="preprocessor">#endif</font> 01530 <font class="preprocessor"></font> 01531 <font class="keyword">public</font>: 01535 <a class="code" href="classost_1_1_thread_key.html#a0">ThreadKey</a>(); 01539 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_thread_key.html#a1">~ThreadKey</a>(); 01547 <font class="keywordtype">void</font> *<a class="code" href="classost_1_1_thread_key.html#a2">getKey</a>(<font class="keywordtype">void</font>); 01555 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_thread_key.html#a3">setKey</a>(<font class="keywordtype">void</font> *); 01556 }; 01557 <a name="l01568"></a><a class="code" href="classost_1_1_timer_port.html">01568</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT TimerPort 01569 { 01570 <font class="preprocessor">#ifndef WIN32</font> 01571 <font class="preprocessor"></font> <font class="keyword">struct </font>timeval timer; 01572 <font class="preprocessor">#else</font> 01573 <font class="preprocessor"></font> DWORD timer; 01574 <font class="preprocessor">#endif</font> 01575 <font class="preprocessor"></font> <font class="keywordtype">bool</font> active; 01576 01577 <font class="keyword">public</font>: 01584 <a class="code" href="classost_1_1_timer_port.html#a0">TimerPort</a>(); 01585 01594 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_timer_port.html#a1">setTimer</a>(timeout_t timeout = 0); 01595 01605 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_timer_port.html#a2">incTimer</a>(timeout_t timeout); 01606 01612 <font class="keywordtype">void</font> <a class="code" href="classost_1_1_timer_port.html#a3">endTimer</a>(<font class="keywordtype">void</font>); 01613 01624 timeout_t <a class="code" href="classost_1_1_timer_port.html#a4">getTimer</a>(<font class="keywordtype">void</font>); 01625 01634 timeout_t <a class="code" href="classost_1_1_timer_port.html#a5">getElapsed</a>(<font class="keywordtype">void</font>); 01635 }; 01636 <a name="l01637"></a><a class="code" href="namespaceost.html#a225">01637</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="namespaceost.html#a225">get</a>(Buffer &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01638 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.Wait(o);}; 01639 <a name="l01640"></a><a class="code" href="namespaceost.html#a226">01640</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="namespaceost.html#a226">put</a>(Buffer &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01641 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.Post(o);}; 01642 <a name="l01643"></a><a class="code" href="namespaceost.html#a227">01643</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="namespaceost.html#a227">peek</a>(Buffer &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01644 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.Peek(o);}; 01645 01646 01647 <font class="comment">// FIXME: not in win32 implementation</font> 01648 <font class="preprocessor">#if !defined(WIN32)</font> 01649 <font class="preprocessor"></font> 01650 <font class="comment">// FIXME: private declaration ???</font> 01651 <font class="keyword">struct </font>timespec *gettimeout(struct timespec *spec, timeout_t timeout); 01652 01653 <font class="preprocessor">#if !defined(__CYGWIN32__) && !defined(__MINGW32__)</font> 01654 <font class="preprocessor"></font><font class="keywordtype">void</font> <a class="code" href="namespaceost.html#a229">wait</a>(signo_t signo); 01655 <font class="preprocessor">#endif</font> 01656 <font class="preprocessor"></font> 01665 <font class="keywordtype">void</font> <a class="code" href="namespaceost.html#a230">pdetach</a>(<font class="keywordtype">void</font>); 01666 <font class="preprocessor">#endif // !WIN32</font> 01667 <font class="preprocessor"></font> 01668 <font class="comment">// FIXME: no way to implement in win32</font> 01669 <font class="preprocessor">#ifndef WIN32</font> 01670 <font class="preprocessor"></font><font class="preprocessor">#if defined(HAVE_POLL_H) || defined(HAVE_SYS_POLL_H)</font> 01671 <font class="preprocessor"></font><font class="preprocessor">#if defined(HAVE_SYS_STREAM_H)</font> 01672 <font class="preprocessor"></font><font class="preprocessor">#if defined(__linux__)</font> 01673 <font class="preprocessor"></font><font class="preprocessor">#define CCXX_USE_POLL 1</font> 01674 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01675 <font class="preprocessor"></font><font class="preprocessor">#else</font> <a name="l01676"></a><a class="code" href="thread_8h.html#a9">01676</a> <font class="preprocessor"></font><font class="preprocessor">#define CCXX_USE_POLL 1</font> 01677 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01678 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01679 <font class="preprocessor"></font> 01680 <font class="preprocessor">#ifdef CCXX_USE_POLL</font> 01681 <font class="preprocessor"></font> <a name="l01689"></a><a class="code" href="classost_1_1_poller.html">01689</a> <font class="keyword">class </font>Poller 01690 { 01691 <font class="keyword">private</font>: 01692 <font class="keywordtype">int</font> nufds; 01693 pollfd *ufds; 01694 01695 <font class="keyword">public</font>: 01696 <a class="code" href="classost_1_1_poller.html#a0">Poller</a>(); 01697 01698 <font class="keyword">virtual</font> <a class="code" href="classost_1_1_poller.html#a1">~Poller</a>(); 01699 01707 pollfd *<a class="code" href="classost_1_1_poller.html#a3">getList</a>(<font class="keywordtype">int</font> cnt); 01708 <a name="l01714"></a><a class="code" href="classost_1_1_poller.html#a3">01714</a> <font class="keyword">inline</font> pollfd *<a class="code" href="classost_1_1_poller.html#a3">getList</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01715 <font class="keyword"> </font>{<font class="keywordflow">return</font> ufds;}; 01716 }; 01717 <font class="preprocessor">#endif</font> 01718 <font class="preprocessor"></font><font class="preprocessor">#endif // !WIN32</font> 01719 <font class="preprocessor"></font> 01720 <font class="preprocessor">#ifdef COMMON_STD_EXCEPTION</font> 01721 <font class="preprocessor"></font> 01727 <font class="keyword">class </font>ThrException : <font class="keyword">public</font> Exception 01728 { 01729 <font class="keyword">public</font>: 01730 ThrException(<font class="keyword">const</font> std::string &what_arg) : Exception(what_arg) {}; 01731 }; 01732 01739 <font class="keyword">class </font>SyncException : <font class="keyword">public</font> ThrException 01740 { 01741 <font class="keyword">public</font>: 01742 SyncException(<font class="keyword">const</font> std::string &what_arg) : ThrException(what_arg) {}; 01743 }; 01744 <font class="preprocessor">#endif</font> 01745 <font class="preprocessor"></font> 01746 <font class="preprocessor">#ifdef CCXX_NAMESPACES</font> 01747 <font class="preprocessor"></font>}; 01748 <font class="preprocessor">#endif</font> 01749 <font class="preprocessor"></font> 01750 <font class="preprocessor">#endif</font> 01751 <font class="preprocessor"></font> </pre></div><hr><address><small>Generated at Fri Jan 4 18:51:46 2002 for CommonC++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.gif" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.10 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, © 1997-2001</small></address> </body> </html>