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

📄 sync__unix_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<!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_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 &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="preprocessor">#ifdef NDEBUG</span>
00062 <span class="preprocessor"></span>        pthread_mutex_init(&amp;cs, NULL);
00063 <span class="preprocessor">#else</span>
00064 <span class="preprocessor"></span>        <span class="keywordtype">int</span> rc = pthread_mutex_init(&amp;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(&amp;cs);
00072 <span class="preprocessor">#else</span>
00073 <span class="preprocessor"></span>        <span class="keywordtype">int</span> rc = pthread_mutex_destroy(&amp;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(&amp;cs);
00085 <span class="preprocessor">#else</span>
00086 <span class="preprocessor"></span>            <span class="keywordtype">int</span> rc = pthread_mutex_lock(&amp;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(&amp;cs);
00095 <span class="preprocessor">#else</span>
00096 <span class="preprocessor"></span>            <span class="keywordtype">int</span> rc = pthread_mutex_unlock(&amp;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(&amp;attr);
00118 <span class="preprocessor">#if !defined(__linux__)</span>
00119 <span class="preprocessor"></span>        pthread_attr_setstacksize(&amp;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(&amp;attr, PTHREAD_CREATE_UNDETACHED);
00124 <span class="preprocessor">#endif</span>
00125 <span class="preprocessor"></span>        pthread_create(&amp;thread, &amp;attr, (<span class="keywordtype">void</span>*(*)(<span class="keywordtype">void</span>*))f, arg);
00126         pthread_attr_destroy(&amp;attr);
00127     }
00128 
00129     <span class="keywordtype">void</span> join() { 
00130         <span class="keywordtype">void</span>* result;
00131         pthread_join(thread, &amp;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) &amp;&amp; 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, &amp;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&amp; mutex) { 
00158         <span class="keywordflow">while</span> (!signaled) { 
00159             pthread_cond_wait(&amp;cond, &amp;mutex.cs);
00160         }
00161     }
00162     <span class="keywordtype">bool</span> wait(dbMutex&amp; 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(&amp;rel_ts, &amp;abs_ts);
00170 <span class="preprocessor">#else</span>
00171 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;
00172             gettimeofday(&amp;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 &gt; 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(&amp;cond, &amp;mutex.cs, &amp;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(&amp;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(&amp;cond, NULL);
00200     }
00201     <span class="keywordtype">void</span> close() {
00202         pthread_cond_destroy(&amp;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&amp; mutex) { 
00211         <span class="keywordflow">while</span> (count == 0) { 
00212             pthread_cond_wait(&amp;cond, &amp;mutex.cs);
00213         }
00214         count -= 1;
00215     }
00216     <span class="keywordtype">bool</span> wait(dbMutex&amp; 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 + -