Sophie

Sophie

distrib > Mandriva > 2007.0 > i586 > by-pkgid > ad1ba1135a9c9eeffc2e538163e00373 > files > 592

libCommonC++2_1.4-devel-1.4.1-1mdv2007.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>GNU CommonC++: thread.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="classes.html"><span>Classes</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
    <li><a href="examples.html"><span>Examples</span></a></li>
  </ul></div>
<div class="tabs">
  <ul>
    <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
  </ul></div>
<h1>thread.h</h1><a href="thread_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Copyright (C) 1999-2005 Open Source Telecom Corporation.</span>
<a name="l00002"></a>00002 <span class="comment">//  </span>
<a name="l00003"></a>00003 <span class="comment">// This program is free software; you can redistribute it and/or modify</span>
<a name="l00004"></a>00004 <span class="comment">// it under the terms of the GNU General Public License as published by</span>
<a name="l00005"></a>00005 <span class="comment">// the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00006"></a>00006 <span class="comment">// (at your option) any later version.</span>
<a name="l00007"></a>00007 <span class="comment">// </span>
<a name="l00008"></a>00008 <span class="comment">// This program is distributed in the hope that it will be useful,</span>
<a name="l00009"></a>00009 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00010"></a>00010 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00011"></a>00011 <span class="comment">// GNU General Public License for more details.</span>
<a name="l00012"></a>00012 <span class="comment">// </span>
<a name="l00013"></a>00013 <span class="comment">// You should have received a copy of the GNU General Public License</span>
<a name="l00014"></a>00014 <span class="comment">// along with this program; if not, write to the Free Software </span>
<a name="l00015"></a>00015 <span class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
<a name="l00016"></a>00016 <span class="comment">// </span>
<a name="l00017"></a>00017 <span class="comment">// As a special exception, you may use this file as part of a free software</span>
<a name="l00018"></a>00018 <span class="comment">// library without restriction.  Specifically, if other files instantiate</span>
<a name="l00019"></a>00019 <span class="comment">// templates or use macros or inline functions from this file, or you compile</span>
<a name="l00020"></a>00020 <span class="comment">// this file and link it with other files to produce an executable, this</span>
<a name="l00021"></a>00021 <span class="comment">// file does not by itself cause the resulting executable to be covered by</span>
<a name="l00022"></a>00022 <span class="comment">// the GNU General Public License.  This exception does not however    </span>
<a name="l00023"></a>00023 <span class="comment">// invalidate any other reasons why the executable file might be covered by</span>
<a name="l00024"></a>00024 <span class="comment">// the GNU General Public License.    </span>
<a name="l00025"></a>00025 <span class="comment">//</span>
<a name="l00026"></a>00026 <span class="comment">// This exception applies only to the code released under the name GNU</span>
<a name="l00027"></a>00027 <span class="comment">// Common C++.  If you copy code from other releases into a copy of GNU</span>
<a name="l00028"></a>00028 <span class="comment">// Common C++, as the General Public License permits, the exception does</span>
<a name="l00029"></a>00029 <span class="comment">// not apply to the code that you add in this way.  To avoid misleading</span>
<a name="l00030"></a>00030 <span class="comment">// anyone as to the status of such modified files, you must delete</span>
<a name="l00031"></a>00031 <span class="comment">// this exception notice from them.</span>
<a name="l00032"></a>00032 <span class="comment">//</span>
<a name="l00033"></a>00033 <span class="comment">// If you write modifications of your own for GNU Common C++, it is your choice</span>
<a name="l00034"></a>00034 <span class="comment">// whether to permit this exception to apply to your modifications.</span>
<a name="l00035"></a>00035 <span class="comment">// If you do not wish that, delete this exception notice.</span>
<a name="l00036"></a>00036 <span class="comment">//</span>
<a name="l00037"></a>00037 
<a name="l00043"></a>00043 <span class="preprocessor">#ifndef CCXX_THREAD_H_</span>
<a name="l00044"></a>00044 <span class="preprocessor"></span><span class="preprocessor">#define CCXX_THREAD_H_</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span>
<a name="l00046"></a>00046 <span class="preprocessor">#include &lt;<a class="code" href="config_8h.html">cc++/config.h</a>&gt;</span>
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00049"></a><a class="code" href="thread_8h.html#9fc514088fa3739a1300ce30ca6585d5">00049</a> <span class="preprocessor"></span><span class="preprocessor">#define CCXX_POSIX</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#endif // !WIN32</span>
<a name="l00051"></a>00051 <span class="preprocessor"></span>
<a name="l00052"></a>00052 <span class="preprocessor">#include &lt;ctime&gt;</span>
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#include &lt;pthread.h&gt;</span>
<a name="l00056"></a>00056 <span class="preprocessor">#endif // !WIN32</span>
<a name="l00057"></a>00057 <span class="preprocessor"></span>
<a name="l00058"></a>00058 <span class="preprocessor">#undef CCXX_USE_WIN32_ATOMIC</span>
<a name="l00059"></a>00059 <span class="preprocessor"></span><span class="preprocessor">#ifndef WIN32</span>
<a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00061"></a>00061 <span class="preprocessor">#include &lt;signal.h&gt;</span>
<a name="l00062"></a>00062 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
<a name="l00063"></a>00063 
<a name="l00064"></a>00064 <span class="preprocessor">#ifdef  _THR_UNIXWARE</span>
<a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#undef  PTHREAD_MUTEXTYPE_RECURSIVE</span>
<a name="l00066"></a>00066 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00067"></a>00067 <span class="preprocessor"></span>
<a name="l00068"></a><a class="code" href="thread_8h.html#3f0d0226a694bf1e508e1b1c758e6ae6">00068</a> <span class="keyword">typedef</span> pthread_t       <a class="code" href="thread_8h.html#3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a>;
<a name="l00069"></a><a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">00069</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>   <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a>;
<a name="l00070"></a>00070 
<a name="l00071"></a>00071 <span class="comment">/*</span>
<a name="l00072"></a>00072 <span class="comment">#if defined(__CYGWIN32__)</span>
<a name="l00073"></a>00073 <span class="comment">__declspec(dllimport) long __stdcall InterlockedIncrement(long *);</span>
<a name="l00074"></a>00074 <span class="comment">__declspec(dllimport) long __stdcall InterlockedDecrement(long *);</span>
<a name="l00075"></a>00075 <span class="comment">__declspec(dllimport) long __stdcall InterlockedExchange(long *, long);</span>
<a name="l00076"></a>00076 <span class="comment">#define CCXX_USE_WIN32_ATOMIC 1</span>
<a name="l00077"></a>00077 <span class="comment">#endif</span>
<a name="l00078"></a>00078 <span class="comment">*/</span>
<a name="l00079"></a>00079 
<a name="l00080"></a>00080 <span class="preprocessor">#else // WIN32</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span><span class="keyword">typedef</span> DWORD   <a class="code" href="thread_8h.html#3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a>;
<a name="l00082"></a>00082 <span class="keyword">typedef</span> DWORD   <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a>;
<a name="l00083"></a>00083 
<a name="l00084"></a>00084 <span class="preprocessor">#define MAX_SEM_VALUE   1000000</span>
<a name="l00085"></a>00085 <span class="preprocessor"></span><span class="preprocessor">#define CCXX_USE_WIN32_ATOMIC 1</span>
<a name="l00086"></a>00086 <span class="preprocessor"></span>
<a name="l00087"></a>00087 <span class="preprocessor">#endif // !WIN32</span>
<a name="l00088"></a>00088 <span class="preprocessor"></span>
<a name="l00089"></a>00089 <span class="preprocessor">#ifdef  HAVE_GCC_CXX_BITS_ATOMIC</span>
<a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#include &lt;ios&gt;</span>
<a name="l00091"></a>00091 <span class="preprocessor">#endif</span>
<a name="l00092"></a>00092 <span class="preprocessor"></span>
<a name="l00093"></a>00093 <span class="preprocessor">#ifdef  CCXX_NAMESPACES</span>
<a name="l00094"></a>00094 <span class="preprocessor"></span><span class="keyword">namespace </span>ost {
<a name="l00095"></a>00095 <span class="preprocessor">#ifdef __BORLANDC__</span>
<a name="l00096"></a>00096 <span class="preprocessor"></span><span class="preprocessor"># if __BORLANDC__ &gt;= 0x0560</span>
<a name="l00097"></a>00097 <span class="preprocessor"></span><span class="keyword">using</span> std::time_t;
<a name="l00098"></a>00098 <span class="keyword">using</span> std::tm;
<a name="l00099"></a>00099 <span class="preprocessor"># endif</span>
<a name="l00100"></a>00100 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00102"></a>00102 <span class="preprocessor"></span>
<a name="l00103"></a>00103 <span class="preprocessor">#ifdef  HAVE_GCC_CXX_BITS_ATOMIC</span>
<a name="l00104"></a>00104 <span class="preprocessor"></span><span class="keyword">using namespace </span>__gnu_cxx;
<a name="l00105"></a>00105 <span class="preprocessor">#endif</span>
<a name="l00106"></a>00106 <span class="preprocessor"></span>
<a name="l00107"></a><a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">00107</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Thread;
<a name="l00108"></a><a class="code" href="namespaceost.html#1a0b31279d4e241eba24d251d1682176">00108</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> ThreadKey;
<a name="l00109"></a>00109 
<a name="l00110"></a><a class="code" href="thread_8h.html#74f2d4c747bce0b8f7f7c1f48e651876">00110</a> <span class="preprocessor">#define TIMEOUT_INF ~((timeout_t) 0)</span>
<a name="l00111"></a>00111 <span class="preprocessor"></span>
<a name="l00112"></a><a class="code" href="thread_8h.html#9d5589bc014dcec626ff198d5c9370cd">00112</a> <span class="preprocessor">#define ENTER_CRITICAL  enterMutex();</span>
<a name="l00113"></a><a class="code" href="thread_8h.html#f1b76aeceb2370c5fcedee46f9cd3d09">00113</a> <span class="preprocessor"></span><span class="preprocessor">#define LEAVE_CRITICAL  leaveMutex();</span>
<a name="l00114"></a><a class="code" href="thread_8h.html#61438c8055883ef92ffb09c68f70f049">00114</a> <span class="preprocessor"></span><span class="preprocessor">#define ENTER_DEFERRED  setCancel(cancelDeferred);</span>
<a name="l00115"></a><a class="code" href="thread_8h.html#c6e53238dd0519d7c7117b2b40d4312b">00115</a> <span class="preprocessor"></span><span class="preprocessor">#define LEAVE_DEFERRED  setCancel(cancelImmediate);</span>
<a name="l00116"></a>00116 <span class="preprocessor"></span>
<a name="l00117"></a>00117 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00118"></a>00118 <span class="preprocessor"></span><span class="comment">// These macros override common functions with thread-safe versions. In</span>
<a name="l00119"></a>00119 <span class="comment">// particular the common "libc" sleep() has problems since it normally</span>
<a name="l00120"></a>00120 <span class="comment">// uses SIGARLM (as actually defined by "posix").  The pthread_delay and</span>
<a name="l00121"></a>00121 <span class="comment">// usleep found in libpthread are gaurenteed not to use SIGALRM and offer</span>
<a name="l00122"></a>00122 <span class="comment">// higher resolution.  psleep() is defined to call the old process sleep.</span>
<a name="l00123"></a>00123 
<a name="l00124"></a>00124 <span class="preprocessor">#undef  sleep</span>
<a name="l00125"></a><a class="code" href="thread_8h.html#5e09ab8cba99b274fd420bd76f39b205">00125</a> <span class="preprocessor"></span><span class="preprocessor">#define psleep(x)       (sleep)(x)</span>
<a name="l00126"></a>00126 <span class="preprocessor"></span>
<a name="l00127"></a>00127 <span class="preprocessor">#ifdef  signal</span>
<a name="l00128"></a>00128 <span class="preprocessor"></span><span class="preprocessor">#undef  signal</span>
<a name="l00129"></a>00129 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00130"></a>00130 <span class="preprocessor"></span>
<a name="l00131"></a>00131 <span class="preprocessor">#endif // !WIN32</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span>
<a name="l00133"></a>00133 <span class="preprocessor">#undef Yield</span>
<a name="l00134"></a>00134 <span class="preprocessor"></span>
<a name="l00135"></a><a class="code" href="namespaceost.html#4528eecdfa02ab10dbfdc49f5b238506">00135</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Conditional;
<a name="l00136"></a><a class="code" href="namespaceost.html#a1f2ab8ff95e0568261375df5837eb19">00136</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Event;
<a name="l00137"></a>00137 
<a name="l00181"></a><a class="code" href="classost_1_1_mutex.html">00181</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Mutex
<a name="l00182"></a>00182 {
<a name="l00183"></a>00183 <span class="keyword">private</span>:
<a name="l00184"></a>00184         <span class="keyword">static</span> <span class="keywordtype">bool</span> _debug;
<a name="l00185"></a>00185         <span class="keyword">const</span> <span class="keywordtype">char</span> *_name;
<a name="l00186"></a>00186 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00187"></a>00187 <span class="preprocessor"></span><span class="preprocessor">#ifndef PTHREAD_MUTEXTYPE_RECURSIVE</span>
<a name="l00188"></a>00188 <span class="preprocessor"></span>        <span class="keywordtype">int</span> <span class="keyword">volatile</span> _level;
<a name="l00189"></a>00189         Thread *<span class="keyword">volatile</span> _tid;
<a name="l00190"></a>00190 <span class="preprocessor">#endif</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span>        <span class="comment">/*</span>
<a name="l00192"></a>00192 <span class="comment">         * Pthread mutex object.  This is protected rather than private</span>
<a name="l00193"></a>00193 <span class="comment">         * because some mixed mode pthread operations require a mutex as</span>
<a name="l00194"></a>00194 <span class="comment">         * well as their primary pthread object.  A good example of this</span>
<a name="l00195"></a>00195 <span class="comment">         * is the Event class, as waiting on a conditional object must be</span>
<a name="l00196"></a>00196 <span class="comment">         * associated with an accessable mutex.  An alternative would be</span>
<a name="l00197"></a>00197 <span class="comment">         * to make such classes "friend" classes of the Mutex.</span>
<a name="l00198"></a>00198 <span class="comment">         */</span>
<a name="l00199"></a>00199         pthread_mutex_t _mutex;
<a name="l00200"></a>00200 <span class="preprocessor">#else // WIN32</span>
<a name="l00201"></a>00201 <span class="preprocessor"></span>
<a name="l00202"></a>00202 <span class="preprocessor"># if defined(MUTEX_UNDERGROUND_WIN32_MUTEX) &amp;&amp; defined(MUTEX_UNDERGROUND_WIN32_CRITICALSECTION)</span>
<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor"># error "Can't determine underground for Mutex"</span>
<a name="l00204"></a>00204 <span class="preprocessor"></span><span class="preprocessor"># endif</span>
<a name="l00205"></a>00205 <span class="preprocessor"></span>
<a name="l00206"></a>00206 <span class="preprocessor">#ifdef MUTEX_UNDERGROUND_WIN32_MUTEX </span>
<a name="l00207"></a>00207 <span class="preprocessor"></span>        <a class="code" href="serial_8h.html#069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> _mutex;
<a name="l00208"></a>00208 <span class="preprocessor">#endif</span>
<a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor">#ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION </span>
<a name="l00210"></a>00210 <span class="preprocessor"></span>        CRITICAL_SECTION _criticalSection;
<a name="l00211"></a>00211 <span class="preprocessor">#endif</span>
<a name="l00212"></a>00212 <span class="preprocessor"></span>
<a name="l00213"></a>00213 <span class="preprocessor">#endif // WIN32</span>
<a name="l00214"></a>00214 <span class="preprocessor"></span>
<a name="l00215"></a>00215 <span class="keyword">public</span>:
<a name="l00221"></a>00221         Mutex(<span class="keyword">const</span> <span class="keywordtype">char</span> *name = NULL);
<a name="l00222"></a>00222 
<a name="l00228"></a>00228         <span class="keyword">virtual</span> ~Mutex();
<a name="l00229"></a>00229 
<a name="l00235"></a><a class="code" href="classost_1_1_mutex.html#83b66f786e344b5192a3993d319aa735">00235</a>         <span class="keyword">static</span> <span class="keywordtype">void</span> setDebug(<span class="keywordtype">bool</span> mode)
<a name="l00236"></a>00236                 {_debug = mode;};
<a name="l00237"></a>00237 
<a name="l00243"></a><a class="code" href="classost_1_1_mutex.html#bed8b05b63f9cdd2c9ca1f92081b1a8a">00243</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> nameMutex(<span class="keyword">const</span> <span class="keywordtype">char</span> *name)
<a name="l00244"></a>00244                 {_name = name;};
<a name="l00245"></a>00245 
<a name="l00253"></a>00253         <span class="keywordtype">void</span> enterMutex(<span class="keywordtype">void</span>);
<a name="l00254"></a>00254 
<a name="l00258"></a><a class="code" href="classost_1_1_mutex.html#ecb516325583e432bf2bf7e4b565f6f6">00258</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> enter(<span class="keywordtype">void</span>)
<a name="l00259"></a>00259                 {enterMutex();};
<a name="l00260"></a>00260 
<a name="l00264"></a><a class="code" href="classost_1_1_mutex.html#b6aaecac9c95d31a5862014d7f1afe73">00264</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> leave(<span class="keywordtype">void</span>)
<a name="l00265"></a>00265                 {leaveMutex();};
<a name="l00266"></a>00266 
<a name="l00272"></a><a class="code" href="classost_1_1_mutex.html#c1ff5454b2c9b55790c4bf33f751704c">00272</a>         <span class="keyword">inline</span> <span class="keywordtype">bool</span> test(<span class="keywordtype">void</span>)
<a name="l00273"></a>00273                 {<span class="keywordflow">return</span> tryEnterMutex();};
<a name="l00274"></a>00274 
<a name="l00285"></a>00285         <span class="keywordtype">bool</span> tryEnterMutex(<span class="keywordtype">void</span>);
<a name="l00286"></a>00286 
<a name="l00297"></a>00297         <span class="keywordtype">void</span> leaveMutex(<span class="keywordtype">void</span>);
<a name="l00298"></a>00298 };
<a name="l00299"></a>00299 
<a name="l00323"></a><a class="code" href="classost_1_1_mutex_lock.html">00323</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> MutexLock
<a name="l00324"></a>00324 {
<a name="l00325"></a>00325 <span class="keyword">private</span>:
<a name="l00326"></a>00326         Mutex&amp; mutex;
<a name="l00327"></a>00327 <span class="keyword">public</span>:
<a name="l00333"></a><a class="code" href="classost_1_1_mutex_lock.html#edb21cfad9b0f1200d055fb69efa2546">00333</a>         MutexLock( Mutex&amp; _mutex ) : mutex( _mutex ) 
<a name="l00334"></a>00334                 { mutex.enterMutex(); }
<a name="l00335"></a>00335 
<a name="l00339"></a>00339         <span class="comment">// this should be not-virtual</span>
<a name="l00340"></a><a class="code" href="classost_1_1_mutex_lock.html#58bba3406d89b40c8bd3e9ac389b920c">00340</a>         ~MutexLock()
<a name="l00341"></a>00341                 { mutex.leaveMutex(); }
<a name="l00342"></a>00342 };
<a name="l00343"></a>00343 
<a name="l00352"></a><a class="code" href="classost_1_1_thread_lock.html">00352</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> ThreadLock
<a name="l00353"></a>00353 {
<a name="l00354"></a>00354 <span class="keyword">private</span>:
<a name="l00355"></a>00355 <span class="preprocessor">#ifdef HAVE_PTHREAD_RWLOCK</span>
<a name="l00356"></a>00356 <span class="preprocessor"></span>        pthread_rwlock_t _lock;
<a name="l00357"></a>00357 <span class="preprocessor">#else</span>
<a name="l00358"></a>00358 <span class="preprocessor"></span>        Mutex mutex;
<a name="l00359"></a>00359 <span class="preprocessor">#endif</span>
<a name="l00360"></a>00360 <span class="preprocessor"></span>
<a name="l00361"></a>00361 <span class="keyword">public</span>:
<a name="l00365"></a>00365         ThreadLock();
<a name="l00366"></a>00366 
<a name="l00370"></a>00370         <span class="keyword">virtual</span> ~ThreadLock();
<a name="l00371"></a>00371 
<a name="l00375"></a>00375         <span class="keywordtype">void</span> readLock(<span class="keywordtype">void</span>);
<a name="l00376"></a>00376 
<a name="l00380"></a>00380         <span class="keywordtype">void</span> writeLock(<span class="keywordtype">void</span>);
<a name="l00381"></a>00381 
<a name="l00387"></a>00387         <span class="keywordtype">bool</span> tryReadLock(<span class="keywordtype">void</span>);
<a name="l00388"></a>00388 
<a name="l00394"></a>00394         <span class="keywordtype">bool</span> tryWriteLock(<span class="keywordtype">void</span>);
<a name="l00395"></a>00395 
<a name="l00399"></a>00399         <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>);
<a name="l00400"></a>00400 };
<a name="l00401"></a>00401 
<a name="l00422"></a><a class="code" href="classost_1_1_read_lock.html">00422</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> ReadLock
<a name="l00423"></a>00423 {
<a name="l00424"></a>00424 <span class="keyword">private</span>:
<a name="l00425"></a>00425         ThreadLock&amp; tl;
<a name="l00426"></a>00426 
<a name="l00427"></a>00427 <span class="keyword">public</span>:
<a name="l00433"></a><a class="code" href="classost_1_1_read_lock.html#05b7c96baf6695c580871d0aaf01c149">00433</a>         ReadLock( ThreadLock&amp; _tl ) : tl( _tl ) 
<a name="l00434"></a>00434                 { tl.readLock(); }
<a name="l00438"></a>00438         <span class="comment">// this should be not-virtual</span>
<a name="l00439"></a><a class="code" href="classost_1_1_read_lock.html#166b6a55b9fa7072be782b7eccf30a98">00439</a>         ~ReadLock()
<a name="l00440"></a>00440                 { tl.unlock(); }
<a name="l00441"></a>00441 };
<a name="l00442"></a>00442 
<a name="l00463"></a><a class="code" href="classost_1_1_write_lock.html">00463</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> WriteLock
<a name="l00464"></a>00464 {
<a name="l00465"></a>00465 <span class="keyword">private</span>:
<a name="l00466"></a>00466         ThreadLock&amp; tl;
<a name="l00467"></a>00467 
<a name="l00468"></a>00468 <span class="keyword">public</span>:
<a name="l00474"></a><a class="code" href="classost_1_1_write_lock.html#93a59b1f5f09dfdaee18eca85759f86e">00474</a>         WriteLock( ThreadLock&amp; _tl ) : tl( _tl ) 
<a name="l00475"></a>00475                 { tl.writeLock(); }
<a name="l00479"></a>00479         <span class="comment">// this should be not-virtual</span>
<a name="l00480"></a><a class="code" href="classost_1_1_write_lock.html#67a6fef0c02e06cbbf6069715c38cba5">00480</a>         ~WriteLock()
<a name="l00481"></a>00481                 { tl.unlock(); }
<a name="l00482"></a>00482 };
<a name="l00483"></a>00483 
<a name="l00484"></a>00484 
<a name="l00494"></a><a class="code" href="classost_1_1_mutex_counter.html">00494</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> MutexCounter : <span class="keyword">public</span> Mutex
<a name="l00495"></a>00495 {
<a name="l00496"></a>00496 <span class="keyword">private</span>:
<a name="l00497"></a>00497         <span class="keyword">volatile</span> <span class="keywordtype">int</span>    counter;
<a name="l00498"></a>00498 
<a name="l00499"></a>00499 <span class="keyword">public</span>:
<a name="l00505"></a>00505         MutexCounter(<span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL);
<a name="l00506"></a>00506 
<a name="l00514"></a>00514         MutexCounter(<span class="keywordtype">int</span> initial, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL);
<a name="l00515"></a>00515 
<a name="l00516"></a>00516         <span class="keyword">friend</span> <a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <span class="keywordtype">int</span> operator++(MutexCounter &amp;mc);
<a name="l00517"></a>00517         <span class="keyword">friend</span> <a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <span class="keywordtype">int</span> operator--(MutexCounter &amp;mc);
<a name="l00518"></a>00518 };
<a name="l00519"></a>00519 
<a name="l00530"></a><a class="code" href="classost_1_1_atomic_counter.html">00530</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> AtomicCounter
<a name="l00531"></a>00531 {
<a name="l00532"></a>00532 <span class="preprocessor">#ifndef CCXX_USE_WIN32_ATOMIC</span>
<a name="l00533"></a>00533 <span class="preprocessor"></span><span class="keyword">private</span>:
<a name="l00534"></a>00534 <span class="preprocessor">#if     defined(HAVE_ATOMIC_AIX)</span>
<a name="l00535"></a>00535 <span class="preprocessor"></span>        <span class="keyword">volatile</span> <span class="keywordtype">int</span> counter;
<a name="l00536"></a>00536 <span class="preprocessor">#elif   defined(HAVE_GCC_BITS_ATOMIC)</span>
<a name="l00537"></a>00537 <span class="preprocessor"></span>        <span class="keyword">volatile</span> _Atomic_word counter;
<a name="l00538"></a>00538 <span class="preprocessor">#elif   defined(HAVE_GCC_CXX_BITS_ATOMIC)</span>
<a name="l00539"></a>00539 <span class="preprocessor"></span>        <span class="keyword">volatile</span> _Atomic_word counter;
<a name="l00540"></a>00540 <span class="comment">//      __gnu_cxx::_Atomic_word counter;</span>
<a name="l00541"></a>00541 <span class="preprocessor">#elif   defined(HAVE_ATOMIC)</span>
<a name="l00542"></a>00542 <span class="preprocessor"></span>        atomic_t atomic;
<a name="l00543"></a>00543 <span class="preprocessor">#else</span>
<a name="l00544"></a>00544 <span class="preprocessor"></span>        <span class="keyword">volatile</span> <span class="keywordtype">int</span> counter;
<a name="l00545"></a>00545         pthread_mutex_t _mutex;
<a name="l00546"></a>00546 <span class="preprocessor">#endif</span>
<a name="l00547"></a>00547 <span class="preprocessor"></span>
<a name="l00548"></a>00548 <span class="keyword">public</span>:
<a name="l00552"></a>00552         AtomicCounter();
<a name="l00553"></a>00553 
<a name="l00559"></a>00559         AtomicCounter(<span class="keywordtype">int</span> value);
<a name="l00560"></a>00560 
<a name="l00561"></a>00561         ~AtomicCounter();
<a name="l00562"></a>00562 
<a name="l00563"></a>00563         <span class="keywordtype">int</span> operator++(<span class="keywordtype">void</span>);
<a name="l00564"></a>00564         <span class="keywordtype">int</span> operator--(<span class="keywordtype">void</span>);
<a name="l00565"></a>00565         <span class="keywordtype">int</span> operator+=(<span class="keywordtype">int</span> change);
<a name="l00566"></a>00566         <span class="keywordtype">int</span> operator-=(<span class="keywordtype">int</span> change);
<a name="l00567"></a>00567         <span class="keywordtype">int</span> operator+(<span class="keywordtype">int</span> change);
<a name="l00568"></a>00568         <span class="keywordtype">int</span> operator-(<span class="keywordtype">int</span> change);
<a name="l00569"></a>00569         <span class="keywordtype">int</span> operator=(<span class="keywordtype">int</span> value);
<a name="l00570"></a>00570         <span class="keywordtype">bool</span> operator!(<span class="keywordtype">void</span>);
<a name="l00571"></a>00571         operator int();
<a name="l00572"></a>00572 <span class="preprocessor">#else</span>
<a name="l00573"></a>00573 <span class="preprocessor"></span><span class="keyword">private</span>:
<a name="l00574"></a>00574         <span class="keywordtype">long</span> atomic;
<a name="l00575"></a>00575 
<a name="l00576"></a>00576 <span class="keyword">public</span>:
<a name="l00577"></a>00577         <span class="keyword">inline</span> AtomicCounter()
<a name="l00578"></a>00578                 {atomic = 0;};
<a name="l00579"></a>00579 
<a name="l00580"></a>00580         <span class="keyword">inline</span> AtomicCounter(<span class="keywordtype">int</span> value)
<a name="l00581"></a>00581                 {atomic = value;};
<a name="l00582"></a>00582 
<a name="l00583"></a>00583         <span class="keyword">inline</span> <span class="keywordtype">int</span> operator++(<span class="keywordtype">void</span>)
<a name="l00584"></a>00584                 {<span class="keywordflow">return</span> InterlockedIncrement(&amp;atomic);};
<a name="l00585"></a>00585 
<a name="l00586"></a>00586         <span class="keyword">inline</span> <span class="keywordtype">int</span> operator--(<span class="keywordtype">void</span>)
<a name="l00587"></a>00587                 {<span class="keywordflow">return</span> InterlockedDecrement(&amp;atomic);};
<a name="l00588"></a>00588 
<a name="l00589"></a>00589         <span class="keywordtype">int</span> operator+=(<span class="keywordtype">int</span> change);
<a name="l00590"></a>00590 
<a name="l00591"></a>00591         <span class="keywordtype">int</span> operator-=(<span class="keywordtype">int</span> change);
<a name="l00592"></a>00592 
<a name="l00593"></a>00593         <span class="keyword">inline</span> <span class="keywordtype">int</span> operator+(<span class="keywordtype">int</span> change)
<a name="l00594"></a>00594                 {<span class="keywordflow">return</span> atomic + change;};
<a name="l00595"></a>00595 
<a name="l00596"></a>00596         <span class="keyword">inline</span> <span class="keywordtype">int</span> operator-(<span class="keywordtype">int</span> change)
<a name="l00597"></a>00597                 {<span class="keywordflow">return</span> atomic - change;};
<a name="l00598"></a>00598         
<a name="l00599"></a>00599         <span class="keyword">inline</span> <span class="keywordtype">int</span> operator=(<span class="keywordtype">int</span> value)
<a name="l00600"></a>00600                 {<span class="keywordflow">return</span> InterlockedExchange(&amp;atomic, value);};
<a name="l00601"></a>00601 
<a name="l00602"></a>00602         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!(<span class="keywordtype">void</span>)
<a name="l00603"></a>00603                 {<span class="keywordflow">return</span> (atomic == 0) ? <span class="keyword">true</span> : <span class="keyword">false</span>;};
<a name="l00604"></a>00604 
<a name="l00605"></a>00605         <span class="keyword">inline</span> operator int()
<a name="l00606"></a>00606                 {<span class="keywordflow">return</span> atomic;};
<a name="l00607"></a>00607 <span class="preprocessor">#endif</span>
<a name="l00608"></a>00608 <span class="preprocessor"></span>};
<a name="l00609"></a>00609 
<a name="l00610"></a>00610 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00611"></a>00611 <span class="preprocessor"></span>
<a name="l00631"></a><a class="code" href="classost_1_1_conditional.html">00631</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="namespaceost.html#4528eecdfa02ab10dbfdc49f5b238506">Conditional</a> 
<a name="l00632"></a>00632 {
<a name="l00633"></a>00633 <span class="keyword">private</span>:
<a name="l00634"></a>00634         pthread_cond_t _cond;
<a name="l00635"></a>00635         pthread_mutex_t _mutex;
<a name="l00636"></a>00636 
<a name="l00637"></a>00637 <span class="keyword">public</span>:
<a name="l00643"></a>00643         <a class="code" href="namespaceost.html#4528eecdfa02ab10dbfdc49f5b238506">Conditional</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL);
<a name="l00644"></a>00644 
<a name="l00648"></a>00648         <span class="keyword">virtual</span> ~<a class="code" href="namespaceost.html#4528eecdfa02ab10dbfdc49f5b238506">Conditional</a>();
<a name="l00649"></a>00649 
<a name="l00655"></a>00655         <span class="keywordtype">void</span> signal(<span class="keywordtype">bool</span> broadcast);
<a name="l00656"></a>00656 
<a name="l00663"></a>00663         <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer = 0, <span class="keywordtype">bool</span> locked = <span class="keyword">false</span>);
<a name="l00664"></a>00664 
<a name="l00671"></a>00671         <span class="keywordtype">void</span> enterMutex(<span class="keywordtype">void</span>);
<a name="l00672"></a>00672 
<a name="l00681"></a><a class="code" href="classost_1_1_conditional.html#2a3bf89c582dad8ba7e81370fd361668">00681</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> lock(<span class="keywordtype">void</span>)
<a name="l00682"></a>00682                 {enterMutex();};
<a name="l00683"></a>00683 
<a name="l00694"></a>00694         <span class="keywordtype">bool</span> tryEnterMutex(<span class="keywordtype">void</span>);
<a name="l00695"></a>00695 
<a name="l00696"></a><a class="code" href="classost_1_1_conditional.html#507839fac82a32f946fa5f87d41bef28">00696</a>         <span class="keyword">inline</span> <span class="keywordtype">bool</span> test(<span class="keywordtype">void</span>)
<a name="l00697"></a>00697                 {<span class="keywordflow">return</span> tryEnterMutex();};
<a name="l00698"></a>00698 
<a name="l00704"></a>00704         <span class="keywordtype">void</span> leaveMutex(<span class="keywordtype">void</span>);
<a name="l00705"></a>00705 
<a name="l00706"></a><a class="code" href="classost_1_1_conditional.html#8b6126bbb6e58c1b8ef937bebf4af222">00706</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>)
<a name="l00707"></a>00707                 {<span class="keywordflow">return</span> leaveMutex();};
<a name="l00708"></a>00708 };
<a name="l00709"></a>00709 <span class="preprocessor">#endif</span>
<a name="l00710"></a>00710 <span class="preprocessor"></span>
<a name="l00728"></a><a class="code" href="classost_1_1_semaphore.html">00728</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Semaphore
<a name="l00729"></a>00729 {
<a name="l00730"></a>00730 <span class="keyword">private</span>:
<a name="l00731"></a>00731 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00732"></a>00732 <span class="preprocessor"></span>        <span class="keywordtype">unsigned</span> _count, _waiters;
<a name="l00733"></a>00733         pthread_mutex_t _mutex;
<a name="l00734"></a>00734         pthread_cond_t _cond;
<a name="l00735"></a>00735 <span class="preprocessor">#else</span>
<a name="l00736"></a>00736 <span class="preprocessor"></span>        <a class="code" href="serial_8h.html#069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a>  semObject;
<a name="l00737"></a>00737 <span class="preprocessor">#endif // !WIN32</span>
<a name="l00738"></a>00738 <span class="preprocessor"></span>
<a name="l00739"></a>00739 <span class="keyword">public</span>:
<a name="l00748"></a>00748         Semaphore(<span class="keywordtype">unsigned</span> resource = 0);
<a name="l00749"></a>00749 
<a name="l00756"></a>00756         <span class="keyword">virtual</span> ~Semaphore();
<a name="l00757"></a>00757 
<a name="l00773"></a>00773         <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout = 0);
<a name="l00774"></a>00774 
<a name="l00786"></a>00786         <span class="keywordtype">void</span> post(<span class="keywordtype">void</span>);
<a name="l00787"></a>00787 
<a name="l00788"></a>00788         <span class="comment">// FIXME: how implement getValue for posix compatibility ?</span>
<a name="l00789"></a>00789         <span class="comment">// not portable...</span>
<a name="l00790"></a>00790 
<a name="l00791"></a>00791 <span class="preprocessor">#if     0</span>
<a name="l00792"></a>00792 <span class="preprocessor"></span>
<a name="l00797"></a>00797         <span class="keywordtype">int</span> getValue(<span class="keywordtype">void</span>);
<a name="l00798"></a>00798 <span class="preprocessor">#endif</span>
<a name="l00799"></a>00799 <span class="preprocessor"></span>};
<a name="l00800"></a>00800 
<a name="l00820"></a><a class="code" href="classost_1_1_semaphore_lock.html">00820</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> SemaphoreLock
<a name="l00821"></a>00821 {
<a name="l00822"></a>00822 <span class="keyword">private</span>:
<a name="l00823"></a>00823         Semaphore&amp; sem;
<a name="l00824"></a>00824 
<a name="l00825"></a>00825 <span class="keyword">public</span>:
<a name="l00829"></a><a class="code" href="classost_1_1_semaphore_lock.html#db34354071ac2005870fb78926887a05">00829</a>         SemaphoreLock( Semaphore&amp; _sem ) : sem( _sem ) 
<a name="l00830"></a>00830                 { sem.wait(); }
<a name="l00834"></a>00834         <span class="comment">// this should be not-virtual</span>
<a name="l00835"></a><a class="code" href="classost_1_1_semaphore_lock.html#59bf7e09b61fd3b900070841fae86597">00835</a>         ~SemaphoreLock()
<a name="l00836"></a>00836                 { sem.post(); }
<a name="l00837"></a>00837 };
<a name="l00838"></a>00838 
<a name="l00852"></a><a class="code" href="classost_1_1_event.html">00852</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="namespaceost.html#a1f2ab8ff95e0568261375df5837eb19">Event</a>
<a name="l00853"></a>00853 {
<a name="l00854"></a>00854 <span class="keyword">private</span>:
<a name="l00855"></a>00855 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00856"></a>00856 <span class="preprocessor"></span>        pthread_mutex_t _mutex;
<a name="l00857"></a>00857         pthread_cond_t _cond;
<a name="l00858"></a>00858         <span class="keywordtype">bool</span> _signaled;
<a name="l00859"></a>00859         <span class="keywordtype">int</span> _count;
<a name="l00860"></a>00860 <span class="preprocessor">#else</span>
<a name="l00861"></a>00861 <span class="preprocessor"></span>        <a class="code" href="serial_8h.html#069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> cond;
<a name="l00862"></a>00862 <span class="preprocessor">#endif</span>
<a name="l00863"></a>00863 <span class="preprocessor"></span>
<a name="l00864"></a>00864 <span class="keyword">public</span>:
<a name="l00865"></a>00865         <a class="code" href="namespaceost.html#a1f2ab8ff95e0568261375df5837eb19">Event</a>();
<a name="l00866"></a>00866 
<a name="l00867"></a>00867         <span class="keyword">virtual</span> ~<a class="code" href="namespaceost.html#a1f2ab8ff95e0568261375df5837eb19">Event</a>();
<a name="l00868"></a>00868 
<a name="l00875"></a>00875         <span class="keywordtype">void</span> reset(<span class="keywordtype">void</span>);
<a name="l00876"></a>00876 
<a name="l00880"></a>00880         <span class="keywordtype">void</span> signal(<span class="keywordtype">void</span>);
<a name="l00881"></a>00881 
<a name="l00890"></a>00890         <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer);
<a name="l00891"></a>00891         <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#24c7774639b3768bdd45b65a296f6369">wait</a>(<span class="keywordtype">void</span>);
<a name="l00892"></a>00892 };
<a name="l00893"></a>00893 
<a name="l00894"></a>00894 
<a name="l01076"></a><a class="code" href="classost_1_1_thread.html">01076</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>
<a name="l01077"></a>01077 {
<a name="l01078"></a>01078 <span class="keyword">public</span>:
<a name="l01082"></a><a class="code" href="classost_1_1_thread.html#b9538e839c06104af2974b77d2a5674d">01082</a>         <span class="keyword">typedef</span> <span class="keyword">enum</span> Throw {
<a name="l01083"></a>01083                 throwNothing,  
<a name="l01084"></a>01084                 throwObject,   
<a name="l01085"></a><a class="code" href="classost_1_1_thread.html#b9538e839c06104af2974b77d2a5674d8e51a6870e65238764becffff92d7f54">01085</a>                 throwException 
<a name="l01086"></a>01086         } Throw;
<a name="l01087"></a>01087         
<a name="l01091"></a><a class="code" href="classost_1_1_thread.html#24f333b09607b7c48a97e05865ada69b">01091</a>         <span class="keyword">typedef</span> <span class="keyword">enum</span> Cancel
<a name="l01092"></a>01092         {
<a name="l01093"></a>01093                 cancelInitial=0,  
<a name="l01094"></a>01094                 cancelDeferred=1, 
<a name="l01095"></a>01095                 cancelImmediate,  
<a name="l01096"></a>01096                 cancelDisabled,   
<a name="l01097"></a>01097                 cancelManual,     
<a name="l01099"></a>01099                 cancelDefault=cancelDeferred
<a name="l01101"></a>01101         } Cancel;
<a name="l01102"></a>01102 
<a name="l01106"></a><a class="code" href="classost_1_1_thread.html#ff7bd364ce645eac95affbf74f1a7087">01106</a>         <span class="keyword">typedef</span> <span class="keyword">enum</span> Suspend
<a name="l01107"></a>01107         {
<a name="l01108"></a>01108                 suspendEnable, 
<a name="l01109"></a><a class="code" href="classost_1_1_thread.html#ff7bd364ce645eac95affbf74f1a70870e9f14f0e69d8c12c36a46d108a5074b">01109</a>                 suspendDisable 
<a name="l01110"></a>01110         } Suspend;
<a name="l01111"></a>01111 
<a name="l01112"></a>01112 <span class="preprocessor">#ifndef WIN32</span>
<a name="l01113"></a>01113 <span class="preprocessor"></span>
<a name="l01114"></a><a class="code" href="classost_1_1_thread.html#bc1a729c4204bc85f58c47042f429acb">01114</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html">PosixThread</a>;
<a name="l01115"></a>01115 <span class="preprocessor">#endif</span>
<a name="l01116"></a>01116 <span class="preprocessor"></span>
<a name="l01117"></a><a class="code" href="classost_1_1_thread.html#9b6e94561c96e07e8f2dd776bbc19396">01117</a> <span class="keyword">friend</span> <span class="keyword">class </span>DummyThread;
<a name="l01118"></a>01118 <span class="keyword">private</span>:
<a name="l01119"></a><a class="code" href="classost_1_1_thread.html#bbf97e2c58c760acb67b9db3a7ba11db">01119</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_cancellation.html">Cancellation</a>;
<a name="l01120"></a><a class="code" href="classost_1_1_thread.html#e156bb5074cfe5c3a729890e0ded952f">01120</a>         <span class="keyword">friend</span> <span class="keyword">class </span>postream_type;
<a name="l01121"></a><a class="code" href="classost_1_1_thread.html#f08013a89bf19b835ba6f75a60f870ed">01121</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_slog.html">Slog</a>;
<a name="l01122"></a>01122 
<a name="l01123"></a>01123         Semaphore joinSem;
<a name="l01124"></a>01124         <span class="keyword">static</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>* _main;
<a name="l01125"></a>01125 
<a name="l01126"></a>01126         <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> *_parent;
<a name="l01127"></a>01127         Cancel _cancel;
<a name="l01128"></a>01128         Semaphore *_start;
<a name="l01129"></a>01129 
<a name="l01130"></a>01130         <span class="comment">// private data</span>
<a name="l01131"></a><a class="code" href="classost_1_1_thread.html#e3c1cdb20d70b22a5c0bf395614eefff">01131</a>         <span class="keyword">friend</span> <span class="keyword">class </span>ThreadImpl;
<a name="l01132"></a>01132         <span class="keyword">class </span>ThreadImpl* priv;
<a name="l01133"></a>01133 
<a name="l01134"></a>01134 <span class="keyword">public</span>:
<a name="l01135"></a>01135         <span class="keyword">static</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> *get(<span class="keywordtype">void</span>);
<a name="l01136"></a>01136 
<a name="l01137"></a>01137 <span class="keyword">private</span>:
<a name="l01138"></a>01138 <span class="preprocessor">#ifdef  WIN32</span>
<a name="l01139"></a>01139 <span class="preprocessor"></span>        <span class="keyword">static</span> <span class="keywordtype">unsigned</span> __stdcall Execute(<a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> *th);
<a name="l01140"></a>01140 <span class="preprocessor">#endif</span>
<a name="l01141"></a>01141 <span class="preprocessor"></span>
<a name="l01142"></a>01142         <span class="comment">// close current thread, free all and call Notify</span>
<a name="l01143"></a>01143         <span class="keywordtype">void</span> close();
<a name="l01144"></a>01144 
<a name="l01145"></a>01145 <span class="keyword">private</span>:
<a name="l01146"></a>01146         <span class="keywordtype">char</span> _name[32];
<a name="l01147"></a>01147         <span class="keyword">static</span> size_t _autostack;
<a name="l01148"></a>01148 
<a name="l01149"></a>01149 <span class="preprocessor">#ifdef WIN32</span>
<a name="l01150"></a>01150 <span class="preprocessor"></span>        DWORD waitHandle(<a class="code" href="serial_8h.html#069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> obj, <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout);
<a name="l01151"></a>01151 <span class="preprocessor">#endif</span>
<a name="l01152"></a>01152 <span class="preprocessor"></span>
<a name="l01153"></a>01153 <span class="keyword">protected</span>:
<a name="l01161"></a>01161         <span class="keywordtype">void</span> setName(<span class="keyword">const</span> <span class="keywordtype">char</span> *text);
<a name="l01162"></a>01162 
<a name="l01172"></a>01172         <span class="keyword">virtual</span> <span class="keywordtype">void</span> run(<span class="keywordtype">void</span>) = 0;
<a name="l01173"></a>01173 
<a name="l01195"></a>01195         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">final</span>(void);
<a name="l01196"></a>01196 
<a name="l01208"></a>01208         <span class="keyword">virtual</span> <span class="keywordtype">void</span> initial(<span class="keywordtype">void</span>);
<a name="l01209"></a>01209 
<a name="l01219"></a>01219         <span class="keyword">virtual</span> <span class="keywordtype">void</span>* getExtended(<span class="keywordtype">void</span>);
<a name="l01220"></a>01220 
<a name="l01228"></a>01228         <span class="keyword">virtual</span> <span class="keywordtype">void</span> notify(<a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>*);
<a name="l01229"></a>01229 
<a name="l01235"></a>01235         <span class="keywordtype">void</span> exit(<span class="keywordtype">void</span>);
<a name="l01236"></a>01236 
<a name="l01240"></a>01240         <span class="keywordtype">void</span> sync(<span class="keywordtype">void</span>);
<a name="l01241"></a>01241 
<a name="l01245"></a>01245         <span class="keywordtype">bool</span> testCancel(<span class="keywordtype">void</span>);
<a name="l01246"></a>01246 
<a name="l01256"></a>01256         <span class="keywordtype">void</span> setCancel(Cancel mode);
<a name="l01257"></a>01257 
<a name="l01265"></a>01265         <span class="keywordtype">void</span> setSuspend(Suspend mode);
<a name="l01266"></a>01266 
<a name="l01275"></a>01275         <span class="keywordtype">void</span> terminate(<span class="keywordtype">void</span>);
<a name="l01276"></a>01276 
<a name="l01280"></a><a class="code" href="classost_1_1_thread.html#5e574c2c5f388277527c9257524dd654">01280</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> clrParent(<span class="keywordtype">void</span>)
<a name="l01281"></a>01281                 {_parent = NULL;};
<a name="l01282"></a>01282 
<a name="l01283"></a>01283 <span class="keyword">public</span>:
<a name="l01292"></a>01292         <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>(<span class="keywordtype">bool</span> isMain);
<a name="l01293"></a>01293 
<a name="l01305"></a>01305         <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>(<span class="keywordtype">int</span> pri = 0, size_t stack = 0);
<a name="l01306"></a>01306 
<a name="l01307"></a>01307 <span class="preprocessor">#ifndef WIN32</span>
<a name="l01308"></a>01308 <span class="preprocessor"></span>
<a name="l01316"></a>01316         <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>(<span class="keyword">const</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> &amp;th);
<a name="l01317"></a>01317 <span class="preprocessor">#endif</span>
<a name="l01318"></a>01318 <span class="preprocessor"></span>
<a name="l01325"></a>01325         <span class="keyword">virtual</span> ~<a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>();
<a name="l01326"></a>01326 
<a name="l01332"></a><a class="code" href="classost_1_1_thread.html#ccd29b724539d63a8495d954f9f56c72">01332</a>         <span class="keyword">static</span> <span class="keywordtype">void</span> setStack(size_t size = 0)
<a name="l01333"></a>01333                 {_autostack = size;};
<a name="l01334"></a>01334 
<a name="l01344"></a>01344         <span class="keyword">static</span> <span class="keywordtype">void</span> sleep(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> msec);
<a name="l01345"></a>01345 
<a name="l01350"></a>01350         <span class="keyword">static</span> <span class="keywordtype">void</span> yield(<span class="keywordtype">void</span>);
<a name="l01351"></a>01351 
<a name="l01364"></a>01364         <span class="keywordtype">int</span> start(Semaphore *start = 0);
<a name="l01365"></a>01365 
<a name="l01374"></a>01374         <span class="keywordtype">int</span> detach(Semaphore *start = 0);
<a name="l01375"></a>01375 
<a name="l01382"></a><a class="code" href="classost_1_1_thread.html#ac5bc230c3bad5c837baa9e6d01f4c24">01382</a>         <span class="keyword">inline</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> *getParent(<span class="keywordtype">void</span>)
<a name="l01383"></a>01383                 {<span class="keywordflow">return</span> _parent;};
<a name="l01384"></a>01384 
<a name="l01391"></a>01391         <span class="keywordtype">void</span> suspend(<span class="keywordtype">void</span>);
<a name="l01392"></a>01392 
<a name="l01396"></a>01396         <span class="keywordtype">void</span> resume(<span class="keywordtype">void</span>);
<a name="l01397"></a>01397 
<a name="l01404"></a><a class="code" href="classost_1_1_thread.html#3524521d80bcc0562fb59a28ce5d62a4">01404</a>         <span class="keyword">inline</span> Cancel getCancel(<span class="keywordtype">void</span>)
<a name="l01405"></a>01405                 {<span class="keywordflow">return</span> _cancel;};
<a name="l01406"></a>01406 
<a name="l01413"></a>01413         <span class="keywordtype">bool</span> isRunning(<span class="keywordtype">void</span>);
<a name="l01414"></a>01414 
<a name="l01420"></a>01420         <span class="keywordtype">bool</span> isDetached(<span class="keywordtype">void</span>);
<a name="l01421"></a>01421 
<a name="l01425"></a>01425         <span class="keywordtype">void</span> join(<span class="keywordtype">void</span>);
<a name="l01426"></a>01426 
<a name="l01433"></a>01433         <span class="keywordtype">bool</span> isThread(<span class="keywordtype">void</span>);
<a name="l01434"></a>01434 
<a name="l01440"></a>01440         <a class="code" href="thread_8h.html#3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a> getId(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l01441"></a>01441 
<a name="l01448"></a><a class="code" href="classost_1_1_thread.html#e78f5d3f965bff1b6aa4ae6dacc5cc35">01448</a>         <span class="keyword">const</span> <span class="keywordtype">char</span> *getName(<span class="keywordtype">void</span>)
<a name="l01449"></a>01449                 {<span class="keywordflow">return</span> _name;};
<a name="l01450"></a>01450 
<a name="l01456"></a>01456         <span class="keyword">static</span> Throw getException(<span class="keywordtype">void</span>);
<a name="l01457"></a>01457 
<a name="l01463"></a>01463         <span class="keyword">static</span> <span class="keywordtype">void</span> setException(Throw mode);
<a name="l01464"></a>01464 
<a name="l01471"></a><a class="code" href="classost_1_1_thread.html#2742c471d2abe8712368ccff8d534702">01471</a>         <span class="keyword">friend</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> operator++(<a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> &amp;th)
<a name="l01472"></a>01472                 {<span class="keywordflow">if</span> (th.<a class="code" href="classost_1_1_thread.html#4a1ff1c7e02815a20ddea77bc79d4703">_start</a>) th.<a class="code" href="classost_1_1_thread.html#4a1ff1c7e02815a20ddea77bc79d4703">_start</a>-&gt;<a class="code" href="classost_1_1_semaphore.html#7535c9c3f3c60596b21b5275342cbe1e">post</a>();};
<a name="l01473"></a>01473 
<a name="l01474"></a><a class="code" href="classost_1_1_thread.html#a797f8e5a1ea5b857251f98f0d50614e">01474</a>         <span class="keyword">friend</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> operator--(<a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> &amp;th)
<a name="l01475"></a>01475                 {<span class="keywordflow">if</span> (th.<a class="code" href="classost_1_1_thread.html#4a1ff1c7e02815a20ddea77bc79d4703">_start</a>) th.<a class="code" href="classost_1_1_thread.html#4a1ff1c7e02815a20ddea77bc79d4703">_start</a>-&gt;<a class="code" href="classost_1_1_semaphore.html#1f2526be16a463d2392a74f668a91d80">wait</a>();};
<a name="l01476"></a>01476 
<a name="l01477"></a>01477 <span class="preprocessor">#ifdef WIN32</span>
<a name="l01478"></a>01478 <span class="preprocessor"></span>        <span class="keywordtype">bool</span> isCancelled();
<a name="l01479"></a>01479 
<a name="l01480"></a>01480         <span class="keyword">static</span> DWORD waitThread(<a class="code" href="serial_8h.html#069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> hRef, <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout);
<a name="l01481"></a>01481 <span class="preprocessor">#endif</span>
<a name="l01482"></a>01482 <span class="preprocessor"></span>
<a name="l01490"></a>01490         <span class="keyword">static</span> Cancel enterCancel(<span class="keywordtype">void</span>);
<a name="l01491"></a>01491 
<a name="l01497"></a>01497         <span class="keyword">static</span> <span class="keywordtype">void</span> exitCancel(Cancel cancel);
<a name="l01498"></a>01498 };
<a name="l01499"></a>01499 
<a name="l01509"></a><a class="code" href="classost_1_1_cancellation.html">01509</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Cancellation
<a name="l01510"></a>01510 {
<a name="l01511"></a>01511 <span class="keyword">private</span>:
<a name="l01512"></a>01512         <a class="code" href="classost_1_1_thread.html#0d876c60edcf92d3d96121aacea441d0">Thread::Cancel</a> prior;
<a name="l01513"></a>01513 
<a name="l01514"></a>01514 <span class="keyword">public</span>:
<a name="l01515"></a>01515         Cancellation(<a class="code" href="classost_1_1_thread.html#0d876c60edcf92d3d96121aacea441d0">Thread::Cancel</a> cancel);
<a name="l01516"></a>01516         ~Cancellation();
<a name="l01517"></a>01517 };
<a name="l01518"></a>01518 
<a name="l01519"></a>01519 <span class="preprocessor">#if !defined(WIN32) &amp;&amp; !defined(__MINGW32__)</span>
<a name="l01520"></a><a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">01520</a> <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">int</span>             <a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a>;
<a name="l01521"></a>01521 
<a name="l01522"></a><a class="code" href="classost_1_1_posix_thread.html">01522</a> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html">PosixThread</a>: <span class="keyword">public</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>
<a name="l01523"></a>01523 {
<a name="l01524"></a>01524 <span class="keyword">private</span>:
<a name="l01525"></a>01525 <span class="preprocessor">#ifndef WIN32</span>
<a name="l01526"></a>01526 <span class="preprocessor"></span>
<a name="l01527"></a><a class="code" href="classost_1_1_posix_thread.html#e3c1cdb20d70b22a5c0bf395614eefff">01527</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html#e3c1cdb20d70b22a5c0bf395614eefff">ThreadImpl</a>;
<a name="l01528"></a><a class="code" href="classost_1_1_posix_thread.html#dbc148eaddd341d7ae4d07c9e9e33bfd">01528</a>         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html#dbc148eaddd341d7ae4d07c9e9e33bfd">Thread</a>;
<a name="l01529"></a>01529 <span class="preprocessor">#endif</span>
<a name="l01530"></a>01530 <span class="preprocessor"></span><span class="preprocessor">#ifndef CCXX_SIG_THREAD_ALARM</span>
<a name="l01531"></a>01531 <span class="preprocessor"></span>        <span class="keyword">static</span> <a class="code" href="classost_1_1_posix_thread.html">PosixThread</a> *_timer;
<a name="l01532"></a>01532         <span class="keyword">static</span> Mutex _arm;
<a name="l01533"></a>01533 <span class="preprocessor">#endif</span>
<a name="l01534"></a>01534 <span class="preprocessor"></span>        
<a name="l01535"></a>01535         time_t  _alarm;
<a name="l01536"></a>01536         <span class="keyword">static</span> <span class="keywordtype">void</span> signalThread(<a class="code" href="classost_1_1_posix_thread.html#dbc148eaddd341d7ae4d07c9e9e33bfd">Thread</a>* th,<a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo);
<a name="l01537"></a>01537 <span class="keyword">protected</span>:
<a name="l01538"></a>01538                 
<a name="l01545"></a><a class="code" href="classost_1_1_posix_thread.html#1698de2b943084fe05849cbd42099156">01545</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#1698de2b943084fe05849cbd42099156">signalParent</a>(<a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo)
<a name="l01546"></a>01546                 { signalThread(_parent,signo); };
<a name="l01547"></a>01547         
<a name="l01554"></a><a class="code" href="classost_1_1_posix_thread.html#d13ab707409d229be9c5b64a0e2ec7ad">01554</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#d13ab707409d229be9c5b64a0e2ec7ad">signalMain</a>(<a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo)
<a name="l01555"></a>01555                 { signalThread(_main,signo);};
<a name="l01556"></a>01556 
<a name="l01561"></a>01561         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#9ce41764e5846b94195d367a0c7c7e4e">onTimer</a>(<span class="keywordtype">void</span>);
<a name="l01562"></a>01562 
<a name="l01567"></a>01567         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#cfb12beb826e7895f54a5af9e6c38434">onHangup</a>(<span class="keywordtype">void</span>);
<a name="l01568"></a>01568 
<a name="l01573"></a>01573         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#db1aa6d0e6baa04c37e1a61b641414e7">onException</a>(<span class="keywordtype">void</span>);
<a name="l01574"></a>01574 
<a name="l01579"></a>01579         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#105a9f61fcdf62acd3d5563f5d9e3905">onDisconnect</a>(<span class="keywordtype">void</span>);
<a name="l01580"></a>01580 
<a name="l01585"></a>01585         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#6e2788cfba0b31813d4cab891f7e1feb">onPolling</a>(<span class="keywordtype">void</span>);
<a name="l01586"></a>01586 
<a name="l01593"></a>01593         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#3db7c01850d939ca1bb0fdc67aeb3efa">onSignal</a>(<span class="keywordtype">int</span>);
<a name="l01594"></a>01594         
<a name="l01607"></a>01607         <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#d9c8ffa69fec8c3a139fe3d7068667a0">setTimer</a>(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer, <span class="keywordtype">bool</span> periodic = <span class="keyword">false</span>);
<a name="l01608"></a>01608         
<a name="l01615"></a>01615         <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> <a class="code" href="classost_1_1_posix_thread.html#79beb0fde40ee5073fe6468de94eef05">getTimer</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l01616"></a>01616         
<a name="l01622"></a>01622         <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#ed0f4cae60e5694960260d13664c1367">endTimer</a>(<span class="keywordtype">void</span>);
<a name="l01623"></a>01623 
<a name="l01624"></a>01624 <span class="preprocessor">#if defined(HAVE_SIGWAIT) || defined(HAVE_SIGWAIT2)     </span>
<a name="l01625"></a>01625 <span class="preprocessor"></span>
<a name="l01631"></a>01631         <span class="keywordtype">void</span> waitSignal(<a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo);
<a name="l01632"></a>01632 <span class="preprocessor">#endif</span>
<a name="l01633"></a>01633 <span class="preprocessor"></span>        
<a name="l01640"></a>01640         <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#b665136ffddf808ab652c51f9caa953c">setSignal</a>(<span class="keywordtype">int</span> signo, <span class="keywordtype">bool</span> active);
<a name="l01641"></a>01641 
<a name="l01648"></a>01648         pthread_attr_t *<a class="code" href="classost_1_1_posix_thread.html#e7b26aaccd916f0905a30707d7ef4067">getPthreadAttrPtr</a>(<span class="keywordtype">void</span>);
<a name="l01649"></a>01649 
<a name="l01654"></a>01654         pthread_t <a class="code" href="classost_1_1_posix_thread.html#f114ce4574592143ef016dd9cd2bd11d">getPthreadId</a>(<span class="keywordtype">void</span>);
<a name="l01655"></a>01655 
<a name="l01656"></a>01656 <span class="keyword">public</span>:
<a name="l01657"></a>01657 
<a name="l01658"></a>01658         <a class="code" href="classost_1_1_posix_thread.html#eeba18c7e3ef9f718b20b7477e602735">PosixThread</a>(<span class="keywordtype">int</span> pri = 0, size_t stack = 0);
<a name="l01659"></a>01659         
<a name="l01665"></a><a class="code" href="classost_1_1_posix_thread.html#fa168ff1446785a43b1123703d999207">01665</a>         <span class="keyword">inline</span> <span class="keywordtype">void</span> signalThread(<span class="keywordtype">int</span> signo)
<a name="l01666"></a>01666                 {signalThread(<span class="keyword">this</span>, signo);};
<a name="l01667"></a>01667 
<a name="l01674"></a>01674         <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#67e582aabcd65431a38ecc8cbf0af350">sigInstall</a>(<span class="keywordtype">int</span> signo);
<a name="l01675"></a>01675 };
<a name="l01676"></a>01676 <span class="preprocessor">#endif</span>
<a name="l01677"></a>01677 <span class="preprocessor"></span>
<a name="l01692"></a><a class="code" href="classost_1_1_thread_key.html">01692</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="namespaceost.html#1a0b31279d4e241eba24d251d1682176">ThreadKey</a>
<a name="l01693"></a>01693 {
<a name="l01694"></a>01694 <span class="keyword">private</span>:
<a name="l01695"></a>01695 <span class="preprocessor">#ifndef WIN32</span>
<a name="l01696"></a>01696 <span class="preprocessor"></span>        pthread_key_t key;
<a name="l01697"></a>01697         <span class="keyword">typedef</span> void (*TDestruct)(<span class="keywordtype">void</span>*);
<a name="l01698"></a><a class="code" href="classost_1_1_thread_key.html#e3c1cdb20d70b22a5c0bf395614eefff">01698</a>         <span class="keyword">friend</span> <span class="keyword">class </span>ThreadImpl;
<a name="l01699"></a>01699         <a class="code" href="namespaceost.html#1a0b31279d4e241eba24d251d1682176">ThreadKey</a>(TDestruct destruct);
<a name="l01700"></a>01700 <span class="preprocessor">#else</span>
<a name="l01701"></a>01701 <span class="preprocessor"></span>        DWORD   key;
<a name="l01702"></a>01702 <span class="preprocessor">#endif</span>
<a name="l01703"></a>01703 <span class="preprocessor"></span>
<a name="l01704"></a>01704 <span class="keyword">public</span>:
<a name="l01708"></a>01708         <a class="code" href="namespaceost.html#1a0b31279d4e241eba24d251d1682176">ThreadKey</a>();
<a name="l01709"></a>01709 
<a name="l01713"></a>01713         <span class="keyword">virtual</span> ~<a class="code" href="namespaceost.html#1a0b31279d4e241eba24d251d1682176">ThreadKey</a>();
<a name="l01714"></a>01714 
<a name="l01722"></a>01722         <span class="keywordtype">void</span> *getKey(<span class="keywordtype">void</span>);
<a name="l01723"></a>01723 
<a name="l01731"></a>01731         <span class="keywordtype">void</span> setKey(<span class="keywordtype">void</span> *);
<a name="l01732"></a>01732 };
<a name="l01733"></a>01733 
<a name="l01744"></a><a class="code" href="classost_1_1_timer_port.html">01744</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> TimerPort
<a name="l01745"></a>01745 {
<a name="l01746"></a>01746 <span class="preprocessor">#ifndef WIN32</span>
<a name="l01747"></a>01747 <span class="preprocessor"></span>        <span class="keyword">struct </span>timeval timer;
<a name="l01748"></a>01748 <span class="preprocessor">#else</span>
<a name="l01749"></a>01749 <span class="preprocessor"></span>        DWORD timer;
<a name="l01750"></a>01750 <span class="preprocessor">#endif</span>
<a name="l01751"></a>01751 <span class="preprocessor"></span>        <span class="keywordtype">bool</span> active;
<a name="l01752"></a>01752 
<a name="l01753"></a>01753 <span class="keyword">public</span>:
<a name="l01760"></a>01760         TimerPort();
<a name="l01761"></a>01761 
<a name="l01770"></a>01770         <span class="keywordtype">void</span> setTimer(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout = 0);
<a name="l01771"></a>01771 
<a name="l01781"></a>01781         <span class="keywordtype">void</span> incTimer(<a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout);
<a name="l01782"></a>01782 
<a name="l01788"></a>01788         <span class="keywordtype">void</span> endTimer(<span class="keywordtype">void</span>);
<a name="l01789"></a>01789 
<a name="l01801"></a>01801         <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> getTimer(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l01802"></a>01802 
<a name="l01812"></a>01812         <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> getElapsed(<span class="keywordtype">void</span>) <span class="keyword">const</span>;
<a name="l01813"></a>01813 };
<a name="l01814"></a>01814 
<a name="l01815"></a>01815 
<a name="l01816"></a>01816 
<a name="l01817"></a>01817 <span class="comment">// FIXME: not in win32 implementation</span>
<a name="l01818"></a>01818 <span class="preprocessor">#if !defined(WIN32)</span>
<a name="l01819"></a>01819 <span class="preprocessor"></span>
<a name="l01820"></a>01820 <span class="comment">// FIXME: private declaration ???</span>
<a name="l01821"></a>01821 <span class="keyword">struct  </span>timespec *<a class="code" href="namespaceost.html#8fd139f80e945ac6d8cc53868cdacca6">getTimeout</a>(<span class="keyword">struct</span> timespec *spec, <a class="code" href="thread_8h.html#f412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); 
<a name="l01822"></a>01822 
<a name="l01823"></a>01823 <span class="preprocessor">#if !defined(__CYGWIN32__) &amp;&amp; !defined(__MINGW32__)</span>
<a name="l01824"></a>01824 <span class="preprocessor"></span><span class="keywordtype">void</span>    <a class="code" href="namespaceost.html#24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="namespaceost.html#5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo);
<a name="l01825"></a>01825 <span class="preprocessor">#endif</span>
<a name="l01826"></a>01826 <span class="preprocessor"></span>
<a name="l01827"></a>01827 <span class="preprocessor">#endif // !WIN32</span>
<a name="l01828"></a>01828 <span class="preprocessor"></span>
<a name="l01829"></a>01829 <span class="preprocessor">#ifdef USE_POLL</span>
<a name="l01830"></a>01830 <span class="preprocessor"></span>
<a name="l01838"></a>01838 <span class="keyword">class </span>Poller 
<a name="l01839"></a>01839 {
<a name="l01840"></a>01840 <span class="keyword">private</span>:
<a name="l01841"></a>01841         <span class="keywordtype">int</span> nufds;
<a name="l01842"></a>01842         pollfd *ufds;
<a name="l01843"></a>01843 
<a name="l01844"></a>01844 <span class="keyword">public</span>:
<a name="l01845"></a>01845         Poller();
<a name="l01846"></a>01846 
<a name="l01847"></a>01847         <span class="keyword">virtual</span> ~Poller();
<a name="l01848"></a>01848 
<a name="l01856"></a>01856         pollfd *getList(<span class="keywordtype">int</span> cnt);
<a name="l01857"></a>01857 
<a name="l01863"></a>01863         <span class="keyword">inline</span>  pollfd *getList(<span class="keywordtype">void</span>)
<a name="l01864"></a>01864                 {<span class="keywordflow">return</span> ufds;};
<a name="l01865"></a>01865 };
<a name="l01866"></a>01866 <span class="preprocessor">#endif</span>
<a name="l01867"></a>01867 <span class="preprocessor"></span>
<a name="l01868"></a><a class="code" href="namespaceost.html#99c7f7d02b00922b0f5ee62fc3bb75fd">01868</a> <span class="keyword">inline</span> <a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a> *<a class="code" href="namespaceost.html#99c7f7d02b00922b0f5ee62fc3bb75fd">getThread</a>(<span class="keywordtype">void</span>)
<a name="l01869"></a>01869         {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_thread.html#aad41a9f7962bdc3058a429df48246fd">Thread::get</a>();}
<a name="l01870"></a>01870 
<a name="l01900"></a><a class="code" href="classost_1_1_sys_time.html">01900</a> <span class="keyword">class </span><a class="code" href="config_8h.html#d10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> SysTime
<a name="l01901"></a>01901 {
<a name="l01902"></a>01902 <span class="keyword">private</span>:
<a name="l01903"></a>01903                 <span class="keyword">static</span> Mutex timeLock;
<a name="l01904"></a>01904 
<a name="l01905"></a>01905 <span class="keyword">protected</span>:
<a name="l01906"></a><a class="code" href="classost_1_1_sys_time.html#9c5b33e9cabc7f1510653dbd1f6eb0ae">01906</a>                 <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> lock(<span class="keywordtype">void</span>)
<a name="l01907"></a>01907                         {timeLock.enterMutex();}
<a name="l01908"></a>01908 
<a name="l01909"></a><a class="code" href="classost_1_1_sys_time.html#0d75e27d952de65d6e46b38e57ba605d">01909</a>                 <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>)
<a name="l01910"></a>01910                         {timeLock.leaveMutex();}
<a name="l01911"></a>01911 
<a name="l01912"></a>01912 <span class="keyword">public</span>:
<a name="l01913"></a>01913         <span class="keyword">static</span> time_t getTime(time_t *tloc = NULL);
<a name="l01914"></a><a class="code" href="classost_1_1_sys_time.html#ccb0dc3c9d64b224e47649211dbe7b64">01914</a>         <span class="keyword">static</span> time_t time(time_t *tloc) 
<a name="l01915"></a>01915                         { <span class="keywordflow">return</span> getTime(tloc); };
<a name="l01916"></a>01916 
<a name="l01917"></a>01917         <span class="keyword">static</span> <span class="keywordtype">int</span> getTimeOfDay(<span class="keyword">struct</span> timeval *tp);
<a name="l01918"></a><a class="code" href="classost_1_1_sys_time.html#fc403fcaa5a8ebf81528a34e5d5a1fac">01918</a>         <span class="keyword">static</span> <span class="keywordtype">int</span> gettimeofday(<span class="keyword">struct</span> timeval *tp, <span class="keyword">struct</span> timezone *)
<a name="l01919"></a>01919                         { <span class="keywordflow">return</span> getTimeOfDay(tp); };
<a name="l01920"></a>01920         
<a name="l01921"></a>01921         <span class="keyword">static</span> <span class="keyword">struct </span>tm *getLocalTime(<span class="keyword">const</span> time_t *clock, <span class="keyword">struct</span> tm *result);
<a name="l01922"></a><a class="code" href="classost_1_1_sys_time.html#f4bd7e44705486a2f0cee2cb98b2f975">01922</a>         <span class="keyword">static</span> <span class="keyword">struct </span>tm *locatime(<span class="keyword">const</span> time_t *clock, <span class="keyword">struct</span> tm *result)
<a name="l01923"></a>01923                         { <span class="keywordflow">return</span> getLocalTime(clock, result); };
<a name="l01924"></a>01924 
<a name="l01925"></a>01925                 <span class="keyword">static</span> <span class="keyword">struct </span>tm *getGMTTime(<span class="keyword">const</span> time_t *clock, <span class="keyword">struct</span> tm *result);
<a name="l01926"></a><a class="code" href="classost_1_1_sys_time.html#1852b1563a7b8f2b96ab75bafe3948eb">01926</a>                 <span class="keyword">static</span> <span class="keyword">struct </span>tm *gmtime(<span class="keyword">const</span> time_t *clock, <span class="keyword">struct</span> tm *result)
<a name="l01927"></a>01927                         { <span class="keywordflow">return</span> getGMTTime(clock, result);};
<a name="l01928"></a>01928 }; 
<a name="l01929"></a>01929 
<a name="l01930"></a>01930 <span class="preprocessor">#ifndef HAVE_LOCALTIME_R</span>
<a name="l01931"></a>01931 <span class="preprocessor"></span>
<a name="l01932"></a><a class="code" href="namespaceost.html#2532506cb80f89403523d977ef6c2345">01932</a> <span class="keyword">inline</span> <span class="keyword">struct </span>tm *<a class="code" href="namespaceost.html#2532506cb80f89403523d977ef6c2345">localtime_r</a>(<span class="keyword">const</span> time_t *t, <span class="keyword">struct</span> tm *b)
<a name="l01933"></a>01933         {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_sys_time.html#c39180f2c7b282d0145134d14a288480">SysTime::getLocalTime</a>(t, b);};
<a name="l01934"></a><a class="code" href="namespaceost.html#1951b0e03ecb3bf227e19855d3a1f11a">01934</a> <span class="keyword">inline</span> <span class="keywordtype">char</span> *<a class="code" href="namespaceost.html#1951b0e03ecb3bf227e19855d3a1f11a">ctime_r</a>(<span class="keyword">const</span> time_t *t, <span class="keywordtype">char</span> *buf)
<a name="l01935"></a>01935         {<span class="keywordflow">return</span> ctime(t);};
<a name="l01936"></a><a class="code" href="namespaceost.html#64c9138a1bf7a0d56fc8060fa1e4552c">01936</a> <span class="keyword">inline</span> <span class="keyword">struct </span>tm *<a class="code" href="namespaceost.html#64c9138a1bf7a0d56fc8060fa1e4552c">gmtime_r</a>(<span class="keyword">const</span> time_t *t, <span class="keyword">struct</span> tm *b) \
<a name="l01937"></a>01937 {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_sys_time.html#0da1e5fefac7161a878daed011e79932">SysTime::getGMTTime</a>(t, b);};
<a name="l01938"></a><a class="code" href="namespaceost.html#6d84108739f29b7fbc773f1a57a3a439">01938</a> <span class="keyword">inline</span> <span class="keywordtype">char</span> *<a class="code" href="namespaceost.html#6d84108739f29b7fbc773f1a57a3a439">asctime_r</a>(<span class="keyword">const</span> <span class="keyword">struct</span> tm *tm, <span class="keywordtype">char</span> *b) \
<a name="l01939"></a>01939         {<span class="keywordflow">return</span> asctime(tm);};
<a name="l01940"></a>01940 
<a name="l01941"></a>01941 <span class="preprocessor">#endif </span>
<a name="l01942"></a>01942 <span class="preprocessor"></span>        
<a name="l01943"></a>01943 <span class="preprocessor">#ifdef  CCXX_NAMESPACES</span>
<a name="l01944"></a>01944 <span class="preprocessor"></span>}
<a name="l01945"></a>01945 <span class="preprocessor">#endif</span>
<a name="l01946"></a>01946 <span class="preprocessor"></span>
<a name="l01947"></a>01947 <span class="preprocessor">#endif</span>
<a name="l01948"></a>01948 <span class="preprocessor"></span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Jun 19 10:50:55 2006 for GNU CommonC++ by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
</body>
</html>