📄 sync__unix_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>sync_unix.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.2.18 --><center><a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> </center><hr><h1>sync_unix.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< SYNC_UNIX.H >---------------------------------------------------*--------*</span>00002 <span class="comment">// FastDB Version 1.0 (c) 1999 GARRET * ? *</span>00003 <span class="comment">// (Main Memory Database Management System) * /\| *</span>00004 <span class="comment">// * / \ *</span>00005 <span class="comment">// Created: 20-Nov-98 K.A. Knizhnik * / [] \ *</span>00006 <span class="comment">// Last update: 20-Dec-98 K.A. Knizhnik * GARRET *</span>00007 <span class="comment">//-------------------------------------------------------------------*--------*</span>00008 <span class="comment">// Intertask synchonization primitives for Unix platforms</span>00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>00010 00011 <span class="preprocessor">#ifndef __SYNC_UNIX_H__</span>00012 <span class="preprocessor"></span><span class="preprocessor">#define __SYNC_UNIX_H__</span>00013 <span class="preprocessor"></span>00014 <span class="comment">// Standard includes for all Unix platforms</span>00015 <span class="preprocessor">#include <unistd.h></span>00016 <span class="preprocessor">#include <string.h></span>00017 <span class="preprocessor">#include <fcntl.h></span>00018 <span class="preprocessor">#include <sys/time.h></span>00019 <span class="preprocessor">#include <sys/types.h></span>00020 <span class="preprocessor">#include <assert.h></span>00021 <span class="preprocessor">#include <errno.h></span>00022 00023 <span class="preprocessor">#if !defined(USE_POSIX_SEMAPHORES) || !defined(USE_POSIX_MMAP) || !USE_POSIX_MMAP</span>00024 <span class="preprocessor"></span><span class="preprocessor">#include <sys/ipc.h></span> 00025 <span class="keyword">extern</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* keyFileDir; <span class="comment">// default value: "/tmp/" </span>00026 <span class="preprocessor">#endif</span>00027 <span class="preprocessor"></span>00028 <span class="preprocessor">#if defined(USE_POSIX_SEMAPHORES)</span>00029 <span class="preprocessor"></span><span class="preprocessor">#include <semaphore.h></span> <span class="comment">// For POSIX style semaphores</span>00030 <span class="preprocessor">#else</span>00031 <span class="preprocessor"></span><span class="preprocessor">#include <sys/sem.h></span> <span class="comment">// For SysV style semaphores</span>00032 <span class="preprocessor">#endif</span>00033 <span class="preprocessor"></span>00034 <span class="preprocessor">#if defined(USE_POSIX_MMAP) && USE_POSIX_MMAP</span>00035 <span class="preprocessor"></span><span class="preprocessor">#include <sys/mman.h></span> <span class="comment">// For mmap()</span>00036 <span class="preprocessor">#else</span>00037 <span class="preprocessor"></span><span class="preprocessor">#include <sys/shm.h></span> 00038 <span class="preprocessor">#include <sys/mman.h></span>00039 <span class="preprocessor">#endif</span>00040 <span class="preprocessor"></span>00041 BEGIN_FASTDB_NAMESPACE00042 00043 <span class="preprocessor">#define thread_proc</span>00044 <span class="preprocessor"></span>00046 <span class="comment">// If this system uses pthread based threads, then define</span>00047 <span class="comment">// dbMutex(), dbThread(), dbLocalEvent(), etc as pthread-based implemenations</span>00048 00049 <span class="preprocessor">#ifndef NO_PTHREADS</span>00050 <span class="preprocessor"></span>00051 <span class="comment">// Use pthread based implementation</span>00052 <span class="preprocessor">#include <pthread.h></span>00053 00054 <span class="keyword">class </span>dbMutex { 00055 <span class="keyword">friend</span> <span class="keyword">class </span>dbLocalEvent;00056 <span class="keyword">friend</span> <span class="keyword">class </span>dbLocalSemaphore;00057 pthread_mutex_t cs;00058 <span class="keywordtype">bool</span> initialized;00059 <span class="keyword">public</span>:00060 dbMutex() {00061 <span class="keywordtype">int</span> rc = pthread_mutex_init(&cs, NULL);00062 assert(rc == 0);00063 initialized = <span class="keyword">true</span>;00064 }00065 ~dbMutex() {00066 <span class="keywordtype">int</span> rc = pthread_mutex_destroy(&cs);00067 assert(rc == 0);00068 initialized = <span class="keyword">false</span>;00069 }00070 <span class="keywordtype">bool</span> isInitialized() { 00071 <span class="keywordflow">return</span> initialized;00072 }00073 <span class="keywordtype">void</span> lock() {00074 <span class="keywordflow">if</span> (initialized) { 00075 <span class="keywordtype">int</span> rc = pthread_mutex_lock(&cs);00076 assert(rc == 0);00077 }00078 }00079 <span class="keywordtype">void</span> unlock() {00080 <span class="keywordflow">if</span> (initialized) { 00081 <span class="keywordtype">int</span> rc = pthread_mutex_unlock(&cs);00082 assert(rc == 0);00083 }00084 }00085 };00086 00087 00088 <span class="keyword">const</span> size_t dbThreadStackSize = 1024*1024;00089 00090 <span class="keyword">class </span>dbThread { 00091 pthread_t thread;00092 <span class="keyword">public</span>:00093 <span class="keyword">typedef</span> void (thread_proc* thread_proc_t)(<span class="keywordtype">void</span>*);00094 00095 <span class="keyword">static</span> <span class="keywordtype">void</span> sleep(time_t sec) { 00096 ::sleep(sec);00097 }00098 00099 <span class="keywordtype">void</span> create(thread_proc_t f, <span class="keywordtype">void</span>* arg) {00100 pthread_attr_t attr;00101 pthread_attr_init(&attr);00102 <span class="preprocessor">#if !defined(__linux__)</span>00103 <span class="preprocessor"></span> pthread_attr_setstacksize(&attr, dbThreadStackSize);00104 <span class="preprocessor">#endif</span>00105 <span class="preprocessor"></span><span class="preprocessor">#if defined(_AIX41)</span>00106 <span class="preprocessor"></span> <span class="comment">// At AIX 4.1, 4.2 threads are by default created detached</span>00107 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);00108 <span class="preprocessor">#endif</span>00109 <span class="preprocessor"></span> pthread_create(&thread, &attr, (<span class="keywordtype">void</span>*(*)(<span class="keywordtype">void</span>*))f, arg);00110 pthread_attr_destroy(&attr);00111 }00112 00113 <span class="keywordtype">void</span> join() { 00114 <span class="keywordtype">void</span>* result;00115 pthread_join(thread, &result);00116 }00117 <span class="keywordtype">void</span> detach() { 00118 pthread_detach(thread);00119 }00120 00121 <span class="keyword">enum</span> ThreadPriority { 00122 THR_PRI_LOW, 00123 THR_PRI_HIGH00124 };00125 <span class="keywordtype">void</span> setPriority(ThreadPriority pri) { 00126 <span class="preprocessor">#if defined(PRI_OTHER_MIN) && defined(PRI_OTHER_MAX)</span>00127 <span class="preprocessor"></span> <span class="keyword">struct </span>sched_param sp;00128 sp.sched_priority = pri == THR_PRI_LOW ? PRI_OTHER_MIN : PRI_OTHER_MAX;00129 pthread_setschedparam(thread, SCHED_OTHER, &sp); 00130 <span class="preprocessor">#endif</span>00131 <span class="preprocessor"></span> }00132 00133 <span class="keyword">static</span> <span class="keywordtype">int</span> numberOfProcessors();00134 };00135 00136 00137 <span class="keyword">class </span>dbLocalEvent { 00138 pthread_cond_t cond;00139 <span class="keywordtype">int</span> signaled;00140 <span class="keyword">public</span>:00141 <span class="keywordtype">void</span> wait(dbMutex& mutex) { 00142 <span class="keywordflow">while</span> (!signaled) { 00143 pthread_cond_wait(&cond, &mutex.cs);00144 }00145 }00146 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeout) {00147 <span class="keywordflow">if</span> (!signaled) { 00148 <span class="keyword">struct </span>timespec abs_ts; 00149 <span class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</span>00150 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec rel_ts; 00151 rel_ts.tv_sec = timeout/1000; 00152 rel_ts.tv_nsec = timeout%1000*1000000;00153 pthread_get_expiration_np(&rel_ts, &abs_ts);00154 <span class="preprocessor">#else</span>00155 <span class="preprocessor"></span> <span class="keyword">struct </span>timeval cur_tv;00156 gettimeofday(&cur_tv, NULL);00157 abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00158 abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00159 <span class="keywordflow">if</span> (abs_ts.tv_nsec > 1000000000) { 00160 abs_ts.tv_nsec -= 1000000000;00161 abs_ts.tv_sec += 1;00162 }00163 <span class="preprocessor">#endif</span>00164 <span class="preprocessor"></span> <span class="keywordflow">do</span> { 00165 <span class="keywordtype">int</span> rc = pthread_cond_timedwait(&cond, &mutex.cs, &abs_ts);00166 <span class="keywordflow">if</span> (rc != 0) {00167 <span class="keywordflow">return</span> <span class="keyword">false</span>;00168 }00169 } <span class="keywordflow">while</span> (!signaled);00170 00171 }00172 <span class="keywordflow">return</span> <span class="keyword">true</span>;00173 }00174 <span class="keywordtype">void</span> signal() {00175 signaled = <span class="keyword">true</span>;00176 pthread_cond_broadcast(&cond);00177 }00178 <span class="keywordtype">void</span> reset() {00179 signaled = <span class="keyword">false</span>;00180 }00181 <span class="keywordtype">void</span> open(<span class="keywordtype">bool</span> initValue = <span class="keyword">false</span>) { 00182 signaled = initValue;00183 pthread_cond_init(&cond, NULL);00184 }00185 <span class="keywordtype">void</span> close() {00186 pthread_cond_destroy(&cond);00187 }00188 };00189 00190 <span class="keyword">class </span>dbLocalSemaphore { 00191 pthread_cond_t cond;00192 <span class="keywordtype">int</span> count;00193 <span class="keyword">public</span>:00194 <span class="keywordtype">void</span> wait(dbMutex& mutex) { 00195 <span class="keywordflow">while</span> (count == 0) { 00196 pthread_cond_wait(&cond, &mutex.cs);00197 }00198 count -= 1;00199 }00200 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeout) {00201 <span class="keywordflow">if</span> (count == 0) { 00202 <span class="keyword">struct </span>timespec abs_ts; 00203 <span class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</span>00204 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec rel_ts; 00205 rel_ts.tv_sec = timeout/1000; 00206 rel_ts.tv_nsec = timeout%1000*1000000;00207 pthread_get_expiration_np(&rel_ts, &abs_ts);00208 <span class="preprocessor">#else</span>00209 <span class="preprocessor"></span> <span class="keyword">struct </span>timeval cur_tv;00210 gettimeofday(&cur_tv, NULL);00211 abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00212 abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00213 <span class="keywordflow">if</span> (abs_ts.tv_nsec > 1000000000) { 00214 abs_ts.tv_nsec -= 1000000000;00215 abs_ts.tv_sec += 1;00216 }00217 <span class="preprocessor">#endif</span>00218 <span class="preprocessor"></span> <span class="keywordflow">do</span> { 00219 <span class="keywordtype">int</span> rc = pthread_cond_timedwait(&cond, &mutex.cs, &abs_ts);00220 <span class="keywordflow">if</span> (rc != 0) { 00221 <span class="keywordflow">return</span> <span class="keyword">false</span>;00222 }00223 } <span class="keywordflow">while</span> (count == 0);00224 }00225 count -= 1;00226 <span class="keywordflow">return</span> <span class="keyword">true</span>;00227 }00228 <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {00229 count += inc;00230 <span class="keywordflow">if</span> (inc > 1) { 00231 pthread_cond_broadcast(&cond);00232 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inc == 1) { 00233 pthread_cond_signal(&cond);00234 }00235 }00236 <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) { 00237 pthread_cond_init(&cond, NULL);00238 count = initValue;00239 }00240 <span class="keywordtype">void</span> close() {00241 pthread_cond_destroy(&cond);00242 }00243 };00244 00245 <span class="keyword">template</span><<span class="keyword">class</span> T> 00246 <span class="keyword">class </span>dbThreadContext { 00247 pthread_key_t key;00248 <span class="keyword">public</span>:00249 T* get() { 00250 <span class="keywordflow">return</span> (T*)pthread_getspecific(key);00251 }00252 <span class="keywordtype">void</span> set(T* value) { 00253 pthread_setspecific(key, value);00254 }00255 dbThreadContext() { 00256 pthread_key_create(&key, NULL);00257 }00258 ~dbThreadContext() { 00259 pthread_key_delete(key);00260 }00261 };00262 00263 <span class="keyword">class </span>dbProcessId { 00264 <span class="keywordtype">int</span> pid;00265 pthread_t tid;00266 <span class="keyword">public</span>:00267 <span class="keywordtype">bool</span> operator != (dbProcessId <span class="keyword">const</span>& other)<span class="keyword"> const </span>{ 00268 <span class="keywordflow">return</span> pid != other.pid || tid != other.tid;00269 }00270 00271 <span class="keywordtype">void</span> clear() { 00272 pid = 0;00273 tid = 0;00274 }00275 00276 <span class="keyword">static</span> dbProcessId getCurrent() {00277 dbProcessId curr;00278 curr.pid = getpid();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -