⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync__unix_8h-source.html

📁 俄罗斯牛人KK的作品,著名的ORDBMS,这里上传最新的3.39版本源代码.希望了解对象关系数据库的同好,请不要错过.
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; </center><hr><h1>sync_unix.h</h1><div class="fragment"><pre>00001 <span class="comment">//-&lt; SYNC_UNIX.H &gt;---------------------------------------------------*--------*</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 &lt;unistd.h&gt;</span>00016 <span class="preprocessor">#include &lt;string.h&gt;</span>00017 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>00018 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>00019 <span class="preprocessor">#include &lt;sys/types.h&gt;</span>00020 <span class="preprocessor">#include &lt;assert.h&gt;</span>00021 <span class="preprocessor">#include &lt;errno.h&gt;</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 &lt;sys/ipc.h&gt;</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 &lt;semaphore.h&gt;</span>  <span class="comment">// For POSIX style semaphores</span>00030 <span class="preprocessor">#else</span>00031 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/sem.h&gt;</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) &amp;&amp; USE_POSIX_MMAP</span>00035 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/mman.h&gt;</span>   <span class="comment">// For mmap()</span>00036 <span class="preprocessor">#else</span>00037 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/shm.h&gt;</span>    00038 <span class="preprocessor">#include &lt;sys/mman.h&gt;</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 &lt;pthread.h&gt;</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(&amp;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(&amp;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(&amp;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(&amp;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(&amp;attr);00102 <span class="preprocessor">#if !defined(__linux__)</span>00103 <span class="preprocessor"></span>        pthread_attr_setstacksize(&amp;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(&amp;attr, PTHREAD_CREATE_UNDETACHED);00108 <span class="preprocessor">#endif</span>00109 <span class="preprocessor"></span>        pthread_create(&amp;thread, &amp;attr, (<span class="keywordtype">void</span>*(*)(<span class="keywordtype">void</span>*))f, arg);00110         pthread_attr_destroy(&amp;attr);00111     }00112 00113     <span class="keywordtype">void</span> join() { 00114         <span class="keywordtype">void</span>* result;00115         pthread_join(thread, &amp;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) &amp;&amp; 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, &amp;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&amp; mutex) { 00142         <span class="keywordflow">while</span> (!signaled) { 00143             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00144         }00145     }00146     <span class="keywordtype">bool</span> wait(dbMutex&amp; 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(&amp;rel_ts, &amp;abs_ts);00154 <span class="preprocessor">#else</span>00155 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;00156             gettimeofday(&amp;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 &gt; 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(&amp;cond, &amp;mutex.cs, &amp;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(&amp;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(&amp;cond, NULL);00184     }00185     <span class="keywordtype">void</span> close() {00186         pthread_cond_destroy(&amp;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&amp; mutex) { 00195         <span class="keywordflow">while</span> (count == 0) { 00196             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00197         }00198         count -= 1;00199     }00200     <span class="keywordtype">bool</span> wait(dbMutex&amp; 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(&amp;rel_ts, &amp;abs_ts);00208 <span class="preprocessor">#else</span>00209 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;00210             gettimeofday(&amp;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 &gt; 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(&amp;cond, &amp;mutex.cs, &amp;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 &gt; 1) { 00231             pthread_cond_broadcast(&amp;cond);00232         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inc == 1) { 00233             pthread_cond_signal(&amp;cond);00234         }00235     }00236     <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) { 00237         pthread_cond_init(&amp;cond, NULL);00238         count = initValue;00239     }00240     <span class="keywordtype">void</span> close() {00241         pthread_cond_destroy(&amp;cond);00242     }00243 };00244 00245 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; 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(&amp;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>&amp; 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 + -