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