<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>GNU CommonC++: thread.h Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.6.3 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="annotated.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</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 List</span></a></li> <li><a href="globals.html"><span>File 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">// Copyright (C) 2006-2008 David Sugar, Tycho Softworks.</span> <a name="l00003"></a>00003 <span class="comment">//</span> <a name="l00004"></a>00004 <span class="comment">// This program is free software; you can redistribute it and/or modify</span> <a name="l00005"></a>00005 <span class="comment">// it under the terms of the GNU General Public License as published by</span> <a name="l00006"></a>00006 <span class="comment">// the Free Software Foundation; either version 2 of the License, or</span> <a name="l00007"></a>00007 <span class="comment">// (at your option) any later version.</span> <a name="l00008"></a>00008 <span class="comment">//</span> <a name="l00009"></a>00009 <span class="comment">// This program is distributed in the hope that it will be useful,</span> <a name="l00010"></a>00010 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00011"></a>00011 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span> <a name="l00012"></a>00012 <span class="comment">// GNU General Public License for more details.</span> <a name="l00013"></a>00013 <span class="comment">//</span> <a name="l00014"></a>00014 <span class="comment">// You should have received a copy of the GNU General Public License</span> <a name="l00015"></a>00015 <span class="comment">// along with this program; if not, write to the Free Software</span> <a name="l00016"></a>00016 <span class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span> <a name="l00017"></a>00017 <span class="comment">//</span> <a name="l00018"></a>00018 <span class="comment">// As a special exception, you may use this file as part of a free software</span> <a name="l00019"></a>00019 <span class="comment">// library without restriction. Specifically, if other files instantiate</span> <a name="l00020"></a>00020 <span class="comment">// templates or use macros or inline functions from this file, or you compile</span> <a name="l00021"></a>00021 <span class="comment">// this file and link it with other files to produce an executable, this</span> <a name="l00022"></a>00022 <span class="comment">// file does not by itself cause the resulting executable to be covered by</span> <a name="l00023"></a>00023 <span class="comment">// the GNU General Public License. This exception does not however</span> <a name="l00024"></a>00024 <span class="comment">// invalidate any other reasons why the executable file might be covered by</span> <a name="l00025"></a>00025 <span class="comment">// the GNU General Public License.</span> <a name="l00026"></a>00026 <span class="comment">//</span> <a name="l00027"></a>00027 <span class="comment">// This exception applies only to the code released under the name GNU</span> <a name="l00028"></a>00028 <span class="comment">// Common C++. If you copy code from other releases into a copy of GNU</span> <a name="l00029"></a>00029 <span class="comment">// Common C++, as the General Public License permits, the exception does</span> <a name="l00030"></a>00030 <span class="comment">// not apply to the code that you add in this way. To avoid misleading</span> <a name="l00031"></a>00031 <span class="comment">// anyone as to the status of such modified files, you must delete</span> <a name="l00032"></a>00032 <span class="comment">// this exception notice from them.</span> <a name="l00033"></a>00033 <span class="comment">//</span> <a name="l00034"></a>00034 <span class="comment">// If you write modifications of your own for GNU Common C++, it is your choice</span> <a name="l00035"></a>00035 <span class="comment">// whether to permit this exception to apply to your modifications.</span> <a name="l00036"></a>00036 <span class="comment">// If you do not wish that, delete this exception notice.</span> <a name="l00037"></a>00037 <span class="comment">//</span> <a name="l00038"></a>00038 <a name="l00044"></a>00044 <span class="preprocessor">#ifndef CCXX_THREAD_H_</span> <a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define CCXX_THREAD_H_</span> <a name="l00046"></a>00046 <span class="preprocessor"></span> <a name="l00047"></a>00047 <span class="preprocessor">#include <<a class="code" href="config_8h.html">cc++/config.h</a>></span> <a name="l00048"></a>00048 <a name="l00049"></a>00049 <span class="preprocessor">#ifndef CCXX_STRING_H_</span> <a name="l00050"></a>00050 <span class="preprocessor"></span><span class="preprocessor">#include <<a class="code" href="string_8h.html" title="Common C++ generic string class.">cc++/string.h</a>></span> <a name="l00051"></a>00051 <span class="preprocessor">#endif</span> <a name="l00052"></a>00052 <span class="preprocessor"></span> <a name="l00053"></a>00053 <span class="preprocessor">#ifndef WIN32</span> <a name="l00054"></a><a class="code" href="thread_8h.html#a9fc514088fa3739a1300ce30ca6585d5">00054</a> <span class="preprocessor"></span><span class="preprocessor">#define CCXX_POSIX</span> <a name="l00055"></a>00055 <span class="preprocessor"></span><span class="preprocessor">#endif // !WIN32</span> <a name="l00056"></a>00056 <span class="preprocessor"></span> <a name="l00057"></a>00057 <span class="preprocessor">#include <ctime></span> <a name="l00058"></a>00058 <a name="l00059"></a>00059 <span class="preprocessor">#ifndef WIN32</span> <a name="l00060"></a>00060 <span class="preprocessor"></span><span class="preprocessor">#include <pthread.h></span> <a name="l00061"></a>00061 <span class="preprocessor">#endif // !WIN32</span> <a name="l00062"></a>00062 <span class="preprocessor"></span> <a name="l00063"></a>00063 <span class="preprocessor">#undef CCXX_USE_WIN32_ATOMIC</span> <a name="l00064"></a>00064 <span class="preprocessor"></span><span class="preprocessor">#ifndef WIN32</span> <a name="l00065"></a>00065 <span class="preprocessor"></span><span class="preprocessor">#include <time.h></span> <a name="l00066"></a>00066 <span class="preprocessor">#include <signal.h></span> <a name="l00067"></a>00067 <span class="preprocessor">#include <unistd.h></span> <a name="l00068"></a>00068 <a name="l00069"></a>00069 <span class="preprocessor">#ifdef _THR_UNIXWARE</span> <a name="l00070"></a>00070 <span class="preprocessor"></span><span class="preprocessor">#undef PTHREAD_MUTEXTYPE_RECURSIVE</span> <a name="l00071"></a>00071 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00072"></a>00072 <span class="preprocessor"></span> <a name="l00073"></a><a class="code" href="thread_8h.html#a3f0d0226a694bf1e508e1b1c758e6ae6">00073</a> <span class="keyword">typedef</span> pthread_t <a class="code" href="thread_8h.html#a3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a>; <a name="l00074"></a><a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">00074</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a>; <a name="l00075"></a>00075 <a name="l00076"></a>00076 <span class="comment">/*</span> <a name="l00077"></a>00077 <span class="comment">#if defined(__CYGWIN32__)</span> <a name="l00078"></a>00078 <span class="comment">__declspec(dllimport) long __stdcall InterlockedIncrement(long *);</span> <a name="l00079"></a>00079 <span class="comment">__declspec(dllimport) long __stdcall InterlockedDecrement(long *);</span> <a name="l00080"></a>00080 <span class="comment">__declspec(dllimport) long __stdcall InterlockedExchange(long *, long);</span> <a name="l00081"></a>00081 <span class="comment">#define CCXX_USE_WIN32_ATOMIC 1</span> <a name="l00082"></a>00082 <span class="comment">#endif</span> <a name="l00083"></a>00083 <span class="comment">*/</span> <a name="l00084"></a>00084 <a name="l00085"></a>00085 <span class="preprocessor">#else // WIN32</span> <a name="l00086"></a>00086 <span class="preprocessor"></span><span class="keyword">typedef</span> DWORD <a class="code" href="thread_8h.html#a3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a>; <a name="l00087"></a>00087 <span class="keyword">typedef</span> DWORD <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a>; <a name="l00088"></a>00088 <a name="l00089"></a>00089 <span class="preprocessor">#define MAX_SEM_VALUE 1000000</span> <a name="l00090"></a>00090 <span class="preprocessor"></span><span class="preprocessor">#define CCXX_USE_WIN32_ATOMIC 1</span> <a name="l00091"></a>00091 <span class="preprocessor"></span> <a name="l00092"></a>00092 <span class="preprocessor">#endif // !WIN32</span> <a name="l00093"></a>00093 <span class="preprocessor"></span> <a name="l00094"></a>00094 <span class="preprocessor">#ifdef HAVE_GCC_CXX_BITS_ATOMIC</span> <a name="l00095"></a>00095 <span class="preprocessor"></span><span class="preprocessor">#include <ios></span> <a name="l00096"></a>00096 <span class="preprocessor">#endif</span> <a name="l00097"></a>00097 <span class="preprocessor"></span> <a name="l00098"></a>00098 <span class="preprocessor">#ifdef CCXX_NAMESPACES</span> <a name="l00099"></a>00099 <span class="preprocessor"></span><span class="keyword">namespace </span>ost { <a name="l00100"></a>00100 <span class="preprocessor">#ifdef __BORLANDC__</span> <a name="l00101"></a>00101 <span class="preprocessor"></span><span class="preprocessor"># if __BORLANDC__ >= 0x0560</span> <a name="l00102"></a>00102 <span class="preprocessor"></span><span class="keyword">using</span> std::time_t; <a name="l00103"></a>00103 <span class="keyword">using</span> std::tm; <a name="l00104"></a>00104 <span class="preprocessor"># endif</span> <a name="l00105"></a>00105 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00106"></a>00106 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00107"></a>00107 <span class="preprocessor"></span> <a name="l00108"></a>00108 <span class="preprocessor">#ifdef HAVE_GCC_CXX_BITS_ATOMIC</span> <a name="l00109"></a>00109 <span class="preprocessor"></span><span class="keyword">using namespace </span>__gnu_cxx; <a name="l00110"></a>00110 <span class="preprocessor">#endif</span> <a name="l00111"></a>00111 <span class="preprocessor"></span> <a name="l00112"></a>00112 <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Thread; <a name="l00113"></a>00113 <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> ThreadKey; <a name="l00114"></a>00114 <a name="l00115"></a><a class="code" href="thread_8h.html#a74f2d4c747bce0b8f7f7c1f48e651876">00115</a> <span class="preprocessor">#define TIMEOUT_INF ~((timeout_t) 0)</span> <a name="l00116"></a>00116 <span class="preprocessor"></span> <a name="l00117"></a><a class="code" href="thread_8h.html#a9d5589bc014dcec626ff198d5c9370cd">00117</a> <span class="preprocessor">#define ENTER_CRITICAL enterMutex();</span> <a name="l00118"></a><a class="code" href="thread_8h.html#af1b76aeceb2370c5fcedee46f9cd3d09">00118</a> <span class="preprocessor"></span><span class="preprocessor">#define LEAVE_CRITICAL leaveMutex();</span> <a name="l00119"></a><a class="code" href="thread_8h.html#a61438c8055883ef92ffb09c68f70f049">00119</a> <span class="preprocessor"></span><span class="preprocessor">#define ENTER_DEFERRED setCancel(cancelDeferred);</span> <a name="l00120"></a><a class="code" href="thread_8h.html#ac6e53238dd0519d7c7117b2b40d4312b">00120</a> <span class="preprocessor"></span><span class="preprocessor">#define LEAVE_DEFERRED setCancel(cancelImmediate);</span> <a name="l00121"></a>00121 <span class="preprocessor"></span> <a name="l00122"></a>00122 <span class="preprocessor">#ifndef WIN32</span> <a name="l00123"></a>00123 <span class="preprocessor"></span><span class="comment">// These macros override common functions with thread-safe versions. In</span> <a name="l00124"></a>00124 <span class="comment">// particular the common "libc" sleep() has problems since it normally</span> <a name="l00125"></a>00125 <span class="comment">// uses SIGARLM (as actually defined by "posix"). The pthread_delay and</span> <a name="l00126"></a>00126 <span class="comment">// usleep found in libpthread are gaurenteed not to use SIGALRM and offer</span> <a name="l00127"></a>00127 <span class="comment">// higher resolution. psleep() is defined to call the old process sleep.</span> <a name="l00128"></a>00128 <a name="l00129"></a>00129 <span class="preprocessor">#undef sleep</span> <a name="l00130"></a><a class="code" href="thread_8h.html#a5e09ab8cba99b274fd420bd76f39b205">00130</a> <span class="preprocessor"></span><span class="preprocessor">#define psleep(x) (sleep)(x)</span> <a name="l00131"></a>00131 <span class="preprocessor"></span> <a name="l00132"></a>00132 <span class="preprocessor">#ifdef signal</span> <a name="l00133"></a>00133 <span class="preprocessor"></span><span class="preprocessor">#undef signal</span> <a name="l00134"></a>00134 <span class="preprocessor"></span><span class="preprocessor">#endif</span> <a name="l00135"></a>00135 <span class="preprocessor"></span> <a name="l00136"></a>00136 <span class="preprocessor">#endif // !WIN32</span> <a name="l00137"></a>00137 <span class="preprocessor"></span> <a name="l00138"></a>00138 <span class="preprocessor">#undef Yield</span> <a name="l00139"></a>00139 <span class="preprocessor"></span> <a name="l00140"></a>00140 <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Conditional; <a name="l00141"></a>00141 <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Event; <a name="l00142"></a>00142 <a name="l00186"></a><a class="code" href="classost_1_1_mutex.html">00186</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a> <a name="l00187"></a>00187 { <a name="l00188"></a>00188 <span class="keyword">private</span>: <a name="l00189"></a>00189 <span class="keyword">static</span> <span class="keywordtype">bool</span> _debug; <a name="l00190"></a>00190 <a class="code" href="classost_1_1_string.html" title="This is a generic and portable string class.">String</a> _name; <a name="l00191"></a>00191 <span class="preprocessor">#ifndef WIN32</span> <a name="l00192"></a>00192 <span class="preprocessor"></span><span class="preprocessor">#ifndef PTHREAD_MUTEXTYPE_RECURSIVE</span> <a name="l00193"></a>00193 <span class="preprocessor"></span> <span class="keywordtype">int</span> <span class="keyword">volatile</span> _level; <a name="l00194"></a>00194 Thread *<span class="keyword">volatile</span> _tid; <a name="l00195"></a>00195 <span class="preprocessor">#endif</span> <a name="l00196"></a>00196 <span class="preprocessor"></span> <span class="comment">/*</span> <a name="l00197"></a>00197 <span class="comment"> * Pthread mutex object. This is protected rather than private</span> <a name="l00198"></a>00198 <span class="comment"> * because some mixed mode pthread operations require a mutex as</span> <a name="l00199"></a>00199 <span class="comment"> * well as their primary pthread object. A good example of this</span> <a name="l00200"></a>00200 <span class="comment"> * is the Event class, as waiting on a conditional object must be</span> <a name="l00201"></a>00201 <span class="comment"> * associated with an accessable mutex. An alternative would be</span> <a name="l00202"></a>00202 <span class="comment"> * to make such classes "friend" classes of the Mutex.</span> <a name="l00203"></a>00203 <span class="comment"> */</span> <a name="l00204"></a>00204 pthread_mutex_t _mutex; <a name="l00205"></a>00205 <span class="preprocessor">#else // WIN32</span> <a name="l00206"></a>00206 <span class="preprocessor"></span> <a name="l00207"></a>00207 <span class="preprocessor"># if defined(MUTEX_UNDERGROUND_WIN32_MUTEX) && defined(MUTEX_UNDERGROUND_WIN32_CRITICALSECTION)</span> <a name="l00208"></a>00208 <span class="preprocessor"></span><span class="preprocessor"># error "Can't determine underground for Mutex"</span> <a name="l00209"></a>00209 <span class="preprocessor"></span><span class="preprocessor"># endif</span> <a name="l00210"></a>00210 <span class="preprocessor"></span> <a name="l00211"></a>00211 <span class="preprocessor">#ifdef MUTEX_UNDERGROUND_WIN32_MUTEX</span> <a name="l00212"></a>00212 <span class="preprocessor"></span> <a class="code" href="serial_8h.html#a069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> _mutex; <a name="l00213"></a>00213 <span class="preprocessor">#endif</span> <a name="l00214"></a>00214 <span class="preprocessor"></span><span class="preprocessor">#ifdef MUTEX_UNDERGROUND_WIN32_CRITICALSECTION</span> <a name="l00215"></a>00215 <span class="preprocessor"></span> CRITICAL_SECTION _criticalSection; <a name="l00216"></a>00216 <span class="preprocessor">#endif</span> <a name="l00217"></a>00217 <span class="preprocessor"></span> <a name="l00218"></a>00218 <span class="preprocessor">#endif // WIN32</span> <a name="l00219"></a>00219 <span class="preprocessor"></span> <a name="l00220"></a>00220 <span class="keyword">public</span>: <a name="l00226"></a>00226 <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name = NULL); <a name="l00227"></a>00227 <a name="l00233"></a>00233 <span class="keyword">virtual</span> ~<a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a>(); <a name="l00234"></a>00234 <a name="l00240"></a><a class="code" href="classost_1_1_mutex.html#a83b66f786e344b5192a3993d319aa735">00240</a> <span class="keyword">static</span> <span class="keywordtype">void</span> setDebug(<span class="keywordtype">bool</span> mode) <a name="l00241"></a>00241 {_debug = mode;}; <a name="l00242"></a>00242 <a name="l00248"></a><a class="code" href="classost_1_1_mutex.html#abed8b05b63f9cdd2c9ca1f92081b1a8a">00248</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="l00249"></a>00249 {_name = name;}; <a name="l00250"></a>00250 <a name="l00258"></a>00258 <span class="keywordtype">void</span> enterMutex(<span class="keywordtype">void</span>); <a name="l00259"></a>00259 <a name="l00263"></a><a class="code" href="classost_1_1_mutex.html#aecb516325583e432bf2bf7e4b565f6f6">00263</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> enter(<span class="keywordtype">void</span>) <a name="l00264"></a>00264 {enterMutex();}; <a name="l00265"></a>00265 <a name="l00269"></a><a class="code" href="classost_1_1_mutex.html#ab6aaecac9c95d31a5862014d7f1afe73">00269</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> leave(<span class="keywordtype">void</span>) <a name="l00270"></a>00270 {leaveMutex();}; <a name="l00271"></a>00271 <a name="l00277"></a><a class="code" href="classost_1_1_mutex.html#ac1ff5454b2c9b55790c4bf33f751704c">00277</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> test(<span class="keywordtype">void</span>) <a name="l00278"></a>00278 {<span class="keywordflow">return</span> tryEnterMutex();}; <a name="l00279"></a>00279 <a name="l00290"></a>00290 <span class="keywordtype">bool</span> tryEnterMutex(<span class="keywordtype">void</span>); <a name="l00291"></a>00291 <a name="l00302"></a>00302 <span class="keywordtype">void</span> leaveMutex(<span class="keywordtype">void</span>); <a name="l00303"></a>00303 }; <a name="l00304"></a>00304 <a name="l00328"></a><a class="code" href="classost_1_1_mutex_lock.html">00328</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_mutex_lock.html" title="The MutexLock class is used to protect a section of code so that at any given time...">MutexLock</a> <a name="l00329"></a>00329 { <a name="l00330"></a>00330 <span class="keyword">private</span>: <a name="l00331"></a>00331 <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a>& mutex; <a name="l00332"></a>00332 <span class="keyword">public</span>: <a name="l00338"></a><a class="code" href="classost_1_1_mutex_lock.html#aedb21cfad9b0f1200d055fb69efa2546">00338</a> <a class="code" href="classost_1_1_mutex_lock.html" title="The MutexLock class is used to protect a section of code so that at any given time...">MutexLock</a>( <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a>& _mutex ) : mutex( _mutex ) <a name="l00339"></a>00339 { mutex.enterMutex(); } <a name="l00340"></a>00340 <a name="l00344"></a>00344 <span class="comment">// this should be not-virtual</span> <a name="l00345"></a><a class="code" href="classost_1_1_mutex_lock.html#a58bba3406d89b40c8bd3e9ac389b920c">00345</a> ~<a class="code" href="classost_1_1_mutex_lock.html" title="The MutexLock class is used to protect a section of code so that at any given time...">MutexLock</a>() <a name="l00346"></a>00346 { mutex.leaveMutex(); } <a name="l00347"></a>00347 }; <a name="l00348"></a>00348 <a name="l00357"></a><a class="code" href="classost_1_1_thread_lock.html">00357</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a> <a name="l00358"></a>00358 { <a name="l00359"></a>00359 <span class="keyword">private</span>: <a name="l00360"></a>00360 <span class="preprocessor">#ifdef HAVE_PTHREAD_RWLOCK</span> <a name="l00361"></a>00361 <span class="preprocessor"></span> pthread_rwlock_t _lock; <a name="l00362"></a>00362 <span class="preprocessor">#else</span> <a name="l00363"></a>00363 <span class="preprocessor"></span> <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a> mutex; <a name="l00364"></a>00364 <span class="preprocessor">#endif</span> <a name="l00365"></a>00365 <span class="preprocessor"></span> <a name="l00366"></a>00366 <span class="keyword">public</span>: <a name="l00370"></a>00370 <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>(); <a name="l00371"></a>00371 <a name="l00375"></a>00375 <span class="keyword">virtual</span> ~<a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>(); <a name="l00376"></a>00376 <a name="l00380"></a>00380 <span class="keywordtype">void</span> readLock(<span class="keywordtype">void</span>); <a name="l00381"></a>00381 <a name="l00385"></a>00385 <span class="keywordtype">void</span> writeLock(<span class="keywordtype">void</span>); <a name="l00386"></a>00386 <a name="l00392"></a>00392 <span class="keywordtype">bool</span> tryReadLock(<span class="keywordtype">void</span>); <a name="l00393"></a>00393 <a name="l00399"></a>00399 <span class="keywordtype">bool</span> tryWriteLock(<span class="keywordtype">void</span>); <a name="l00400"></a>00400 <a name="l00404"></a>00404 <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>); <a name="l00405"></a>00405 }; <a name="l00406"></a>00406 <a name="l00427"></a><a class="code" href="classost_1_1_read_lock.html">00427</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_read_lock.html" title="The ReadLock class is used to protect a section of code through a ThreadLock for...">ReadLock</a> <a name="l00428"></a>00428 { <a name="l00429"></a>00429 <span class="keyword">private</span>: <a name="l00430"></a>00430 <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>& tl; <a name="l00431"></a>00431 <a name="l00432"></a>00432 <span class="keyword">public</span>: <a name="l00438"></a><a class="code" href="classost_1_1_read_lock.html#a05b7c96baf6695c580871d0aaf01c149">00438</a> <a class="code" href="classost_1_1_read_lock.html" title="The ReadLock class is used to protect a section of code through a ThreadLock for...">ReadLock</a>( <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>& _tl ) : tl( _tl ) <a name="l00439"></a>00439 { tl.readLock(); } <a name="l00443"></a>00443 <span class="comment">// this should be not-virtual</span> <a name="l00444"></a><a class="code" href="classost_1_1_read_lock.html#a166b6a55b9fa7072be782b7eccf30a98">00444</a> ~<a class="code" href="classost_1_1_read_lock.html" title="The ReadLock class is used to protect a section of code through a ThreadLock for...">ReadLock</a>() <a name="l00445"></a>00445 { tl.unlock(); } <a name="l00446"></a>00446 }; <a name="l00447"></a>00447 <a name="l00468"></a><a class="code" href="classost_1_1_write_lock.html">00468</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_write_lock.html" title="The WriteLock class is used to protect a section of code through a ThreadLock for...">WriteLock</a> <a name="l00469"></a>00469 { <a name="l00470"></a>00470 <span class="keyword">private</span>: <a name="l00471"></a>00471 <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>& tl; <a name="l00472"></a>00472 <a name="l00473"></a>00473 <span class="keyword">public</span>: <a name="l00479"></a><a class="code" href="classost_1_1_write_lock.html#a93a59b1f5f09dfdaee18eca85759f86e">00479</a> <a class="code" href="classost_1_1_write_lock.html" title="The WriteLock class is used to protect a section of code through a ThreadLock for...">WriteLock</a>( <a class="code" href="classost_1_1_thread_lock.html" title="The ThreadLock class impliments a thread rwlock for optimal reader performance on...">ThreadLock</a>& _tl ) : tl( _tl ) <a name="l00480"></a>00480 { tl.writeLock(); } <a name="l00484"></a>00484 <span class="comment">// this should be not-virtual</span> <a name="l00485"></a><a class="code" href="classost_1_1_write_lock.html#a67a6fef0c02e06cbbf6069715c38cba5">00485</a> ~<a class="code" href="classost_1_1_write_lock.html" title="The WriteLock class is used to protect a section of code through a ThreadLock for...">WriteLock</a>() <a name="l00486"></a>00486 { tl.unlock(); } <a name="l00487"></a>00487 }; <a name="l00488"></a>00488 <a name="l00489"></a>00489 <a name="l00499"></a><a class="code" href="classost_1_1_mutex_counter.html">00499</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_mutex_counter.html" title="The Mutex Counter is a counter variable which can safely be incremented or decremented...">MutexCounter</a> : <span class="keyword">public</span> <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a> <a name="l00500"></a>00500 { <a name="l00501"></a>00501 <span class="keyword">private</span>: <a name="l00502"></a>00502 <span class="keyword">volatile</span> <span class="keywordtype">int</span> counter; <a name="l00503"></a>00503 <a name="l00504"></a>00504 <span class="keyword">public</span>: <a name="l00510"></a>00510 <a class="code" href="classost_1_1_mutex_counter.html" title="The Mutex Counter is a counter variable which can safely be incremented or decremented...">MutexCounter</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL); <a name="l00511"></a>00511 <a name="l00519"></a>00519 <a class="code" href="classost_1_1_mutex_counter.html" title="The Mutex Counter is a counter variable which can safely be incremented or decremented...">MutexCounter</a>(<span class="keywordtype">int</span> initial, <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL); <a name="l00520"></a>00520 <a name="l00521"></a>00521 <span class="keyword">friend</span> <a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <span class="keywordtype">int</span> operator++(<a class="code" href="classost_1_1_mutex_counter.html" title="The Mutex Counter is a counter variable which can safely be incremented or decremented...">MutexCounter</a> &mc); <a name="l00522"></a>00522 <span class="keyword">friend</span> <a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <span class="keywordtype">int</span> operator--(<a class="code" href="classost_1_1_mutex_counter.html" title="The Mutex Counter is a counter variable which can safely be incremented or decremented...">MutexCounter</a> &mc); <a name="l00523"></a>00523 }; <a name="l00524"></a>00524 <a name="l00535"></a><a class="code" href="classost_1_1_atomic_counter.html">00535</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a> <a name="l00536"></a>00536 { <a name="l00537"></a>00537 <span class="preprocessor">#ifndef CCXX_USE_WIN32_ATOMIC</span> <a name="l00538"></a>00538 <span class="preprocessor"></span><span class="keyword">private</span>: <a name="l00539"></a>00539 <span class="preprocessor">#if defined(HAVE_ATOMIC_AIX)</span> <a name="l00540"></a>00540 <span class="preprocessor"></span> <span class="keyword">volatile</span> <span class="keywordtype">int</span> counter; <a name="l00541"></a>00541 <span class="preprocessor">#elif defined(HAVE_GCC_BITS_ATOMIC)</span> <a name="l00542"></a>00542 <span class="preprocessor"></span> <span class="keyword">volatile</span> _Atomic_word counter; <a name="l00543"></a>00543 <span class="preprocessor">#elif defined(HAVE_GCC_CXX_BITS_ATOMIC)</span> <a name="l00544"></a>00544 <span class="preprocessor"></span> <span class="keyword">volatile</span> _Atomic_word counter; <a name="l00545"></a>00545 <span class="comment">// __gnu_cxx::_Atomic_word counter;</span> <a name="l00546"></a>00546 <span class="preprocessor">#elif defined(HAVE_ATOMIC)</span> <a name="l00547"></a>00547 <span class="preprocessor"></span> atomic_t atomic; <a name="l00548"></a>00548 <span class="preprocessor">#else</span> <a name="l00549"></a>00549 <span class="preprocessor"></span> <span class="keyword">volatile</span> <span class="keywordtype">int</span> counter; <a name="l00550"></a>00550 pthread_mutex_t _mutex; <a name="l00551"></a>00551 <span class="preprocessor">#endif</span> <a name="l00552"></a>00552 <span class="preprocessor"></span> <a name="l00553"></a>00553 <span class="keyword">public</span>: <a name="l00557"></a>00557 <a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a>(); <a name="l00558"></a>00558 <a name="l00564"></a>00564 <a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a>(<span class="keywordtype">int</span> value); <a name="l00565"></a>00565 <a name="l00566"></a>00566 ~<a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a>(); <a name="l00567"></a>00567 <a name="l00568"></a>00568 <span class="keywordtype">int</span> operator++(<span class="keywordtype">void</span>); <a name="l00569"></a>00569 <span class="keywordtype">int</span> operator--(<span class="keywordtype">void</span>); <a name="l00570"></a>00570 <span class="keywordtype">int</span> operator+=(<span class="keywordtype">int</span> change); <a name="l00571"></a>00571 <span class="keywordtype">int</span> operator-=(<span class="keywordtype">int</span> change); <a name="l00572"></a>00572 <span class="keywordtype">int</span> operator+(<span class="keywordtype">int</span> change); <a name="l00573"></a>00573 <span class="keywordtype">int</span> operator-(<span class="keywordtype">int</span> change); <a name="l00574"></a>00574 <span class="keywordtype">int</span> operator=(<span class="keywordtype">int</span> value); <a name="l00575"></a>00575 <span class="keywordtype">bool</span> operator!(<span class="keywordtype">void</span>); <a name="l00576"></a>00576 operator int(); <a name="l00577"></a>00577 <span class="preprocessor">#else</span> <a name="l00578"></a>00578 <span class="preprocessor"></span><span class="keyword">private</span>: <a name="l00579"></a>00579 <span class="keywordtype">long</span> atomic; <a name="l00580"></a>00580 <a name="l00581"></a>00581 <span class="keyword">public</span>: <a name="l00582"></a>00582 <span class="keyword">inline</span> <a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a>() <a name="l00583"></a>00583 {atomic = 0;}; <a name="l00584"></a>00584 <a name="l00585"></a>00585 <span class="keyword">inline</span> <a class="code" href="classost_1_1_atomic_counter.html" title="The AtomicCounter class offers thread-safe manipulation of an integer counter.">AtomicCounter</a>(<span class="keywordtype">int</span> value) <a name="l00586"></a>00586 {atomic = value;}; <a name="l00587"></a>00587 <a name="l00588"></a>00588 <span class="keyword">inline</span> <span class="keywordtype">int</span> operator++(<span class="keywordtype">void</span>) <a name="l00589"></a>00589 {<span class="keywordflow">return</span> InterlockedIncrement(&atomic);}; <a name="l00590"></a>00590 <a name="l00591"></a>00591 <span class="keyword">inline</span> <span class="keywordtype">int</span> operator--(<span class="keywordtype">void</span>) <a name="l00592"></a>00592 {<span class="keywordflow">return</span> InterlockedDecrement(&atomic);}; <a name="l00593"></a>00593 <a name="l00594"></a>00594 <span class="keywordtype">int</span> operator+=(<span class="keywordtype">int</span> change); <a name="l00595"></a>00595 <a name="l00596"></a>00596 <span class="keywordtype">int</span> operator-=(<span class="keywordtype">int</span> change); <a name="l00597"></a>00597 <a name="l00598"></a>00598 <span class="keyword">inline</span> <span class="keywordtype">int</span> operator+(<span class="keywordtype">int</span> change) <a name="l00599"></a>00599 {<span class="keywordflow">return</span> atomic + change;}; <a name="l00600"></a>00600 <a name="l00601"></a>00601 <span class="keyword">inline</span> <span class="keywordtype">int</span> operator-(<span class="keywordtype">int</span> change) <a name="l00602"></a>00602 {<span class="keywordflow">return</span> atomic - change;}; <a name="l00603"></a>00603 <a name="l00604"></a>00604 <span class="keyword">inline</span> <span class="keywordtype">int</span> operator=(<span class="keywordtype">int</span> value) <a name="l00605"></a>00605 {<span class="keywordflow">return</span> InterlockedExchange(&atomic, value);}; <a name="l00606"></a>00606 <a name="l00607"></a>00607 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!(<span class="keywordtype">void</span>) <a name="l00608"></a>00608 {<span class="keywordflow">return</span> (atomic == 0) ? <span class="keyword">true</span> : <span class="keyword">false</span>;}; <a name="l00609"></a>00609 <a name="l00610"></a>00610 <span class="keyword">inline</span> operator int() <a name="l00611"></a>00611 {<span class="keywordflow">return</span> atomic;}; <a name="l00612"></a>00612 <span class="preprocessor">#endif</span> <a name="l00613"></a>00613 <span class="preprocessor"></span>}; <a name="l00614"></a>00614 <a name="l00615"></a>00615 <span class="preprocessor">#ifndef WIN32</span> <a name="l00616"></a>00616 <span class="preprocessor"></span> <a name="l00636"></a><a class="code" href="classost_1_1_conditional.html">00636</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_conditional.html" title="A conditional variable synchcronization object for one to one and one to many signal...">Conditional</a> <a name="l00637"></a>00637 { <a name="l00638"></a>00638 <span class="keyword">private</span>: <a name="l00639"></a>00639 pthread_cond_t _cond; <a name="l00640"></a>00640 pthread_mutex_t _mutex; <a name="l00641"></a>00641 <a name="l00642"></a>00642 <span class="keyword">public</span>: <a name="l00648"></a>00648 <a class="code" href="classost_1_1_conditional.html" title="A conditional variable synchcronization object for one to one and one to many signal...">Conditional</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span> = NULL); <a name="l00649"></a>00649 <a name="l00653"></a>00653 <span class="keyword">virtual</span> ~<a class="code" href="classost_1_1_conditional.html" title="A conditional variable synchcronization object for one to one and one to many signal...">Conditional</a>(); <a name="l00654"></a>00654 <a name="l00660"></a>00660 <span class="keywordtype">void</span> signal(<span class="keywordtype">bool</span> broadcast); <a name="l00661"></a>00661 <a name="l00668"></a>00668 <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#a24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer = 0, <span class="keywordtype">bool</span> locked = <span class="keyword">false</span>); <a name="l00669"></a>00669 <a name="l00676"></a>00676 <span class="keywordtype">void</span> enterMutex(<span class="keywordtype">void</span>); <a name="l00677"></a>00677 <a name="l00686"></a><a class="code" href="classost_1_1_conditional.html#a2a3bf89c582dad8ba7e81370fd361668">00686</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> lock(<span class="keywordtype">void</span>) <a name="l00687"></a>00687 {enterMutex();}; <a name="l00688"></a>00688 <a name="l00699"></a>00699 <span class="keywordtype">bool</span> tryEnterMutex(<span class="keywordtype">void</span>); <a name="l00700"></a>00700 <a name="l00701"></a><a class="code" href="classost_1_1_conditional.html#a507839fac82a32f946fa5f87d41bef28">00701</a> <span class="keyword">inline</span> <span class="keywordtype">bool</span> test(<span class="keywordtype">void</span>) <a name="l00702"></a>00702 {<span class="keywordflow">return</span> tryEnterMutex();}; <a name="l00703"></a>00703 <a name="l00709"></a>00709 <span class="keywordtype">void</span> leaveMutex(<span class="keywordtype">void</span>); <a name="l00710"></a>00710 <a name="l00711"></a><a class="code" href="classost_1_1_conditional.html#a8b6126bbb6e58c1b8ef937bebf4af222">00711</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>) <a name="l00712"></a>00712 {<span class="keywordflow">return</span> leaveMutex();}; <a name="l00713"></a>00713 }; <a name="l00714"></a>00714 <span class="preprocessor">#endif</span> <a name="l00715"></a>00715 <span class="preprocessor"></span> <a name="l00733"></a><a class="code" href="classost_1_1_semaphore.html">00733</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a> <a name="l00734"></a>00734 { <a name="l00735"></a>00735 <span class="keyword">private</span>: <a name="l00736"></a>00736 <span class="preprocessor">#ifndef WIN32</span> <a name="l00737"></a>00737 <span class="preprocessor"></span> <span class="keywordtype">unsigned</span> _count, _waiters; <a name="l00738"></a>00738 pthread_mutex_t _mutex; <a name="l00739"></a>00739 pthread_cond_t _cond; <a name="l00740"></a>00740 <span class="preprocessor">#else</span> <a name="l00741"></a>00741 <span class="preprocessor"></span> <a class="code" href="serial_8h.html#a069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> semObject; <a name="l00742"></a>00742 <span class="preprocessor">#endif // !WIN32</span> <a name="l00743"></a>00743 <span class="preprocessor"></span> <a name="l00744"></a>00744 <span class="keyword">public</span>: <a name="l00753"></a>00753 <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a>(<span class="keywordtype">unsigned</span> resource = 0); <a name="l00754"></a>00754 <a name="l00761"></a>00761 <span class="keyword">virtual</span> ~<a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a>(); <a name="l00762"></a>00762 <a name="l00778"></a>00778 <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#a24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout = 0); <a name="l00779"></a>00779 <a name="l00791"></a>00791 <span class="keywordtype">void</span> post(<span class="keywordtype">void</span>); <a name="l00792"></a>00792 <a name="l00793"></a>00793 <span class="preprocessor">#ifndef WIN32</span> <a name="l00794"></a>00794 <span class="preprocessor"></span> <a name="l00802"></a>00802 <span class="keywordtype">void</span> force_unlock_after_cancellation(); <a name="l00803"></a>00803 <a name="l00804"></a>00804 <span class="preprocessor">#endif // WIN32</span> <a name="l00805"></a>00805 <span class="preprocessor"></span> <a name="l00806"></a>00806 <span class="comment">// FIXME: how implement getValue for posix compatibility ?</span> <a name="l00807"></a>00807 <span class="comment">// not portable...</span> <a name="l00808"></a>00808 <span class="preprocessor">#if 0</span> <a name="l00809"></a>00809 <span class="preprocessor"></span> <a name="l00814"></a>00814 <span class="keywordtype">int</span> getValue(<span class="keywordtype">void</span>); <a name="l00815"></a>00815 <span class="preprocessor">#endif</span> <a name="l00816"></a>00816 <span class="preprocessor"></span>}; <a name="l00817"></a>00817 <a name="l00837"></a><a class="code" href="classost_1_1_semaphore_lock.html">00837</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_semaphore_lock.html" title="The SemaphoreLock class is used to protect a section of code through a semaphore...">SemaphoreLock</a> <a name="l00838"></a>00838 { <a name="l00839"></a>00839 <span class="keyword">private</span>: <a name="l00840"></a>00840 <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a>& sem; <a name="l00841"></a>00841 <a name="l00842"></a>00842 <span class="keyword">public</span>: <a name="l00846"></a><a class="code" href="classost_1_1_semaphore_lock.html#adb34354071ac2005870fb78926887a05">00846</a> <a class="code" href="classost_1_1_semaphore_lock.html" title="The SemaphoreLock class is used to protect a section of code through a semaphore...">SemaphoreLock</a>( <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a>& _sem ) : sem( _sem ) <a name="l00847"></a>00847 { sem.wait(); } <a name="l00851"></a>00851 <span class="comment">// this should be not-virtual</span> <a name="l00852"></a><a class="code" href="classost_1_1_semaphore_lock.html#a59bf7e09b61fd3b900070841fae86597">00852</a> ~<a class="code" href="classost_1_1_semaphore_lock.html" title="The SemaphoreLock class is used to protect a section of code through a semaphore...">SemaphoreLock</a>() <a name="l00853"></a>00853 { sem.post(); } <a name="l00854"></a>00854 }; <a name="l00855"></a>00855 <a name="l00869"></a><a class="code" href="classost_1_1_event.html">00869</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_event.html" title="The Event class implements a feature originally found in the WIN32 API; event notification...">Event</a> <a name="l00870"></a>00870 { <a name="l00871"></a>00871 <span class="keyword">private</span>: <a name="l00872"></a>00872 <span class="preprocessor">#ifndef WIN32</span> <a name="l00873"></a>00873 <span class="preprocessor"></span> pthread_mutex_t _mutex; <a name="l00874"></a>00874 pthread_cond_t _cond; <a name="l00875"></a>00875 <span class="keywordtype">bool</span> _signaled; <a name="l00876"></a>00876 <span class="keywordtype">int</span> _count; <a name="l00877"></a>00877 <span class="preprocessor">#else</span> <a name="l00878"></a>00878 <span class="preprocessor"></span> <a class="code" href="serial_8h.html#a069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> cond; <a name="l00879"></a>00879 <span class="preprocessor">#endif</span> <a name="l00880"></a>00880 <span class="preprocessor"></span> <a name="l00881"></a>00881 <span class="keyword">public</span>: <a name="l00882"></a>00882 <a class="code" href="classost_1_1_event.html" title="The Event class implements a feature originally found in the WIN32 API; event notification...">Event</a>(); <a name="l00883"></a>00883 <a name="l00884"></a>00884 <span class="keyword">virtual</span> ~<a class="code" href="classost_1_1_event.html" title="The Event class implements a feature originally found in the WIN32 API; event notification...">Event</a>(); <a name="l00885"></a>00885 <a name="l00892"></a>00892 <span class="keywordtype">void</span> reset(<span class="keywordtype">void</span>); <a name="l00893"></a>00893 <a name="l00897"></a>00897 <span class="keywordtype">void</span> signal(<span class="keywordtype">void</span>); <a name="l00898"></a>00898 <a name="l00907"></a>00907 <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#a24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer); <a name="l00908"></a>00908 <span class="keywordtype">bool</span> <a class="code" href="namespaceost.html#a24c7774639b3768bdd45b65a296f6369">wait</a>(<span class="keywordtype">void</span>); <a name="l00909"></a>00909 }; <a name="l00910"></a>00910 <a name="l00911"></a>00911 <a name="l01093"></a><a class="code" href="classost_1_1_thread.html">01093</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> Thread <a name="l01094"></a>01094 { <a name="l01095"></a>01095 <span class="keyword">public</span>: <a name="l01099"></a><a class="code" href="classost_1_1_thread.html#ab9538e839c06104af2974b77d2a5674d">01099</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="classost_1_1_thread.html#ab9538e839c06104af2974b77d2a5674d" title="How to raise error.">Throw</a> { <a name="l01100"></a><a class="code" href="classost_1_1_thread.html#ab9538e839c06104af2974b77d2a5674da1b058025329425c90f383d124ee605e5">01100</a> throwNothing, <a name="l01101"></a><a class="code" href="classost_1_1_thread.html#ab9538e839c06104af2974b77d2a5674daea5957cd08cfecf17f366352bcf9ad80">01101</a> throwObject, <a name="l01102"></a><a class="code" href="classost_1_1_thread.html#ab9538e839c06104af2974b77d2a5674da8e51a6870e65238764becffff92d7f54">01102</a> throwException <a name="l01103"></a>01103 } Throw; <a name="l01104"></a>01104 <a name="l01108"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b">01108</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Cancel</a> { <a name="l01109"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69babbf14157c17311ec31f0967032ecb357">01109</a> cancelInitial=0, <a name="l01110"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69bab02b8cd8d899a693e8cbb86082f4ef16">01110</a> cancelDeferred=1, <a name="l01111"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69ba57f820ea4f7a326c27cc504a213e167d">01111</a> cancelImmediate, <a name="l01112"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69bae07cc9f6d3d7333c8cce543a8bb58215">01112</a> cancelDisabled, <a name="l01113"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69baa194b63cafc5387684afe7943fe3b5f0">01113</a> cancelManual, <a name="l01115"></a><a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69badf753e6d700f194c1b8f695a9bd67554">01115</a> cancelDefault=cancelDeferred <a name="l01117"></a>01117 } Cancel; <a name="l01118"></a>01118 <a name="l01122"></a><a class="code" href="classost_1_1_thread.html#aff7bd364ce645eac95affbf74f1a7087">01122</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="classost_1_1_thread.html#aff7bd364ce645eac95affbf74f1a7087" title="How work suspend.">Suspend</a> { <a name="l01123"></a><a class="code" href="classost_1_1_thread.html#aff7bd364ce645eac95affbf74f1a7087a27f2f61f4bc18b64e9c25f73bb008a38">01123</a> suspendEnable, <a name="l01124"></a><a class="code" href="classost_1_1_thread.html#aff7bd364ce645eac95affbf74f1a7087a0e9f14f0e69d8c12c36a46d108a5074b">01124</a> suspendDisable <a name="l01125"></a>01125 } Suspend; <a name="l01126"></a>01126 <a name="l01127"></a>01127 <span class="preprocessor">#ifndef WIN32</span> <a name="l01128"></a>01128 <span class="preprocessor"></span> <a name="l01129"></a><a class="code" href="classost_1_1_thread.html#abc1a729c4204bc85f58c47042f429acb">01129</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="l01130"></a>01130 <span class="preprocessor">#endif</span> <a name="l01131"></a>01131 <span class="preprocessor"></span> <a name="l01132"></a><a class="code" href="classost_1_1_thread.html#a9b6e94561c96e07e8f2dd776bbc19396">01132</a> <span class="keyword">friend</span> <span class="keyword">class </span>DummyThread; <a name="l01133"></a>01133 <span class="keyword">private</span>: <a name="l01134"></a><a class="code" href="classost_1_1_thread.html#abbf97e2c58c760acb67b9db3a7ba11db">01134</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_cancellation.html" title="A class to automatically set the thread cancellation mode of a member function.">Cancellation</a>; <a name="l01135"></a><a class="code" href="classost_1_1_thread.html#ae156bb5074cfe5c3a729890e0ded952f">01135</a> <span class="keyword">friend</span> <span class="keyword">class </span>postream_type; <a name="l01136"></a><a class="code" href="classost_1_1_thread.html#af08013a89bf19b835ba6f75a60f870ed">01136</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_slog.html" title="The slog class is used to stream messages to the system&#39;s logging facility (syslogd)...">Slog</a>; <a name="l01137"></a>01137 <a name="l01138"></a>01138 <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a> joinSem; <a name="l01139"></a>01139 <span class="keyword">static</span> Thread* _main; <a name="l01140"></a>01140 <a name="l01141"></a>01141 Thread *_parent; <a name="l01142"></a>01142 <a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Cancel</a> _cancel; <a name="l01143"></a>01143 <a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a> *_start; <a name="l01144"></a>01144 <a name="l01145"></a>01145 <span class="comment">// private data</span> <a name="l01146"></a><a class="code" href="classost_1_1_thread.html#ae3c1cdb20d70b22a5c0bf395614eefff">01146</a> <span class="keyword">friend</span> <span class="keyword">class </span>ThreadImpl; <a name="l01147"></a>01147 <span class="keyword">class </span>ThreadImpl* priv; <a name="l01148"></a>01148 <a name="l01149"></a>01149 <span class="keyword">public</span>: <a name="l01150"></a>01150 <span class="keyword">static</span> Thread *<span class="keyword">get</span>(void); <a name="l01151"></a>01151 <a name="l01152"></a>01152 <span class="keyword">private</span>: <a name="l01153"></a>01153 <span class="preprocessor">#ifdef WIN32</span> <a name="l01154"></a>01154 <span class="preprocessor"></span> <span class="keyword">static</span> <span class="keywordtype">unsigned</span> __stdcall Execute(Thread *th); <a name="l01155"></a>01155 <span class="preprocessor">#endif</span> <a name="l01156"></a>01156 <span class="preprocessor"></span> <a name="l01157"></a>01157 <span class="comment">// close current thread, free all and call Notify</span> <a name="l01158"></a>01158 <span class="keywordtype">void</span> close(); <a name="l01159"></a>01159 <a name="l01160"></a>01160 <span class="keyword">private</span>: <a name="l01161"></a>01161 <span class="keywordtype">char</span> _name[32]; <a name="l01162"></a>01162 <span class="keyword">static</span> <span class="keywordtype">size_t</span> _autostack; <a name="l01163"></a>01163 <a name="l01164"></a>01164 <span class="preprocessor">#ifdef WIN32</span> <a name="l01165"></a>01165 <span class="preprocessor"></span> DWORD waitHandle(<a class="code" href="serial_8h.html#a069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> obj, <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); <a name="l01166"></a>01166 <span class="preprocessor">#endif</span> <a name="l01167"></a>01167 <span class="preprocessor"></span> <a name="l01168"></a>01168 <span class="keyword">protected</span>: <a name="l01176"></a>01176 <span class="keywordtype">void</span> setName(<span class="keyword">const</span> <span class="keywordtype">char</span> *text); <a name="l01177"></a>01177 <a name="l01187"></a>01187 <span class="keyword">virtual</span> <span class="keywordtype">void</span> run(<span class="keywordtype">void</span>) = 0; <a name="l01188"></a>01188 <a name="l01210"></a>01210 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <span class="keyword">final</span>(void); <a name="l01211"></a>01211 <a name="l01223"></a>01223 <span class="keyword">virtual</span> <span class="keywordtype">void</span> initial(<span class="keywordtype">void</span>); <a name="l01224"></a>01224 <a name="l01234"></a>01234 <span class="keyword">virtual</span> <span class="keywordtype">void</span>* getExtended(<span class="keywordtype">void</span>); <a name="l01235"></a>01235 <a name="l01243"></a>01243 <span class="keyword">virtual</span> <span class="keywordtype">void</span> notify(Thread*); <a name="l01244"></a>01244 <a name="l01250"></a>01250 <span class="keywordtype">void</span> exit(<span class="keywordtype">void</span>); <a name="l01251"></a>01251 <a name="l01255"></a>01255 <span class="keywordtype">void</span> sync(<span class="keywordtype">void</span>); <a name="l01256"></a>01256 <a name="l01260"></a>01260 <span class="keywordtype">bool</span> testCancel(<span class="keywordtype">void</span>); <a name="l01261"></a>01261 <a name="l01271"></a>01271 <span class="keywordtype">void</span> setCancel(<a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Cancel</a> mode); <a name="l01272"></a>01272 <a name="l01280"></a>01280 <span class="keywordtype">void</span> setSuspend(<a class="code" href="classost_1_1_thread.html#aff7bd364ce645eac95affbf74f1a7087" title="How work suspend.">Suspend</a> mode); <a name="l01281"></a>01281 <a name="l01290"></a>01290 <span class="keywordtype">void</span> terminate(<span class="keywordtype">void</span>); <a name="l01291"></a>01291 <a name="l01295"></a><a class="code" href="classost_1_1_thread.html#a5e574c2c5f388277527c9257524dd654">01295</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> clrParent(<span class="keywordtype">void</span>) <a name="l01296"></a>01296 {_parent = NULL;}; <a name="l01297"></a>01297 <a name="l01298"></a>01298 <span class="keyword">public</span>: <a name="l01307"></a>01307 Thread(<span class="keywordtype">bool</span> isMain); <a name="l01308"></a>01308 <a name="l01320"></a>01320 Thread(<span class="keywordtype">int</span> pri = 0, <span class="keywordtype">size_t</span> stack = 0); <a name="l01321"></a>01321 <a name="l01322"></a>01322 <span class="preprocessor">#ifndef WIN32</span> <a name="l01323"></a>01323 <span class="preprocessor"></span> <a name="l01331"></a>01331 Thread(<span class="keyword">const</span> Thread &th); <a name="l01332"></a>01332 <span class="preprocessor">#endif</span> <a name="l01333"></a>01333 <span class="preprocessor"></span> <a name="l01340"></a>01340 <span class="keyword">virtual</span> ~Thread(); <a name="l01341"></a>01341 <a name="l01347"></a><a class="code" href="classost_1_1_thread.html#accd29b724539d63a8495d954f9f56c72">01347</a> <span class="keyword">static</span> <span class="keywordtype">void</span> setStack(<span class="keywordtype">size_t</span> size = 0) <a name="l01348"></a>01348 {_autostack = size;}; <a name="l01349"></a>01349 <a name="l01359"></a>01359 <span class="keyword">static</span> <span class="keywordtype">void</span> sleep(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> msec); <a name="l01360"></a>01360 <a name="l01365"></a>01365 <span class="keyword">static</span> <span class="keywordtype">void</span> yield(<span class="keywordtype">void</span>); <a name="l01366"></a>01366 <a name="l01379"></a>01379 <span class="keywordtype">int</span> start(<a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a> *start = 0); <a name="l01380"></a>01380 <a name="l01389"></a>01389 <span class="keywordtype">int</span> detach(<a class="code" href="classost_1_1_semaphore.html" title="A semaphore is generally used as a synchronization object between multiple threads...">Semaphore</a> *start = 0); <a name="l01390"></a>01390 <a name="l01397"></a><a class="code" href="classost_1_1_thread.html#aac5bc230c3bad5c837baa9e6d01f4c24">01397</a> <span class="keyword">inline</span> Thread *getParent(<span class="keywordtype">void</span>) <a name="l01398"></a>01398 {<span class="keywordflow">return</span> _parent;}; <a name="l01399"></a>01399 <a name="l01406"></a>01406 <span class="keywordtype">void</span> suspend(<span class="keywordtype">void</span>); <a name="l01407"></a>01407 <a name="l01411"></a>01411 <span class="keywordtype">void</span> resume(<span class="keywordtype">void</span>); <a name="l01412"></a>01412 <a name="l01419"></a><a class="code" href="classost_1_1_thread.html#a3524521d80bcc0562fb59a28ce5d62a4">01419</a> <span class="keyword">inline</span> <a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Cancel</a> getCancel(<span class="keywordtype">void</span>) <a name="l01420"></a>01420 {<span class="keywordflow">return</span> _cancel;}; <a name="l01421"></a>01421 <a name="l01428"></a>01428 <span class="keywordtype">bool</span> isRunning(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01429"></a>01429 <a name="l01435"></a>01435 <span class="keywordtype">bool</span> isDetached(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01436"></a>01436 <a name="l01440"></a>01440 <span class="keywordtype">void</span> join(<span class="keywordtype">void</span>); <a name="l01441"></a>01441 <a name="l01448"></a>01448 <span class="keywordtype">bool</span> isThread(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01449"></a>01449 <a name="l01455"></a>01455 <a class="code" href="thread_8h.html#a3f0d0226a694bf1e508e1b1c758e6ae6">cctid_t</a> getId(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01456"></a>01456 <a name="l01463"></a><a class="code" href="classost_1_1_thread.html#a6b578a4a82d61060d1b17109caddc1a5">01463</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *getName(<span class="keywordtype">void</span>)<span class="keyword"> const</span> <a name="l01464"></a>01464 <span class="keyword"> </span>{<span class="keywordflow">return</span> _name;}; <a name="l01465"></a>01465 <a name="l01471"></a>01471 <span class="keyword">static</span> Throw getException(<span class="keywordtype">void</span>); <a name="l01472"></a>01472 <a name="l01478"></a>01478 <span class="keyword">static</span> <span class="keywordtype">void</span> setException(Throw mode); <a name="l01479"></a>01479 <a name="l01486"></a><a class="code" href="classost_1_1_thread.html#a2742c471d2abe8712368ccff8d534702">01486</a> <span class="keyword">friend</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> operator++(Thread &th) <a name="l01487"></a>01487 {<span class="keywordflow">if</span> (th._start) th._start-><a class="code" href="classost_1_1_semaphore.html#a7535c9c3f3c60596b21b5275342cbe1e" title="Posting to a semaphore increments its current value and releases the first thread...">post</a>();}; <a name="l01488"></a>01488 <a name="l01489"></a><a class="code" href="classost_1_1_thread.html#aa797f8e5a1ea5b857251f98f0d50614e">01489</a> <span class="keyword">friend</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> operator--(Thread &th) <a name="l01490"></a>01490 {<span class="keywordflow">if</span> (th._start) th._start-><a class="code" href="classost_1_1_semaphore.html#a1f2526be16a463d2392a74f668a91d80" title="Wait is used to keep a thread held until the semaphore counter is greater than 0...">wait</a>();}; <a name="l01491"></a>01491 <a name="l01492"></a>01492 <span class="preprocessor">#ifdef WIN32</span> <a name="l01493"></a>01493 <span class="preprocessor"></span> <span class="keywordtype">bool</span> isCancelled() <span class="keyword">const</span>; <a name="l01494"></a>01494 <a name="l01495"></a>01495 <span class="keyword">static</span> DWORD waitThread(<a class="code" href="serial_8h.html#a069bb8cb95b0528d5ce0304bb5561a40">HANDLE</a> hRef, <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); <a name="l01496"></a>01496 <span class="preprocessor">#endif</span> <a name="l01497"></a>01497 <span class="preprocessor"></span> <a name="l01505"></a>01505 <span class="keyword">static</span> Cancel enterCancel(<span class="keywordtype">void</span>); <a name="l01506"></a>01506 <a name="l01512"></a>01512 <span class="keyword">static</span> <span class="keywordtype">void</span> exitCancel(Cancel cancel); <a name="l01513"></a>01513 }; <a name="l01514"></a>01514 <a name="l01524"></a><a class="code" href="classost_1_1_cancellation.html">01524</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_cancellation.html" title="A class to automatically set the thread cancellation mode of a member function.">Cancellation</a> <a name="l01525"></a>01525 { <a name="l01526"></a>01526 <span class="keyword">private</span>: <a name="l01527"></a>01527 <a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Thread::Cancel</a> prior; <a name="l01528"></a>01528 <a name="l01529"></a>01529 <span class="keyword">public</span>: <a name="l01530"></a>01530 <a class="code" href="classost_1_1_cancellation.html" title="A class to automatically set the thread cancellation mode of a member function.">Cancellation</a>(<a class="code" href="classost_1_1_thread.html#a24f333b09607b7c48a97e05865ada69b" title="How work cancellation.">Thread::Cancel</a> cancel); <a name="l01531"></a>01531 ~<a class="code" href="classost_1_1_cancellation.html" title="A class to automatically set the thread cancellation mode of a member function.">Cancellation</a>(); <a name="l01532"></a>01532 }; <a name="l01533"></a>01533 <a name="l01534"></a>01534 <span class="preprocessor">#if !defined(WIN32) && !defined(__MINGW32__)</span> <a name="l01535"></a><a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">01535</a> <span class="preprocessor"></span><span class="keyword">typedef</span> <span class="keywordtype">int</span> <a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a>; <a name="l01536"></a>01536 <a name="l01537"></a><a class="code" href="classost_1_1_posix_thread.html">01537</a> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html">PosixThread</a>: <span class="keyword">public</span> Thread <a name="l01538"></a>01538 { <a name="l01539"></a>01539 <span class="keyword">private</span>: <a name="l01540"></a>01540 <span class="preprocessor">#ifndef WIN32</span> <a name="l01541"></a>01541 <span class="preprocessor"></span> <a name="l01542"></a><a class="code" href="classost_1_1_posix_thread.html#ae3c1cdb20d70b22a5c0bf395614eefff">01542</a> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classost_1_1_posix_thread.html#ae3c1cdb20d70b22a5c0bf395614eefff">ThreadImpl</a>; <a name="l01543"></a><a class="code" href="classost_1_1_posix_thread.html#adbc148eaddd341d7ae4d07c9e9e33bfd">01543</a> <span class="keyword">friend</span> <span class="keyword">class </span>Thread; <a name="l01544"></a>01544 <span class="preprocessor">#endif</span> <a name="l01545"></a>01545 <span class="preprocessor"></span><span class="preprocessor">#ifndef CCXX_SIG_THREAD_ALARM</span> <a name="l01546"></a>01546 <span class="preprocessor"></span> <span class="keyword">static</span> <a class="code" href="classost_1_1_posix_thread.html">PosixThread</a> *_timer; <a name="l01547"></a>01547 <span class="keyword">static</span> <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a> _arm; <a name="l01548"></a>01548 <span class="preprocessor">#endif</span> <a name="l01549"></a>01549 <span class="preprocessor"></span> <a name="l01550"></a>01550 time_t _alarm; <a name="l01551"></a>01551 <span class="keyword">static</span> <span class="keywordtype">void</span> signalThread(Thread* th,<a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo); <a name="l01552"></a>01552 <span class="keyword">protected</span>: <a name="l01553"></a>01553 <a name="l01560"></a><a class="code" href="classost_1_1_posix_thread.html#a1698de2b943084fe05849cbd42099156">01560</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a1698de2b943084fe05849cbd42099156" title="In the Posix version of Common C++, this can be used to send a signal into the parent...">signalParent</a>(<a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo) <a name="l01561"></a>01561 { signalThread(_parent,signo); }; <a name="l01562"></a>01562 <a name="l01569"></a><a class="code" href="classost_1_1_posix_thread.html#ad13ab707409d229be9c5b64a0e2ec7ad">01569</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#ad13ab707409d229be9c5b64a0e2ec7ad" title="In the Posix version of Common C++, this can be used to send a signal into the main...">signalMain</a>(<a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo) <a name="l01570"></a>01570 { signalThread(_main,signo);}; <a name="l01571"></a>01571 <a name="l01576"></a>01576 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a9ce41764e5846b94195d367a0c7c7e4e" title="A derivable method to call when a SIGALRM is being delivered to a specific thread...">onTimer</a>(<span class="keywordtype">void</span>); <a name="l01577"></a>01577 <a name="l01582"></a>01582 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#acfb12beb826e7895f54a5af9e6c38434" title="A derived method to handle hangup events being delivered to a specific thread.">onHangup</a>(<span class="keywordtype">void</span>); <a name="l01583"></a>01583 <a name="l01588"></a>01588 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#adb1aa6d0e6baa04c37e1a61b641414e7" title="A derived method to call when a SIGABRT is being delivered to a specific thread.">onException</a>(<span class="keywordtype">void</span>); <a name="l01589"></a>01589 <a name="l01594"></a>01594 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a105a9f61fcdf62acd3d5563f5d9e3905" title="A derived method to call when a SIGPIPE is being delivered to a specific thread.">onDisconnect</a>(<span class="keywordtype">void</span>); <a name="l01595"></a>01595 <a name="l01600"></a>01600 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a6e2788cfba0b31813d4cab891f7e1feb" title="A derived method to handle asynchronous I/O requests delivered to the specified thread...">onPolling</a>(<span class="keywordtype">void</span>); <a name="l01601"></a>01601 <a name="l01608"></a>01608 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a3db7c01850d939ca1bb0fdc67aeb3efa" title="A derivable method to call for delivering a signal event to a specified thread.">onSignal</a>(<span class="keywordtype">int</span>); <a name="l01609"></a>01609 <a name="l01622"></a>01622 <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#ad9c8ffa69fec8c3a139fe3d7068667a0" title="Used to specify a timeout event that can be delivered to the current thread via SIGALRM...">setTimer</a>(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timer, <span class="keywordtype">bool</span> periodic = <span class="keyword">false</span>); <a name="l01623"></a>01623 <a name="l01630"></a>01630 <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> <a class="code" href="classost_1_1_posix_thread.html#a79beb0fde40ee5073fe6468de94eef05" title="Gets the time remaining for the current threads timer before it expires.">getTimer</a>(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01631"></a>01631 <a name="l01637"></a>01637 <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#aed0f4cae60e5694960260d13664c1367" title="Terminates the timer before the timeout period has expired.">endTimer</a>(<span class="keywordtype">void</span>); <a name="l01638"></a>01638 <a name="l01639"></a>01639 <span class="preprocessor">#if defined(HAVE_SIGWAIT) || defined(HAVE_SIGWAIT2)</span> <a name="l01640"></a>01640 <span class="preprocessor"></span> <a name="l01646"></a>01646 <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a1545316f7caaabf86edd1874eada6732" title="Used to wait on a Posix signal from another thread.">waitSignal</a>(<a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo); <a name="l01647"></a>01647 <span class="preprocessor">#endif</span> <a name="l01648"></a>01648 <span class="preprocessor"></span> <a name="l01655"></a>01655 <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#ab665136ffddf808ab652c51f9caa953c" title="Used to enable or disable a signal within the current thread.">setSignal</a>(<span class="keywordtype">int</span> signo, <span class="keywordtype">bool</span> active); <a name="l01656"></a>01656 <a name="l01663"></a>01663 pthread_attr_t *<a class="code" href="classost_1_1_posix_thread.html#ae7b26aaccd916f0905a30707d7ef4067" title="Access to pthread_attr structure this allows setting/modifying pthread attributes...">getPthreadAttrPtr</a>(<span class="keywordtype">void</span>); <a name="l01664"></a>01664 <a name="l01669"></a>01669 pthread_t <a class="code" href="classost_1_1_posix_thread.html#af114ce4574592143ef016dd9cd2bd11d" title="Get pthread_t of underlying posix thread (useful for debugging/logging).">getPthreadId</a>(<span class="keywordtype">void</span>); <a name="l01670"></a>01670 <a name="l01671"></a>01671 <span class="keyword">public</span>: <a name="l01672"></a>01672 <a name="l01673"></a>01673 <a class="code" href="classost_1_1_posix_thread.html#aeeba18c7e3ef9f718b20b7477e602735">PosixThread</a>(<span class="keywordtype">int</span> pri = 0, <span class="keywordtype">size_t</span> stack = 0); <a name="l01674"></a>01674 <a name="l01680"></a><a class="code" href="classost_1_1_posix_thread.html#afa168ff1446785a43b1123703d999207">01680</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> signalThread(<span class="keywordtype">int</span> signo) <a name="l01681"></a>01681 {<a class="code" href="classost_1_1_posix_thread.html#afa168ff1446785a43b1123703d999207" title="Delivers a Posix signal to the current thread.">signalThread</a>(<span class="keyword">this</span>, signo);}; <a name="l01682"></a>01682 <a name="l01689"></a>01689 <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classost_1_1_posix_thread.html#a67e582aabcd65431a38ecc8cbf0af350" title="Install a signal handler for use by threads and the OnSignal() event notification...">sigInstall</a>(<span class="keywordtype">int</span> signo); <a name="l01690"></a>01690 }; <a name="l01691"></a>01691 <span class="preprocessor">#endif</span> <a name="l01692"></a>01692 <span class="preprocessor"></span> <a name="l01707"></a><a class="code" href="classost_1_1_thread_key.html">01707</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> ThreadKey <a name="l01708"></a>01708 { <a name="l01709"></a>01709 <span class="keyword">private</span>: <a name="l01710"></a>01710 <span class="preprocessor">#ifndef WIN32</span> <a name="l01711"></a>01711 <span class="preprocessor"></span> pthread_key_t key; <a name="l01712"></a>01712 <span class="keyword">typedef</span> void (*TDestruct)(<span class="keywordtype">void</span>*); <a name="l01713"></a><a class="code" href="classost_1_1_thread_key.html#ae3c1cdb20d70b22a5c0bf395614eefff">01713</a> <span class="keyword">friend</span> <span class="keyword">class </span>ThreadImpl; <a name="l01714"></a>01714 ThreadKey(TDestruct destruct); <a name="l01715"></a>01715 <span class="preprocessor">#else</span> <a name="l01716"></a>01716 <span class="preprocessor"></span> DWORD key; <a name="l01717"></a>01717 <span class="preprocessor">#endif</span> <a name="l01718"></a>01718 <span class="preprocessor"></span> <a name="l01719"></a>01719 <span class="keyword">public</span>: <a name="l01723"></a>01723 ThreadKey(); <a name="l01724"></a>01724 <a name="l01728"></a>01728 <span class="keyword">virtual</span> ~ThreadKey(); <a name="l01729"></a>01729 <a name="l01737"></a>01737 <span class="keywordtype">void</span> *getKey(<span class="keywordtype">void</span>); <a name="l01738"></a>01738 <a name="l01746"></a>01746 <span class="keywordtype">void</span> setKey(<span class="keywordtype">void</span> *); <a name="l01747"></a>01747 }; <a name="l01748"></a>01748 <a name="l01759"></a><a class="code" href="classost_1_1_timer_port.html">01759</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_timer_port.html" title="Timer ports are used to provide synchronized timing events when managed under a &quot;service...">TimerPort</a> <a name="l01760"></a>01760 { <a name="l01761"></a>01761 <span class="preprocessor">#ifndef WIN32</span> <a name="l01762"></a>01762 <span class="preprocessor"></span> <span class="keyword">struct </span>timeval timer; <a name="l01763"></a>01763 <span class="preprocessor">#else</span> <a name="l01764"></a>01764 <span class="preprocessor"></span> DWORD timer; <a name="l01765"></a>01765 <span class="preprocessor">#endif</span> <a name="l01766"></a>01766 <span class="preprocessor"></span> <span class="keywordtype">bool</span> active; <a name="l01767"></a>01767 <a name="l01768"></a>01768 <span class="keyword">public</span>: <a name="l01775"></a>01775 <a class="code" href="classost_1_1_timer_port.html" title="Timer ports are used to provide synchronized timing events when managed under a &quot;service...">TimerPort</a>(); <a name="l01776"></a>01776 <a name="l01785"></a>01785 <span class="keywordtype">void</span> setTimer(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout = 0); <a name="l01786"></a>01786 <a name="l01796"></a>01796 <span class="keywordtype">void</span> incTimer(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); <a name="l01797"></a>01797 <a name="l01807"></a>01807 <span class="keywordtype">void</span> decTimer(<a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); <a name="l01808"></a>01808 <a name="l01813"></a>01813 <span class="keywordtype">void</span> sleepTimer(<span class="keywordtype">void</span>); <a name="l01814"></a>01814 <a name="l01820"></a>01820 <span class="keywordtype">void</span> endTimer(<span class="keywordtype">void</span>); <a name="l01821"></a>01821 <a name="l01833"></a>01833 <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> getTimer(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01834"></a>01834 <a name="l01844"></a>01844 <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> getElapsed(<span class="keywordtype">void</span>) <span class="keyword">const</span>; <a name="l01845"></a>01845 }; <a name="l01846"></a>01846 <a name="l01847"></a>01847 <a name="l01848"></a>01848 <a name="l01849"></a>01849 <span class="comment">// FIXME: not in win32 implementation</span> <a name="l01850"></a>01850 <span class="preprocessor">#if !defined(WIN32)</span> <a name="l01851"></a>01851 <span class="preprocessor"></span> <a name="l01852"></a>01852 <span class="comment">// FIXME: private declaration ???</span> <a name="l01853"></a>01853 <span class="keyword">struct </span>timespec *<a class="code" href="namespaceost.html#a8fd139f80e945ac6d8cc53868cdacca6">getTimeout</a>(<span class="keyword">struct</span> timespec *spec, <a class="code" href="thread_8h.html#af412159e5cef839836a5e7b19ee75d1c">timeout_t</a> timeout); <a name="l01854"></a>01854 <a name="l01855"></a>01855 <span class="preprocessor">#if !defined(__CYGWIN32__) && !defined(__MINGW32__)</span> <a name="l01856"></a>01856 <span class="preprocessor"></span><span class="keywordtype">void</span> <a class="code" href="namespaceost.html#a24c7774639b3768bdd45b65a296f6369">wait</a>(<a class="code" href="namespaceost.html#a5dca865b107f598c88bd2106ea56c16e">signo_t</a> signo); <a name="l01857"></a>01857 <span class="preprocessor">#endif</span> <a name="l01858"></a>01858 <span class="preprocessor"></span> <a name="l01859"></a>01859 <span class="preprocessor">#endif // !WIN32</span> <a name="l01860"></a>01860 <span class="preprocessor"></span> <a name="l01861"></a>01861 <span class="preprocessor">#ifdef USE_POLL</span> <a name="l01862"></a>01862 <span class="preprocessor"></span> <a name="l01870"></a>01870 <span class="keyword">class </span>Poller <a name="l01871"></a>01871 { <a name="l01872"></a>01872 <span class="keyword">private</span>: <a name="l01873"></a>01873 <span class="keywordtype">int</span> nufds; <a name="l01874"></a>01874 pollfd *ufds; <a name="l01875"></a>01875 <a name="l01876"></a>01876 <span class="keyword">public</span>: <a name="l01877"></a>01877 Poller(); <a name="l01878"></a>01878 <a name="l01879"></a>01879 <span class="keyword">virtual</span> ~Poller(); <a name="l01880"></a>01880 <a name="l01888"></a>01888 pollfd *getList(<span class="keywordtype">int</span> cnt); <a name="l01889"></a>01889 <a name="l01895"></a>01895 <span class="keyword">inline</span> pollfd *getList(<span class="keywordtype">void</span>) <a name="l01896"></a>01896 {<span class="keywordflow">return</span> ufds;}; <a name="l01897"></a>01897 }; <a name="l01898"></a>01898 <span class="preprocessor">#endif</span> <a name="l01899"></a>01899 <span class="preprocessor"></span> <a name="l01900"></a><a class="code" href="namespaceost.html#a99c7f7d02b00922b0f5ee62fc3bb75fd">01900</a> <span class="keyword">inline</span> Thread *<a class="code" href="namespaceost.html#a99c7f7d02b00922b0f5ee62fc3bb75fd">getThread</a>(<span class="keywordtype">void</span>) <a name="l01901"></a>01901 {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_thread.html#aaad41a9f7962bdc3058a429df48246fd">Thread::get</a>();} <a name="l01902"></a>01902 <a name="l01932"></a><a class="code" href="classost_1_1_sys_time.html">01932</a> <span class="keyword">class </span><a class="code" href="config_8h.html#ad10ef148ba8327bd530fc6c32c1e181c">__EXPORT</a> <a class="code" href="classost_1_1_sys_time.html" title="This class is used to access non-reentrant date and time functions in the standard...">SysTime</a> <a name="l01933"></a>01933 { <a name="l01934"></a>01934 <span class="keyword">private</span>: <a name="l01935"></a>01935 <span class="keyword">static</span> <a class="code" href="classost_1_1_mutex.html" title="The Mutex class is used to protect a section of code so that at any given time only...">Mutex</a> timeLock; <a name="l01936"></a>01936 <a name="l01937"></a>01937 <span class="keyword">protected</span>: <a name="l01938"></a><a class="code" href="classost_1_1_sys_time.html#a9c5b33e9cabc7f1510653dbd1f6eb0ae">01938</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> lock(<span class="keywordtype">void</span>) <a name="l01939"></a>01939 {timeLock.enterMutex();} <a name="l01940"></a>01940 <a name="l01941"></a><a class="code" href="classost_1_1_sys_time.html#a0d75e27d952de65d6e46b38e57ba605d">01941</a> <span class="keyword">inline</span> <span class="keyword">static</span> <span class="keywordtype">void</span> unlock(<span class="keywordtype">void</span>) <a name="l01942"></a>01942 {timeLock.leaveMutex();} <a name="l01943"></a>01943 <a name="l01944"></a>01944 <span class="keyword">public</span>: <a name="l01945"></a>01945 <span class="keyword">static</span> time_t getTime(time_t *tloc = NULL); <a name="l01946"></a><a class="code" href="classost_1_1_sys_time.html#accb0dc3c9d64b224e47649211dbe7b64">01946</a> <span class="keyword">static</span> time_t time(time_t *tloc) <a name="l01947"></a>01947 { <span class="keywordflow">return</span> getTime(tloc); }; <a name="l01948"></a>01948 <a name="l01949"></a>01949 <span class="keyword">static</span> <span class="keywordtype">int</span> getTimeOfDay(<span class="keyword">struct</span> timeval *tp); <a name="l01950"></a><a class="code" href="classost_1_1_sys_time.html#afc403fcaa5a8ebf81528a34e5d5a1fac">01950</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="l01951"></a>01951 { <span class="keywordflow">return</span> getTimeOfDay(tp); }; <a name="l01952"></a>01952 <a name="l01953"></a>01953 <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="l01954"></a><a class="code" href="classost_1_1_sys_time.html#af4bd7e44705486a2f0cee2cb98b2f975">01954</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="l01955"></a>01955 { <span class="keywordflow">return</span> getLocalTime(clock, result); }; <a name="l01956"></a>01956 <a name="l01957"></a>01957 <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="l01958"></a><a class="code" href="classost_1_1_sys_time.html#a1852b1563a7b8f2b96ab75bafe3948eb">01958</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="l01959"></a>01959 { <span class="keywordflow">return</span> getGMTTime(clock, result);}; <a name="l01960"></a>01960 }; <a name="l01961"></a>01961 <a name="l01962"></a>01962 <span class="preprocessor">#ifndef HAVE_LOCALTIME_R</span> <a name="l01963"></a>01963 <span class="preprocessor"></span> <a name="l01964"></a>01964 <span class="keyword">inline</span> <span class="keyword">struct </span>tm *localtime_r(<span class="keyword">const</span> time_t *t, <span class="keyword">struct</span> tm *b) <a name="l01965"></a>01965 {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_sys_time.html#ac39180f2c7b282d0145134d14a288480">SysTime::getLocalTime</a>(t, b);}; <a name="l01966"></a>01966 <span class="keyword">inline</span> <span class="keywordtype">char</span> *ctime_r(<span class="keyword">const</span> time_t *t, <span class="keywordtype">char</span> *buf) <a name="l01967"></a>01967 {<span class="keywordflow">return</span> ctime(t);}; <a name="l01968"></a>01968 <span class="keyword">inline</span> <span class="keyword">struct </span>tm *gmtime_r(<span class="keyword">const</span> time_t *t, <span class="keyword">struct</span> tm *b) \ <a name="l01969"></a>01969 {<span class="keywordflow">return</span> <a class="code" href="classost_1_1_sys_time.html#a0da1e5fefac7161a878daed011e79932">SysTime::getGMTTime</a>(t, b);}; <a name="l01970"></a>01970 <span class="keyword">inline</span> <span class="keywordtype">char</span> *asctime_r(<span class="keyword">const</span> <span class="keyword">struct</span> tm *tm, <span class="keywordtype">char</span> *b) \ <a name="l01971"></a>01971 {<span class="keywordflow">return</span> asctime(tm);}; <a name="l01972"></a>01972 <a name="l01973"></a>01973 <span class="preprocessor">#endif</span> <a name="l01974"></a>01974 <span class="preprocessor"></span> <a name="l01975"></a>01975 <span class="preprocessor">#ifdef CCXX_NAMESPACES</span> <a name="l01976"></a>01976 <span class="preprocessor"></span>} <a name="l01977"></a>01977 <span class="preprocessor">#endif</span> <a name="l01978"></a>01978 <span class="preprocessor"></span> <a name="l01979"></a>01979 <span class="preprocessor">#endif</span> <a name="l01980"></a>01980 <span class="preprocessor"></span> </pre></div></div> <hr class="footer"/><address style="text-align: right;"><small>Generated on Fri Mar 12 10:07:39 2010 for GNU CommonC++ by <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address> </body> </html>