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

📄 sync__unix_8h-source.html

📁 FastDb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a></div><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;errno.h&gt;</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 &lt;sys/ipc.h&gt;</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 &lt;semaphore.h&gt;</span>  <span class="comment">// For POSIX style semaphores</span>00029 <span class="preprocessor">#else</span>00030 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/sem.h&gt;</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) &amp;&amp; USE_POSIX_MMAP</span>00034 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/mman.h&gt;</span>   <span class="comment">// For mmap()</span>00035 <span class="preprocessor">#else</span>00036 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sys/shm.h&gt;</span>    00037 <span class="preprocessor">#include &lt;sys/mman.h&gt;</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 &lt;pthread.h&gt;</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(&amp;cs, NULL);00060         initialized = <span class="keyword">true</span>;00061     }00062     ~dbMutex() {00063         pthread_mutex_destroy(&amp;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(&amp;cs);00072         }00073     }00074     <span class="keywordtype">void</span> unlock() {00075         <span class="keywordflow">if</span> (initialized) { 00076             pthread_mutex_unlock(&amp;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(&amp;attr);00090 <span class="preprocessor">#if !defined(__linux__)</span>00091 <span class="preprocessor"></span>        pthread_attr_setstacksize(&amp;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(&amp;attr, PTHREAD_CREATE_UNDETACHED);00096 <span class="preprocessor">#endif</span>00097 <span class="preprocessor"></span>        pthread_create(&amp;thread, &amp;attr, (<span class="keywordtype">void</span>*(*)(<span class="keywordtype">void</span>*))f, arg);00098         pthread_attr_destroy(&amp;attr);00099     }00100 00101     <span class="keywordtype">void</span> join() { 00102         <span class="keywordtype">void</span>* result;00103         pthread_join(thread, &amp;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) &amp;&amp; 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, &amp;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&amp; mutex) { 00130         <span class="keywordflow">while</span> (!signaled) { 00131             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00132         }00133     }00134     <span class="keywordtype">bool</span> wait(dbMutex&amp; 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(&amp;rel_ts, &amp;abs_ts);00142 <span class="preprocessor">#else</span>00143 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;00144             gettimeofday(&amp;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 &gt; 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(&amp;cond, &amp;mutex.cs, &amp;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(&amp;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(&amp;cond, NULL);00169     }00170     <span class="keywordtype">void</span> close() {00171         pthread_cond_destroy(&amp;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&amp; mutex) { 00180         <span class="keywordflow">while</span> (count == 0) { 00181             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00182         }00183         count -= 1;00184     }00185     <span class="keywordtype">void</span> wait(dbMutex&amp; 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(&amp;rel_ts, &amp;abs_ts);00193 <span class="preprocessor">#else</span>00194 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;00195             gettimeofday(&amp;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 &gt; 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(&amp;cond, &amp;mutex.cs, &amp;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 &gt; 1) { 00210             pthread_cond_broadcast(&amp;cond);00211         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inc == 1) { 00212             pthread_cond_signal(&amp;cond);00213         }00214     }00215     <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) { 00216         pthread_cond_init(&amp;cond, NULL);00217         count = initValue;00218     }00219     <span class="keywordtype">void</span> close() {00220         pthread_cond_destroy(&amp;cond);00221     }00222 };00223 00224 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; 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(&amp;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>&amp; 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 + -