<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <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.5 on Thu Oct 4 15:32:58 2001 --> <center> <a class="qindex" href="index.html">Main Page</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="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> </center> <hr><h1>thread.h</h1><a href="thread_h.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 <font class="comment">//</font> 00041 00042 <font class="preprocessor">#ifndef __CCXX_THREAD_H__</font> 00043 <font class="preprocessor"></font><font class="preprocessor">#define __CCXX_THREAD_H__</font> 00044 <font class="preprocessor"></font><font class="preprocessor">#define __CCXX_POSIX</font> 00045 <font class="preprocessor"></font> 00046 <font class="preprocessor">#ifndef _REENTRANT</font> 00047 <font class="preprocessor"></font><font class="preprocessor">#define _REENTRANT</font> 00048 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00049 <font class="preprocessor"></font> 00050 <font class="preprocessor">#ifndef _THREAD_SAFE</font> 00051 <font class="preprocessor"></font><font class="preprocessor">#define _THREAD_SAFE</font> 00052 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00053 <font class="preprocessor"></font> 00054 <font class="preprocessor">#ifndef __CCXX_CONFIG_H__</font> 00055 <font class="preprocessor"></font><font class="preprocessor">#ifdef PACKAGE</font> 00056 <font class="preprocessor"></font><font class="preprocessor">#undef PACKAGE</font> 00057 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00058 <font class="preprocessor"></font><font class="preprocessor">#ifdef VERSION</font> 00059 <font class="preprocessor"></font><font class="preprocessor">#undef VERSION</font> 00060 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00061 <font class="preprocessor"></font><font class="preprocessor">#include <cc++/<a class="code" href="config_h.html">config.h</a>></font> 00062 <font class="preprocessor">#endif</font> 00063 <font class="preprocessor"></font> 00064 <font class="preprocessor">#if defined(__FreeBSD__) && __FreeBSD__ <= 3</font> 00065 <font class="preprocessor"></font><font class="preprocessor">#define _SYSV_SEMAPHORES</font> 00066 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00067 <font class="preprocessor"></font> 00068 <font class="preprocessor">#ifndef HAVE_PTHREAD_H</font> 00069 <font class="preprocessor"></font><font class="preprocessor">#include <pthread.h></font> 00070 <font class="preprocessor">#ifndef _SYSV_SEMAPHORES</font> 00071 <font class="preprocessor"></font><font class="preprocessor">#include <semaphore.h></font> 00072 <font class="preprocessor">#endif</font> 00073 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00074 <font class="preprocessor"></font> 00075 <font class="preprocessor">#ifndef __CCXX_MACROS_H__</font> 00076 <font class="preprocessor"></font><font class="preprocessor">#include <cc++/<a class="code" href="macros_h.html">macros.h</a>></font> 00077 <font class="preprocessor">#else</font> 00078 <font class="preprocessor"></font><font class="preprocessor">#ifdef __CCXX_NAMESPACE_H__</font> 00079 <font class="preprocessor"></font><font class="preprocessor">#include <cc++/<a class="code" href="macros_h.html">macros.h</a>></font> 00080 <font class="preprocessor">#endif</font> 00081 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00082 <font class="preprocessor"></font> 00083 <font class="preprocessor">#include <time.h></font> 00084 <font class="preprocessor">#include <signal.h></font> 00085 <font class="preprocessor">#include <setjmp.h></font> 00086 <font class="preprocessor">#include <unistd.h></font> 00087 00088 <font class="preprocessor">#ifdef __linux__</font> 00089 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_STOPCONT</font> 00090 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_ALARM</font> 00091 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00092 <font class="preprocessor"></font> 00093 <font class="preprocessor">#ifdef _THR_UNIXWARE</font> 00094 <font class="preprocessor"></font><font class="preprocessor">#define _EFTSAFE</font> 00095 <font class="preprocessor"></font><font class="preprocessor">#undef PTHREAD_MUTEXTYPE_RECURSIVE</font> 00096 <font class="preprocessor"></font><font class="preprocessor">#undef _POSIX_THREAD_PRIORITY_SCHEDULING</font> 00097 <font class="preprocessor"></font><font class="preprocessor">#define sigwait(x, y) _thr_sigwait(x, y)</font> 00098 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00099 <font class="preprocessor"></font> <a name="l00100"></a><a class="code" href="thread_h.html#a0">00100</a> <font class="keyword">typedef</font> pthread_t cctid_t; <a name="l00101"></a><a class="code" href="thread_h.html#a1">00101</a> <font class="keyword">typedef</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> timeout_t; <a name="l00102"></a><a class="code" href="thread_h.html#a2">00102</a> <font class="keyword">typedef</font> <font class="keywordtype">int</font> signo_t; 00103 <a name="l00104"></a><a class="code" href="thread_h.html#a41">00104</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> { 00105 THROW_NOTHING, 00106 THROW_OBJECT, 00107 THROW_EXCEPTION 00108 } throw_t; 00109 00110 <font class="preprocessor">#define TIMEOUT_INF ~((timeout_t) 0)</font> 00111 <font class="preprocessor"></font> 00112 <font class="comment">// use a define so that if the sys/types.h header already defines caddr_t</font> 00113 <font class="comment">// as it may on BSD systems, we do not break it by redefining again.</font> 00114 00115 <font class="preprocessor">#undef caddr_t</font> 00116 <font class="preprocessor"></font><font class="preprocessor">#define caddr_t char *</font> 00117 <font class="preprocessor"></font> 00118 <font class="preprocessor">#define ENTER_CRITICAL EnterMutex();</font> 00119 <font class="preprocessor"></font><font class="preprocessor">#define LEAVE_CRITICAL LeaveMutex();</font> 00120 <font class="preprocessor"></font><font class="preprocessor">#define ENTER_DEFERRED setCancel(THREAD_CANCEL_DEFERRED);</font> 00121 <font class="preprocessor"></font><font class="preprocessor">#define LEAVE_DEFERRED setCancel(THREAD_CANCEL_IMMEDIATE);</font> 00122 <font class="preprocessor"></font> 00123 <font class="comment">// These macros override common functions with thread-safe versions. In</font> 00124 <font class="comment">// particular the common "libc" sleep() has problems since it normally</font> 00125 <font class="comment">// uses SIGARLM (as actually defined by "posix"). The pthread_delay and</font> 00126 <font class="comment">// usleep found in libpthread are gaurenteed not to use SIGALRM and offer</font> 00127 <font class="comment">// higher resolution. psleep() is defined to call the old process sleep.</font> 00128 00129 <font class="preprocessor">#undef sleep</font> 00130 <font class="preprocessor"></font><font class="preprocessor">#define sleep(x) ccxx_sleep((x) * 1000)</font> 00131 <font class="preprocessor"></font><font class="preprocessor">#define yield() ccxx_yield()</font> 00132 <font class="preprocessor"></font><font class="preprocessor">#define psleep(x) (sleep)(x)</font> 00133 <font class="preprocessor"></font> <a name="l00134"></a><a class="code" href="thread_h.html#a42">00134</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> 00135 { 00136 THREAD_CANCEL_INITIAL=0, 00137 THREAD_CANCEL_DEFERRED=1, 00138 THREAD_CANCEL_IMMEDIATE, 00139 THREAD_CANCEL_DISABLED, 00140 THREAD_CANCEL_DEFAULT=THREAD_CANCEL_DEFERRED, 00141 THREAD_CANCEL_INVALID 00142 } thread_cancel_t; 00143 <a name="l00144"></a><a class="code" href="thread_h.html#a43">00144</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> 00145 { 00146 THREAD_SUSPEND_ENABLE, 00147 THREAD_SUSPEND_DISABLE 00148 } thread_suspend_t; 00149 00150 <font class="preprocessor">#define THREAD_SIGNAL_BLOCKED false</font> 00151 <font class="preprocessor"></font><font class="preprocessor">#define THREAD_SIGNAL_UNBLOCK true</font> 00152 <font class="preprocessor"></font> 00153 <font class="preprocessor">#ifdef _SIG_THREAD_STOPCONT</font> 00154 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_SUSPEND SIGSTOP</font> 00155 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_RESUME SIGCONT</font> 00156 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00157 <font class="preprocessor"></font><font class="preprocessor">#ifndef SIGUSR3</font> 00158 <font class="preprocessor"></font><font class="preprocessor">#ifdef SIGWINCH</font> 00159 <font class="preprocessor"></font><font class="preprocessor">#define SIGUSR3 SIGWINCH</font> 00160 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00161 <font class="preprocessor"></font><font class="preprocessor">#define SIGUSR3 SIGINT</font> 00162 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00163 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00164 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_SUSPEND SIGUSR3</font> 00165 <font class="preprocessor"></font><font class="preprocessor">#define _SIG_THREAD_RESUME SIGUSR3</font> 00166 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00167 <font class="preprocessor"></font> 00168 <font class="keyword">class </font><a class="code" href="class_thread.html">Thread</a>; 00169 00170 <a class="code" href="class_thread.html">Thread</a> *<a class="code" href="thread_h.html#a14">getThread</a>(<font class="keywordtype">void</font>); 00171 00172 <font class="keyword">extern</font> <font class="stringliteral">"C"</font> { 00173 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a15">execHandler</a>(<a class="code" href="class_thread.html">Thread</a> *th); 00174 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a16">sigHandler</a>(<font class="keywordtype">int</font> signo); 00175 }; 00176 <a name="l00185"></a><a class="code" href="class_threadlock.html">00185</a> <font class="keyword">class </font><a class="code" href="class_threadlock.html">ThreadLock</a> 00186 { 00187 <font class="keyword">private</font>: 00188 <font class="preprocessor">#ifdef HAVE_PTHREAD_RWLOCK</font> 00189 <font class="preprocessor"></font> pthread_rwlock_t _lock; 00190 <font class="preprocessor">#else</font> 00191 <font class="preprocessor"></font> pthread_mutex_t _lock; 00192 <font class="preprocessor">#endif</font> 00193 <font class="preprocessor"></font> 00194 <font class="keyword">public</font>: 00198 <a class="code" href="class_threadlock.html#a0">ThreadLock</a>(); 00199 00203 <a class="code" href="class_threadlock.html#a1">~ThreadLock</a>(); 00204 00208 <font class="keywordtype">void</font> <a class="code" href="class_threadlock.html#a2">ReadLock</a>(<font class="keywordtype">void</font>); 00209 00213 <font class="keywordtype">void</font> <a class="code" href="class_threadlock.html#a3">WriteLock</a>(<font class="keywordtype">void</font>); 00214 00220 <font class="keywordtype">bool</font> <a class="code" href="class_threadlock.html#a4">TryReadLock</a>(<font class="keywordtype">void</font>); 00221 00227 <font class="keywordtype">bool</font> <a class="code" href="class_threadlock.html#a5">TryWriteLock</a>(<font class="keywordtype">void</font>); 00228 00232 <font class="keywordtype">void</font> <a class="code" href="class_threadlock.html#a6">Unlock</a>(<font class="keywordtype">void</font>); 00233 }; 00234 <a name="l00278"></a><a class="code" href="class_mutex.html">00278</a> <font class="keyword">class </font><a class="code" href="class_mutex.html">Mutex</a> 00279 { 00280 <font class="keyword">private</font>: 00281 <font class="preprocessor">#ifndef PTHREAD_MUTEXTYPE_RECURSIVE</font> 00282 <font class="preprocessor"></font> <font class="keyword">volatile</font> <font class="keywordtype">int</font> _level; 00283 <font class="keyword">volatile</font> <a class="code" href="class_thread.html">Thread</a> *_tid; 00284 <font class="preprocessor">#endif</font> 00285 <font class="preprocessor"></font> 00286 <font class="keyword">protected</font>: <a name="l00295"></a><a class="code" href="class_mutex.html#n0">00295</a> pthread_mutex_t _mutex; 00296 00297 <font class="keyword">public</font>: 00301 <a class="code" href="class_mutex.html#a0">Mutex</a>(); 00302 <a name="l00308"></a><a class="code" href="class_mutex.html#a1">00308</a> <a class="code" href="class_mutex.html#a1">~Mutex</a>()<font class="keyword"></font> 00309 <font class="keyword"> </font>{pthread_mutex_destroy(&_mutex);}; 00310 00318 <font class="preprocessor">#ifdef PTHREAD_MUTEXTYPE_RECURSIVE</font> <a name="l00319"></a><a class="code" href="class_mutex.html#a3">00319</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_mutex.html#a2">EnterMutex</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00320 <font class="keyword"> </font>{pthread_mutex_lock(&_mutex);}; 00321 <font class="preprocessor">#else</font> 00322 <font class="preprocessor"></font> <font class="keywordtype">void</font> <a class="code" href="class_mutex.html#a2">EnterMutex</a>(<font class="keywordtype">void</font>); 00323 <font class="preprocessor">#endif</font> 00324 <font class="preprocessor"></font> 00335 <font class="keywordtype">bool</font> <a class="code" href="class_mutex.html#a4">TryEnterMutex</a>(<font class="keywordtype">void</font>); 00336 00347 <font class="preprocessor">#ifdef PTHREAD_MUTEXTYPE_RECURSIVE</font> <a name="l00348"></a><a class="code" href="class_mutex.html#a6">00348</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_mutex.html#a5">LeaveMutex</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00349 <font class="keyword"> </font>{pthread_mutex_unlock(&_mutex);}; 00350 <font class="preprocessor">#else</font> 00351 <font class="preprocessor"></font> <font class="keywordtype">void</font> <a class="code" href="class_mutex.html#a5">LeaveMutex</a>(<font class="keywordtype">void</font>); 00352 <font class="preprocessor">#endif</font> 00353 <font class="preprocessor"></font>}; 00354 <a name="l00364"></a><a class="code" href="class_mutexcounter.html">00364</a> <font class="keyword">class </font><a class="code" href="class_mutexcounter.html">MutexCounter</a> : <font class="keyword">public</font> <a class="code" href="class_mutex.html">Mutex</a> 00365 { 00366 <font class="keyword">private</font>: 00367 <font class="keywordtype">int</font> counter; 00368 00369 <font class="keyword">public</font>: 00370 <a class="code" href="class_mutexcounter.html#a0">MutexCounter</a>(<font class="keywordtype">int</font> initial = 0); 00371 00372 <font class="keyword">friend</font> <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a34">operator ++</a>(<a class="code" href="class_mutexcounter.html">MutexCounter</a> &mc); 00373 <font class="keyword">friend</font> <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a35">operator --</a>(<a class="code" href="class_mutexcounter.html">MutexCounter</a> &mc); 00374 }; 00375 <a name="l00386"></a><a class="code" href="class_atomiccounter.html">00386</a> <font class="keyword">class </font><a class="code" href="class_atomiccounter.html">AtomicCounter</a> 00387 { 00388 <font class="keyword">private</font>: 00389 <font class="preprocessor">#ifdef HAVE_ATOMIC</font> 00390 <font class="preprocessor"></font> atomic_t atomic; 00391 <font class="preprocessor">#else</font> 00392 <font class="preprocessor"></font> <font class="keywordtype">int</font> counter; 00393 <a class="code" href="class_mutex.html">Mutex</a> lock; 00394 <font class="preprocessor">#endif</font> 00395 <font class="preprocessor"></font> 00396 <font class="keyword">public</font>: 00400 <a class="code" href="class_atomiccounter.html#a0">AtomicCounter</a>(); 00401 00407 <a class="code" href="class_atomiccounter.html#a0">AtomicCounter</a>(<font class="keywordtype">int</font> value); 00408 00409 <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a34">operator++</a>(<font class="keywordtype">void</font>); 00410 <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a35">operator--</a>(<font class="keywordtype">void</font>); 00411 <font class="keywordtype">int</font> <a class="code" href="class_atomiccounter.html#a4">operator+=</a>(<font class="keywordtype">int</font> change); 00412 <font class="keywordtype">int</font> <a class="code" href="class_atomiccounter.html#a5">operator-=</a>(<font class="keywordtype">int</font> change); 00413 <font class="keywordtype">int</font> <a class="code" href="class_atomiccounter.html#a6">operator+</a>(<font class="keywordtype">int</font> change); 00414 <font class="keywordtype">int</font> <a class="code" href="class_atomiccounter.html#a7">operator-</a>(<font class="keywordtype">int</font> change); 00415 <font class="keywordtype">int</font> <a class="code" href="class_atomiccounter.html#a8">operator=</a>(<font class="keywordtype">int</font> value); 00416 <font class="keywordtype">bool</font> <a class="code" href="class_atomiccounter.html#a9">operator!</a>(<font class="keywordtype">void</font>); 00417 <a class="code" href="class_atomiccounter.html#a10">operator int</a>(); 00418 }; 00419 <a name="l00430"></a><a class="code" href="class_conditional.html">00430</a> <font class="keyword">class </font><a class="code" href="class_conditional.html">Conditional</a> : <font class="keyword">public</font> <a class="code" href="class_mutex.html">Mutex</a> 00431 { 00432 <font class="keyword">protected</font>: <a name="l00433"></a><a class="code" href="class_conditional.html#n0">00433</a> pthread_cond_t _cond; 00434 00435 <font class="keyword">public</font>: 00439 <a class="code" href="class_conditional.html#a0">Conditional</a>(); 00440 <a name="l00444"></a><a class="code" href="class_conditional.html#a1">00444</a> <a class="code" href="class_conditional.html#a1">~Conditional</a>()<font class="keyword"></font> 00445 <font class="keyword"> </font>{pthread_cond_destroy(&_cond);}; 00446 00452 <font class="keywordtype">void</font> <a class="code" href="class_conditional.html#a2">Signal</a>(<font class="keywordtype">bool</font> broadcast); 00453 00457 <font class="keywordtype">void</font> <a class="code" href="class_conditional.html#a3">Wait</a>(timeout_t timer = 0); 00458 }; 00459 <a name="l00477"></a><a class="code" href="class_semaphore.html">00477</a> <font class="keyword">class </font><a class="code" href="class_semaphore.html">Semaphore</a> 00478 { 00479 <font class="keyword">protected</font>: 00480 <font class="preprocessor">#ifdef _SYSV_SEMAPHORES</font> 00481 <font class="preprocessor"></font> <font class="keywordtype">int</font> _semaphore; 00482 <font class="preprocessor">#else</font> <a name="l00483"></a><a class="code" href="class_semaphore.html#n1">00483</a> <font class="preprocessor"></font> sem_t _semaphore; 00484 <font class="preprocessor">#endif</font> 00485 <font class="preprocessor"></font> 00486 <font class="keyword">public</font>: 00495 <a class="code" href="class_semaphore.html#a0">Semaphore</a>(size_t resource = 0); 00496 <a name="l00503"></a><a class="code" href="class_semaphore.html#a1">00503</a> <a class="code" href="class_semaphore.html#a1">~Semaphore</a>() 00504 <font class="preprocessor">#if !defined(__linux__) && !defined(_SYSV_SEMAPHORES)</font> 00505 <font class="preprocessor"></font> {sem_destroy(&_semaphore);} 00506 <font class="preprocessor">#endif</font> 00507 <font class="preprocessor"></font> ; 00508 <a name="l00522"></a><a class="code" href="class_semaphore.html#a2">00522</a> <font class="keywordtype">void</font> <a class="code" href="class_semaphore.html#a2">Wait</a>(<font class="keywordtype">void</font>) 00523 <font class="preprocessor">#if !defined(__linux__) && !defined(_SYSV_SEMAPHORES)</font> 00524 <font class="preprocessor"></font> {sem_wait(&_semaphore);} 00525 <font class="preprocessor">#endif</font> 00526 <font class="preprocessor"></font> ; 00527 <a name="l00539"></a><a class="code" href="class_semaphore.html#a3">00539</a> <font class="keywordtype">bool</font> <a class="code" href="class_semaphore.html#a3">TryWait</a>(<font class="keywordtype">void</font>) 00540 <font class="preprocessor">#if !defined(__linux__) && !defined(_SYSV_SEMAPHORES)</font> 00541 <font class="preprocessor"></font> { <font class="keywordflow">return</font> ( sem_trywait(&_semaphore) == 0 ) ? <font class="keyword">true</font> : <font class="keyword">false</font>; } 00542 <font class="preprocessor">#endif</font> 00543 <font class="preprocessor"></font> ; 00544 <a name="l00556"></a><a class="code" href="class_semaphore.html#a4">00556</a> <font class="keywordtype">void</font> <a class="code" href="class_semaphore.html#a4">Post</a>(<font class="keywordtype">void</font>) 00557 <font class="preprocessor">#if !defined(__linux__) && !defined(_SYSV_SEMAPHORES)</font> 00558 <font class="preprocessor"></font> {sem_post(&_semaphore);} 00559 <font class="preprocessor">#endif</font> 00560 <font class="preprocessor"></font> ; 00561 00567 <font class="keywordtype">int</font> <a class="code" href="class_semaphore.html#a5">getValue</a>(<font class="keywordtype">void</font>); 00568 }; 00569 <a name="l00583"></a><a class="code" href="class_event.html">00583</a> <font class="keyword">class </font><a class="code" href="class_event.html">Event</a> : <font class="keyword">public</font> <a class="code" href="class_mutex.html">Mutex</a> 00584 { 00585 <font class="keyword">protected</font>: <a name="l00586"></a><a class="code" href="class_event.html#n0">00586</a> pthread_cond_t _cond; <a name="l00587"></a><a class="code" href="class_event.html#n1">00587</a> <font class="keywordtype">bool</font> _signaled; <a name="l00588"></a><a class="code" href="class_event.html#n2">00588</a> <font class="keywordtype">int</font> _count; 00589 00590 <font class="keyword">public</font>: 00591 <a class="code" href="class_event.html#a0">Event</a>(); 00592 <a name="l00593"></a><a class="code" href="class_event.html#a1">00593</a> <a class="code" href="class_event.html#a1">~Event</a>()<font class="keyword"></font> 00594 <font class="keyword"> </font>{pthread_cond_destroy(&_cond);}; 00595 <a name="l00602"></a><a class="code" href="class_event.html#a2">00602</a> <font class="keywordtype">void</font> <a class="code" href="class_event.html#a2">Reset</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00603 <font class="keyword"> </font>{_signaled = <font class="keyword">false</font>;}; 00604 00608 <font class="keywordtype">void</font> <a class="code" href="class_event.html#a3">Signal</a>(<font class="keywordtype">void</font>); 00617 <font class="keywordtype">bool</font> <a class="code" href="class_event.html#a4">Wait</a>(timeout_t timer = 0); 00618 }; 00619 <a name="l00641"></a><a class="code" href="class_buffer.html">00641</a> <font class="keyword">class </font><a class="code" href="class_buffer.html">Buffer</a> 00642 { 00643 <font class="keyword">private</font>: 00644 <a class="code" href="class_mutex.html">Mutex</a> lock_head, lock_tail; 00645 <a class="code" href="class_semaphore.html">Semaphore</a> size_head, size_tail; 00646 size_t _size; 00647 size_t _used; 00648 00649 <font class="keyword">protected</font>: 00655 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b0">OnPeek</a>(<font class="keywordtype">void</font> *buf) = 0; 00661 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b1">OnWait</a>(<font class="keywordtype">void</font> *buf) = 0; 00667 <font class="keyword">virtual</font> <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b2">OnPost</a>(<font class="keywordtype">void</font> *buf) = 0; 00668 00669 <font class="keyword">public</font>: 00674 <a class="code" href="class_buffer.html#a0">Buffer</a>(size_t capacity); <a name="l00679"></a><a class="code" href="class_buffer.html#a1">00679</a> <font class="keyword">virtual</font> <a class="code" href="class_buffer.html#a1">~Buffer</a>()<font class="keyword"></font> 00680 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 00681 <a name="l00686"></a><a class="code" href="class_buffer.html#a2">00686</a> <font class="keyword">inline</font> size_t <a class="code" href="class_buffer.html#a2">getSize</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00687 <font class="keyword"> </font>{<font class="keywordflow">return</font> _size;}; 00688 <a name="l00695"></a><a class="code" href="class_buffer.html#a3">00695</a> <font class="keyword">inline</font> size_t <a class="code" href="class_buffer.html#a3">getUsed</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00696 <font class="keyword"> </font>{<font class="keywordflow">return</font> _used;}; 00697 00706 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#a4">Wait</a>(<font class="keywordtype">void</font> *buf); 00707 00715 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#a5">Post</a>(<font class="keywordtype">void</font> *buf); 00716 00723 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#a6">Peek</a>(<font class="keywordtype">void</font> *buf); 00724 <a name="l00729"></a><a class="code" href="class_buffer.html#a7">00729</a> <font class="keyword">virtual</font> <font class="keywordtype">bool</font> <a class="code" href="class_buffer.html#a7">isValid</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00730 <font class="keyword"> </font>{<font class="keywordflow">return</font> <font class="keyword">true</font>;}; 00731 }; 00732 <a name="l00740"></a><a class="code" href="class_fixedbuffer.html">00740</a> <font class="keyword">class </font><a class="code" href="class_fixedbuffer.html">FixedBuffer</a> : <font class="keyword">public</font> <a class="code" href="class_buffer.html">Buffer</a> 00741 { 00742 <font class="keyword">private</font>: 00743 <font class="keywordtype">char</font> *buf, *head, *tail; 00744 size_t objsize; 00745 00746 <font class="keyword">protected</font>: 00752 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b0">OnPeek</a>(<font class="keywordtype">void</font> *buf); 00753 00759 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b1">OnWait</a>(<font class="keywordtype">void</font> *buf); 00760 00766 <font class="keywordtype">int</font> <a class="code" href="class_buffer.html#b2">OnPost</a>(<font class="keywordtype">void</font> *buf); 00767 00768 <font class="keyword">public</font>: 00776 <a class="code" href="class_fixedbuffer.html#a0">FixedBuffer</a>(size_t capacity, size_t objsize); 00777 00784 <a class="code" href="class_fixedbuffer.html#a0">FixedBuffer</a>(<font class="keyword">const</font> <a class="code" href="class_fixedbuffer.html">FixedBuffer</a> &fb); 00785 00789 <a class="code" href="class_fixedbuffer.html#a2">~FixedBuffer</a>(); 00790 00791 <a class="code" href="class_fixedbuffer.html">FixedBuffer</a> &<a class="code" href="class_fixedbuffer.html#a3">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_fixedbuffer.html">FixedBuffer</a> &fb); 00792 00793 <font class="keywordtype">bool</font> <a class="code" href="class_buffer.html#a7">isValid</a>(<font class="keywordtype">void</font>); 00794 }; 00795 <a name="l00943"></a><a class="code" href="class_thread.html">00943</a> <font class="keyword">class </font><a class="code" href="class_thread.html">Thread</a> 00944 { 00945 <font class="keyword">private</font>: <a name="l00946"></a><a class="code" href="class_thread.html#l0">00946</a> <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_slog.html">Slog</a>; 00947 00948 <font class="keyword">static</font> <a class="code" href="class_thread.html">Thread</a> *_main; 00949 00950 <font class="preprocessor">#ifndef _SIG_THREAD_ALARM</font> 00951 <font class="preprocessor"></font> <font class="keyword">static</font> <a class="code" href="class_thread.html">Thread</a> *_timer; 00952 <font class="keyword">static</font> <a class="code" href="class_mutex.html">Mutex</a> _arm; 00953 <font class="preprocessor">#endif</font> 00954 <font class="preprocessor"></font> 00955 <a class="code" href="class_thread.html">Thread</a> *_parent; 00956 pthread_t _tid; 00957 pthread_attr_t _attr; 00958 thread_cancel_t _cancel; 00959 jmp_buf _env; 00960 time_t _alarm; 00961 <a class="code" href="class_semaphore.html">Semaphore</a> *_start; 00962 <font class="keywordtype">int</font> _msgpos; 00963 <font class="keywordtype">char</font> _msgbuf[128]; 00964 throw_t _throw; 00965 00966 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a15">execHandler</a>(<a class="code" href="class_thread.html">Thread</a> *th); 00967 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a16">sigHandler</a>(<font class="keywordtype">int</font> signo); 00968 <font class="keyword">friend</font> <a class="code" href="class_thread.html">Thread</a> *<a class="code" href="thread_h.html#a14">getThread</a>(<font class="keywordtype">void</font>); 00969 00970 <font class="keyword">protected</font>: 00980 <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b0">Run</a>(<font class="keywordtype">void</font>) = 0; 00981 <a name="l00988"></a><a class="code" href="class_thread.html#b1">00988</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b1">First</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 00989 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 00990 <a name="l01003"></a><a class="code" href="class_thread.html#b2">01003</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b2">Final</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01004 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01005 <a name="l01016"></a><a class="code" href="class_thread.html#b3">01016</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b3">Initial</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01017 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01018 <a name="l01028"></a><a class="code" href="class_thread.html#b4">01028</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> *<a class="code" href="class_thread.html#b4">getExtended</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01029 <font class="keyword"> </font>{<font class="keywordflow">return</font> NULL;}; 01030 <a name="l01038"></a><a class="code" href="class_thread.html#b5">01038</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b5">Notify</a>(<a class="code" href="class_thread.html">Thread</a> *th)<font class="keyword"></font> 01039 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01040 <a name="l01047"></a><a class="code" href="class_thread.html#b6">01047</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b6">SignalParent</a>(signo_t signo)<font class="keyword"></font> 01048 <font class="keyword"> </font>{_parent-><a class="code" href="class_thread.html#a7">SignalThread</a>(signo);}; 01049 <a name="l01056"></a><a class="code" href="class_thread.html#b7">01056</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b7">SignalMain</a>(signo_t signo)<font class="keyword"></font> 01057 <font class="keyword"> </font>{_main-><a class="code" href="class_thread.html#a7">SignalThread</a>(signo);}; 01058 <a name="l01063"></a><a class="code" href="class_thread.html#b8">01063</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b8">OnTimer</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01064 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01065 <a name="l01070"></a><a class="code" href="class_thread.html#b9">01070</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b9">OnHangup</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01071 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01072 <a name="l01077"></a><a class="code" href="class_thread.html#b10">01077</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b10">OnException</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01078 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01079 <a name="l01084"></a><a class="code" href="class_thread.html#b11">01084</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b11">OnDisconnect</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01085 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01086 <a name="l01091"></a><a class="code" href="class_thread.html#b12">01091</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b12">OnPolling</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01092 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01093 <a name="l01100"></a><a class="code" href="class_thread.html#b13">01100</a> <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b13">OnSignal</a>(<font class="keywordtype">int</font> signo)<font class="keyword"></font> 01101 <font class="keyword"> </font>{<font class="keywordflow">return</font>;}; 01102 <a name="l01112"></a><a class="code" href="class_thread.html#b14">01112</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b14">Sleep</a>(timeout_t msec)<font class="keyword"></font> 01113 <font class="keyword"> </font>{<a class="code" href="thread_h.html#a37">ccxx_sleep</a>(msec);}; 01114 <a name="l01120"></a><a class="code" href="class_thread.html#b15">01120</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b15">Exit</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01121 <font class="keyword"> </font>{longjmp(_env, 1);}; 01122 01132 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b16">setTimer</a>(timeout_t timer); 01139 timeout_t <a class="code" href="class_thread.html#b17">getTimer</a>(<font class="keywordtype">void</font>); 01145 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b18">endTimer</a>(<font class="keywordtype">void</font>); 01152 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b19">WaitSignal</a>(signo_t signo); 01157 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b20">Yield</a>(<font class="keywordtype">void</font>); 01161 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b21">testCancel</a>(<font class="keywordtype">void</font>); 01170 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b22">setCancel</a>(thread_cancel_t mode); 01178 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b23">setSuspend</a>(thread_suspend_t mode); 01185 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b24">setSignal</a>(<font class="keywordtype">int</font> signo, <font class="keywordtype">bool</font> mode); 01194 <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b25">Terminate</a>(<font class="keywordtype">void</font>); 01195 <a name="l01199"></a><a class="code" href="class_thread.html#b26">01199</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#b26">clrParent</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01200 <font class="keyword"> </font>{_parent = NULL;}; 01201 <font class="keyword">public</font>: 01210 <a class="code" href="class_thread.html#a0">Thread</a>(<font class="keywordtype">bool</font> flag); 01223 <a class="code" href="class_thread.html#a0">Thread</a>(<a class="code" href="class_semaphore.html">Semaphore</a> *start = NULL, <font class="keywordtype">int</font> pri = 0, size_t stack = 0); 01231 <a class="code" href="class_thread.html#a0">Thread</a>(<font class="keyword">const</font> <a class="code" href="class_thread.html">Thread</a> &th); <a name="l01238"></a><a class="code" href="class_thread.html#a3">01238</a> <font class="keyword">virtual</font> <a class="code" href="class_thread.html#a3">~Thread</a>()<font class="keyword"></font> 01239 <font class="keyword"> </font>{<a class="code" href="class_thread.html#b25">Terminate</a>();}; 01240 01253 <font class="keywordtype">int</font> <a class="code" href="class_thread.html#a4">Start</a>(<a class="code" href="class_semaphore.html">Semaphore</a> *start = NULL); 01254 01263 <font class="keywordtype">int</font> <a class="code" href="class_thread.html#a5">Detach</a>(<a class="code" href="class_semaphore.html">Semaphore</a> *start = NULL); 01264 <a name="l01271"></a><a class="code" href="class_thread.html#a6">01271</a> <font class="keyword">inline</font> <a class="code" href="class_thread.html">Thread</a> *<a class="code" href="class_thread.html#a6">getParent</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01272 <font class="keyword"> </font>{<font class="keywordflow">return</font> _parent;}; 01273 <a name="l01279"></a><a class="code" href="class_thread.html#a7">01279</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#a7">SignalThread</a>(<font class="keywordtype">int</font> signo)<font class="keyword"></font> 01280 <font class="keyword"> </font>{pthread_kill(_tid, signo);}; 01281 01288 <font class="preprocessor">#ifdef _THR_SUNOS5</font> <a name="l01289"></a><a class="code" href="class_thread.html#a8">01289</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#a8">Suspend</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01290 <font class="keyword"> </font>{thr_suspend((thread_t)_tid);}; 01291 <font class="preprocessor">#else</font> <a name="l01292"></a><a class="code" href="class_thread.html#a9">01292</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#a8">Suspend</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01293 <font class="keyword"> </font>{pthread_kill(_tid, _SIG_THREAD_SUSPEND);}; 01294 <font class="preprocessor">#endif</font> 01295 <font class="preprocessor"></font> 01299 <font class="preprocessor">#ifdef _THR_SUNOS5</font> <a name="l01300"></a><a class="code" href="class_thread.html#a10">01300</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#a10">Resume</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01301 <font class="keyword"> </font>{thr_continue((thread_t)_tid);}; 01302 <font class="preprocessor">#else</font> <a name="l01303"></a><a class="code" href="class_thread.html#a11">01303</a> <font class="preprocessor"></font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#a10">Resume</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01304 <font class="keyword"> </font>{pthread_kill(_tid, _SIG_THREAD_RESUME);}; 01305 <font class="preprocessor">#endif</font> 01306 <font class="preprocessor"></font> <a name="l01313"></a><a class="code" href="class_thread.html#a12">01313</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="class_thread.html#a12">getCancel</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01314 <font class="keyword"> </font>{<font class="keywordflow">return</font> _cancel;}; 01315 01322 <font class="keywordtype">bool</font> <a class="code" href="class_thread.html#a13">isRunning</a>(<font class="keywordtype">void</font>); 01323 01330 <font class="keywordtype">bool</font> <a class="code" href="class_thread.html#a14">isThread</a>(<font class="keywordtype">void</font>); 01331 01337 <font class="keyword">friend</font> throw_t <a class="code" href="class_thread.html#l4">getException</a>(<font class="keywordtype">void</font>); 01338 01344 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#l5">setException</a>(throw_t mode); 01345 01351 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a37">ccxx_sleep</a>(timeout_t msec); 01352 <a name="l01358"></a><a class="code" href="class_thread.html#l7">01358</a> <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#l7">suspend</a>(<a class="code" href="class_thread.html">Thread</a> &th)<font class="keyword"></font> 01359 <font class="keyword"> </font>{pthread_kill(th._tid, _SIG_THREAD_SUSPEND);}; 01360 <a name="l01366"></a><a class="code" href="class_thread.html#l8">01366</a> <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#l8">resume</a>(<a class="code" href="class_thread.html">Thread</a> &th)<font class="keyword"></font> 01367 <font class="keyword"> </font>{pthread_kill(th._tid, _SIG_THREAD_RESUME);}; 01368 <a name="l01375"></a><a class="code" href="class_thread.html#l9">01375</a> <font class="keyword">friend</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a34">operator++</a>(<a class="code" href="class_thread.html">Thread</a> &th)<font class="keyword"></font> 01376 <font class="keyword"> </font>{th._start-><a class="code" href="class_buffer.html#a5">Post</a>();}; 01377 <a name="l01378"></a><a class="code" href="class_thread.html#l10">01378</a> <font class="keyword">friend</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a35">operator--</a>(<a class="code" href="class_thread.html">Thread</a> &th)<font class="keyword"></font> 01379 <font class="keyword"> </font>{th._start-><a class="code" href="class_buffer.html#a4">Wait</a>();}; 01380 <a name="l01384"></a><a class="code" href="class_thread.html#l11">01384</a> <font class="keyword">friend</font> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="class_thread.html#l11">start</a>(<a class="code" href="class_thread.html">Thread</a> &th, <a class="code" href="class_semaphore.html">Semaphore</a> *start)<font class="keyword"></font> 01385 <font class="keyword"> </font>{<font class="keywordflow">return</font> th.<a class="code" href="class_thread.html#a4">Start</a>(start);}; 01386 01394 <font class="keyword">friend</font> <font class="keywordtype">void</font> <a class="code" href="class_thread.html#l12">siginstall</a>(<font class="keywordtype">int</font> signo); 01395 }; 01396 <a name="l01411"></a><a class="code" href="class_threadkey.html">01411</a> <font class="keyword">class </font><a class="code" href="class_threadkey.html">ThreadKey</a> 01412 { 01413 <font class="keyword">private</font>: 01414 pthread_key_t key; 01415 01416 <font class="keyword">public</font>: 01420 <a class="code" href="class_threadkey.html#a0">ThreadKey</a>(); 01424 <a class="code" href="class_threadkey.html#a1">~ThreadKey</a>(); 01432 <font class="keywordtype">void</font> *<a class="code" href="thread_h.html#a17">getKey</a>(<font class="keywordtype">void</font>); 01440 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a18">setKey</a>(<font class="keywordtype">void</font> *); 01441 }; 01442 <a name="l01453"></a><a class="code" href="class_timerport.html">01453</a> <font class="keyword">class </font><a class="code" href="class_timerport.html">TimerPort</a> 01454 { 01455 <font class="keyword">struct </font>timeval timer; 01456 <font class="keywordtype">bool</font> active; 01457 01458 <font class="keyword">public</font>: 01465 <a class="code" href="class_timerport.html#a0">TimerPort</a>(); 01466 01475 <font class="keywordtype">void</font> <a class="code" href="class_timerport.html#a1">setTimer</a>(timeout_t timeout = 0); 01476 01486 <font class="keywordtype">void</font> <a class="code" href="class_timerport.html#a2">incTimer</a>(timeout_t timeout); 01487 01493 <font class="keywordtype">void</font> <a class="code" href="class_timerport.html#a3">endTimer</a>(<font class="keywordtype">void</font>); 01494 01505 timeout_t <a class="code" href="class_timerport.html#a4">getTimer</a>(<font class="keywordtype">void</font>); 01506 01515 timeout_t <a class="code" href="class_timerport.html#a5">getElapsed</a>(<font class="keywordtype">void</font>); 01516 }; 01517 <a name="l01518"></a><a class="code" href="thread_h.html#a17">01518</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> *<a class="code" href="thread_h.html#a17">getKey</a>(<a class="code" href="class_threadkey.html">ThreadKey</a> &tk)<font class="keyword"></font> 01519 <font class="keyword"> </font>{<font class="keywordflow">return</font> tk.<a class="code" href="class_threadkey.html#a2">getKey</a>();}; 01520 <a name="l01521"></a><a class="code" href="thread_h.html#a18">01521</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a18">setKey</a>(<a class="code" href="class_threadkey.html">ThreadKey</a> &tk, <font class="keywordtype">void</font> *ptr)<font class="keyword"></font> 01522 <font class="keyword"> </font>{tk.<a class="code" href="class_threadkey.html#a3">setKey</a>(ptr);}; 01523 <a name="l01524"></a><a class="code" href="thread_h.html#a19">01524</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a34">operator ++</a>(<a class="code" href="class_mutex.html">Mutex</a> &m)<font class="keyword"></font> 01525 <font class="keyword"> </font>{m.<a class="code" href="class_mutex.html#a2">EnterMutex</a>();}; 01526 <a name="l01527"></a><a class="code" href="thread_h.html#a20">01527</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a35">operator --</a>(<a class="code" href="class_mutex.html">Mutex</a> &m)<font class="keyword"></font> 01528 <font class="keyword"> </font>{m.<a class="code" href="class_mutex.html#a5">LeaveMutex</a>();}; 01529 <a name="l01530"></a><a class="code" href="thread_h.html#a21">01530</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a34">operator ++</a>(<a class="code" href="class_semaphore.html">Semaphore</a> &s)<font class="keyword"></font> 01531 <font class="keyword"> </font>{s.<a class="code" href="class_semaphore.html#a4">Post</a>();}; 01532 <a name="l01533"></a><a class="code" href="thread_h.html#a22">01533</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a35">operator --</a>(<a class="code" href="class_semaphore.html">Semaphore</a> &s)<font class="keyword"></font> 01534 <font class="keyword"> </font>{s.<a class="code" href="class_semaphore.html#a2">Wait</a>();}; 01535 <a name="l01536"></a><a class="code" href="thread_h.html#a23">01536</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a34">operator ++</a>(<a class="code" href="class_event.html">Event</a> &s)<font class="keyword"></font> 01537 <font class="keyword"> </font>{s.<a class="code" href="class_event.html#a3">Signal</a>();}; 01538 <a name="l01539"></a><a class="code" href="thread_h.html#a24">01539</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a35">operator --</a>(<a class="code" href="class_event.html">Event</a> &s)<font class="keyword"></font> 01540 <font class="keyword"> </font>{s.<a class="code" href="class_event.html#a4">Wait</a>();}; 01541 01542 <font class="comment">/*</font> 01543 <font class="comment"> * on some systems, signal(signum, handler) is a macro</font> 01544 <font class="comment"> */</font> 01545 <font class="preprocessor">#undef signal</font> <a name="l01546"></a><a class="code" href="thread_h.html#a25">01546</a> <font class="preprocessor"></font><font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a27">signal</a>(<a class="code" href="class_thread.html">Thread</a> &th, <font class="keywordtype">int</font> signo)<font class="keyword"></font> 01547 <font class="keyword"> </font>{th.<a class="code" href="class_thread.html#a7">SignalThread</a>(signo);}; 01548 <a name="l01549"></a><a class="code" href="thread_h.html#a26">01549</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a27">signal</a>(<a class="code" href="class_event.html">Event</a> &ev)<font class="keyword"></font> 01550 <font class="keyword"> </font>{ev.<a class="code" href="class_event.html#a3">Signal</a>();}; 01551 <a name="l01552"></a><a class="code" href="thread_h.html#a27">01552</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a27">signal</a>(<a class="code" href="class_semaphore.html">Semaphore</a> &sem)<font class="keyword"></font> 01553 <font class="keyword"> </font>{sem.<a class="code" href="class_semaphore.html#a4">Post</a>();}; 01554 <a name="l01555"></a><a class="code" href="thread_h.html#a28">01555</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a39">wait</a>(<a class="code" href="class_semaphore.html">Semaphore</a> &sem)<font class="keyword"></font> 01556 <font class="keyword"> </font>{sem.<a class="code" href="class_semaphore.html#a2">Wait</a>();}; 01557 <a name="l01558"></a><a class="code" href="thread_h.html#a29">01558</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a39">wait</a>(<a class="code" href="class_event.html">Event</a> &ev, timeout_t timer)<font class="keyword"></font> 01559 <font class="keyword"> </font>{ev.<a class="code" href="class_event.html#a4">Wait</a>(timer);}; 01560 <a name="l01561"></a><a class="code" href="thread_h.html#a30">01561</a> <font class="keyword">inline</font> <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a30">reset</a>(<a class="code" href="class_event.html">Event</a> &ev)<font class="keyword"></font> 01562 <font class="keyword"> </font>{ev.<a class="code" href="class_event.html#a2">Reset</a>();}; 01563 <a name="l01564"></a><a class="code" href="thread_h.html#a31">01564</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a31">get</a>(<a class="code" href="class_buffer.html">Buffer</a> &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01565 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.<a class="code" href="class_buffer.html#a4">Wait</a>(o);}; 01566 <a name="l01567"></a><a class="code" href="thread_h.html#a32">01567</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a32">put</a>(<a class="code" href="class_buffer.html">Buffer</a> &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01568 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.<a class="code" href="class_buffer.html#a5">Post</a>(o);}; 01569 <a name="l01570"></a><a class="code" href="thread_h.html#a33">01570</a> <font class="keyword">inline</font> <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a33">peek</a>(<a class="code" href="class_buffer.html">Buffer</a> &b, <font class="keywordtype">void</font> *o)<font class="keyword"></font> 01571 <font class="keyword"> </font>{<font class="keywordflow">return</font> b.<a class="code" href="class_buffer.html#a6">Peek</a>(o);}; 01572 01573 <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a34">operator++</a>(<a class="code" href="class_mutexcounter.html">MutexCounter</a> &mc); 01574 <font class="keywordtype">int</font> <a class="code" href="thread_h.html#a35">operator--</a>(<a class="code" href="class_mutexcounter.html">MutexCounter</a> &mc); 01575 01576 <font class="keyword">struct </font>timespec *gettimeout(struct timespec *spec, timeout_t timeout); 01577 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a37">ccxx_sleep</a>(timeout_t msec); 01578 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a38">ccxx_yield</a>(<font class="keywordtype">void</font>); 01579 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a39">wait</a>(signo_t signo); 01588 <font class="keywordtype">void</font> <a class="code" href="thread_h.html#a40">pdetach</a>(<font class="keywordtype">void</font>); 01589 01590 <font class="preprocessor">#ifdef __CCXX_NAMESPACE_H__</font> 01591 <font class="preprocessor"></font><font class="preprocessor">#undef __CCXX_NAMESPACE_H__</font> 01592 <font class="preprocessor"></font><font class="preprocessor">#include <cc++/<a class="code" href="namespace_h.html">namespace.h</a>></font> 01593 <font class="preprocessor">#endif</font> 01594 <font class="preprocessor"></font> 01595 <font class="preprocessor">#if defined(HAVE_POLL_H) || defined(HAVE_SYS_POLL_H)</font> 01596 <font class="preprocessor"></font><font class="preprocessor">#if defined(HAVE_SYS_STREAM_H)</font> 01597 <font class="preprocessor"></font><font class="preprocessor">#if defined(__linux__)</font> 01598 <font class="preprocessor"></font><font class="preprocessor">#define __CCXX_USE_POLL 1</font> 01599 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01600 <font class="preprocessor"></font><font class="preprocessor">#else</font> 01601 <font class="preprocessor"></font><font class="preprocessor">#define __CCXX_USE_POLL 1</font> 01602 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01603 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01604 <font class="preprocessor"></font> 01605 <font class="preprocessor">#ifdef __CCXX_USE_POLL</font> 01606 <font class="preprocessor"></font> <a name="l01614"></a><a class="code" href="class_poller.html">01614</a> <font class="keyword">class </font><a class="code" href="class_poller.html">Poller</a> 01615 { 01616 <font class="keyword">private</font>: 01617 <font class="keywordtype">int</font> nufds; 01618 pollfd *ufds; 01619 01620 <font class="keyword">public</font>: 01621 <a class="code" href="class_poller.html#a0">Poller</a>(); 01622 01623 <a class="code" href="class_poller.html#a1">~Poller</a>(); 01624 01632 pollfd *<a class="code" href="class_poller.html#a3">getList</a>(<font class="keywordtype">int</font> cnt); 01633 <a name="l01639"></a><a class="code" href="class_poller.html#a3">01639</a> <font class="keyword">inline</font> pollfd *<a class="code" href="class_poller.html#a3">getList</a>(<font class="keywordtype">void</font>)<font class="keyword"></font> 01640 <font class="keyword"> </font>{<font class="keywordflow">return</font> ufds;}; 01641 }; 01642 <font class="preprocessor">#endif</font> 01643 <font class="preprocessor"></font> 01644 01645 <font class="preprocessor">#endif</font> 01646 <font class="preprocessor"></font> </div></pre><hr><address><small>Generated at Thu Oct 4 15:32:58 2001 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.5 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, © 1997-2001</small></address> </body> </html>