📄 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_NAMESPACE
00042
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="preprocessor">#ifdef NDEBUG</span>
00062 <span class="preprocessor"></span> pthread_mutex_init(&cs, NULL);
00063 <span class="preprocessor">#else</span>
00064 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_init(&cs, NULL);
00065 assert(rc == 0);
00066 <span class="preprocessor">#endif</span>
00067 <span class="preprocessor"></span> initialized = <span class="keyword">true</span>;
00068 }
00069 ~dbMutex() {
00070 <span class="preprocessor">#ifdef NDEBUG</span>
00071 <span class="preprocessor"></span> pthread_mutex_destroy(&cs);
00072 <span class="preprocessor">#else</span>
00073 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_destroy(&cs);
00074 assert(rc == 0);
00075 <span class="preprocessor">#endif</span>
00076 <span class="preprocessor"></span> initialized = <span class="keyword">false</span>;
00077 }
00078 <span class="keywordtype">bool</span> isInitialized() {
00079 <span class="keywordflow">return</span> initialized;
00080 }
00081 <span class="keywordtype">void</span> lock() {
00082 <span class="keywordflow">if</span> (initialized) {
00083 <span class="preprocessor">#ifdef NDEBUG</span>
00084 <span class="preprocessor"></span> pthread_mutex_lock(&cs);
00085 <span class="preprocessor">#else</span>
00086 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_lock(&cs);
00087 assert(rc == 0);
00088 <span class="preprocessor">#endif</span>
00089 <span class="preprocessor"></span> }
00090 }
00091 <span class="keywordtype">void</span> unlock() {
00092 <span class="keywordflow">if</span> (initialized) {
00093 <span class="preprocessor">#ifdef NDEBUG</span>
00094 <span class="preprocessor"></span> pthread_mutex_unlock(&cs);
00095 <span class="preprocessor">#else</span>
00096 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_unlock(&cs);
00097 assert(rc == 0);
00098 <span class="preprocessor">#endif</span>
00099 <span class="preprocessor"></span> }
00100 }
00101 };
00102
00103
00104 <span class="keyword">const</span> size_t dbThreadStackSize = 1024*1024;
00105
00106 <span class="keyword">class </span>dbThread {
00107 pthread_t thread;
00108 <span class="keyword">public</span>:
00109 <span class="keyword">typedef</span> void (thread_proc* thread_proc_t)(<span class="keywordtype">void</span>*);
00110
00111 <span class="keyword">static</span> <span class="keywordtype">void</span> sleep(time_t sec) {
00112 ::sleep(sec);
00113 }
00114
00115 <span class="keywordtype">void</span> create(thread_proc_t f, <span class="keywordtype">void</span>* arg) {
00116 pthread_attr_t attr;
00117 pthread_attr_init(&attr);
00118 <span class="preprocessor">#if !defined(__linux__)</span>
00119 <span class="preprocessor"></span> pthread_attr_setstacksize(&attr, dbThreadStackSize);
00120 <span class="preprocessor">#endif</span>
00121 <span class="preprocessor"></span><span class="preprocessor">#if defined(_AIX41)</span>
00122 <span class="preprocessor"></span> <span class="comment">// At AIX 4.1, 4.2 threads are by default created detached</span>
00123 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);
00124 <span class="preprocessor">#endif</span>
00125 <span class="preprocessor"></span> pthread_create(&thread, &attr, (<span class="keywordtype">void</span>*(*)(<span class="keywordtype">void</span>*))f, arg);
00126 pthread_attr_destroy(&attr);
00127 }
00128
00129 <span class="keywordtype">void</span> join() {
00130 <span class="keywordtype">void</span>* result;
00131 pthread_join(thread, &result);
00132 }
00133 <span class="keywordtype">void</span> detach() {
00134 pthread_detach(thread);
00135 }
00136
00137 <span class="keyword">enum</span> ThreadPriority {
00138 THR_PRI_LOW,
00139 THR_PRI_HIGH
00140 };
00141 <span class="keywordtype">void</span> setPriority(ThreadPriority pri) {
00142 <span class="preprocessor">#if defined(PRI_OTHER_MIN) && defined(PRI_OTHER_MAX)</span>
00143 <span class="preprocessor"></span> <span class="keyword">struct </span>sched_param sp;
00144 sp.sched_priority = pri == THR_PRI_LOW ? PRI_OTHER_MIN : PRI_OTHER_MAX;
00145 pthread_setschedparam(thread, SCHED_OTHER, &sp);
00146 <span class="preprocessor">#endif</span>
00147 <span class="preprocessor"></span> }
00148
00149 <span class="keyword">static</span> <span class="keywordtype">int</span> numberOfProcessors();
00150 };
00151
00152
00153 <span class="keyword">class </span>dbLocalEvent {
00154 pthread_cond_t cond;
00155 <span class="keywordtype">int</span> signaled;
00156 <span class="keyword">public</span>:
00157 <span class="keywordtype">void</span> wait(dbMutex& mutex) {
00158 <span class="keywordflow">while</span> (!signaled) {
00159 pthread_cond_wait(&cond, &mutex.cs);
00160 }
00161 }
00162 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeout) {
00163 <span class="keywordflow">if</span> (!signaled) {
00164 <span class="keyword">struct </span>timespec abs_ts;
00165 <span class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</span>
00166 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec rel_ts;
00167 rel_ts.tv_sec = timeout/1000;
00168 rel_ts.tv_nsec = timeout%1000*1000000;
00169 pthread_get_expiration_np(&rel_ts, &abs_ts);
00170 <span class="preprocessor">#else</span>
00171 <span class="preprocessor"></span> <span class="keyword">struct </span>timeval cur_tv;
00172 gettimeofday(&cur_tv, NULL);
00173 abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000;
00174 abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;
00175 <span class="keywordflow">if</span> (abs_ts.tv_nsec > 1000000000) {
00176 abs_ts.tv_nsec -= 1000000000;
00177 abs_ts.tv_sec += 1;
00178 }
00179 <span class="preprocessor">#endif</span>
00180 <span class="preprocessor"></span> <span class="keywordflow">do</span> {
00181 <span class="keywordtype">int</span> rc = pthread_cond_timedwait(&cond, &mutex.cs, &abs_ts);
00182 <span class="keywordflow">if</span> (rc != 0) {
00183 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00184 }
00185 } <span class="keywordflow">while</span> (!signaled);
00186
00187 }
00188 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00189 }
00190 <span class="keywordtype">void</span> signal() {
00191 signaled = <span class="keyword">true</span>;
00192 pthread_cond_broadcast(&cond);
00193 }
00194 <span class="keywordtype">void</span> reset() {
00195 signaled = <span class="keyword">false</span>;
00196 }
00197 <span class="keywordtype">void</span> open(<span class="keywordtype">bool</span> initValue = <span class="keyword">false</span>) {
00198 signaled = initValue;
00199 pthread_cond_init(&cond, NULL);
00200 }
00201 <span class="keywordtype">void</span> close() {
00202 pthread_cond_destroy(&cond);
00203 }
00204 };
00205
00206 <span class="keyword">class </span>dbLocalSemaphore {
00207 pthread_cond_t cond;
00208 <span class="keywordtype">int</span> count;
00209 <span class="keyword">public</span>:
00210 <span class="keywordtype">void</span> wait(dbMutex& mutex) {
00211 <span class="keywordflow">while</span> (count == 0) {
00212 pthread_cond_wait(&cond, &mutex.cs);
00213 }
00214 count -= 1;
00215 }
00216 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeout) {
00217 <span class="keywordflow">if</span> (count == 0) {
00218 <span class="keyword">struct </span>timespec abs_ts;
00219 <span class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</span>
00220 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec rel_ts;
00221 rel_ts.tv_sec = timeout/1000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -