sync_8h-source.html

来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 1,178 行 · 第 1/4 页

HTML
1,178
字号
<!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.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.2.15 --><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.h</h1><div class="fragment"><pre>00001 <font class="comment">//-&lt; SYNC.H &gt;--------------------------------------------------------*--------*</font>00002 <font class="comment">// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *</font>00003 <font class="comment">// (Main Memory Database Management System)                          *   /\|  *</font>00004 <font class="comment">//                                                                   *  /  \  *</font>00005 <font class="comment">//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *</font>00006 <font class="comment">//                          Last update: 20-Dec-98    K.A. Knizhnik  * GARRET *</font>00007 <font class="comment">//-------------------------------------------------------------------*--------*</font>00008 <font class="comment">// Intertask synchonization primitives</font>00009 <font class="comment">//-------------------------------------------------------------------*--------*</font>00010 00011 <font class="preprocessor">#ifndef __SYNC_H__</font>00012 <font class="preprocessor"></font><font class="preprocessor">#define __SYNC_H__</font>00013 <font class="preprocessor"></font>00014 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbSystem { 00015   <font class="keyword">public</font>:00016     <font class="keyword">static</font> <font class="keywordtype">unsigned</font> getCurrentTimeMsec();00017 };00018 00019 <font class="preprocessor">#ifdef _WIN32</font>00020 <font class="preprocessor"></font>00021 <font class="preprocessor">#ifdef SET_NULL_DACL</font>00022 <font class="preprocessor"></font><font class="keyword">class </font>FASTDB_DLL_ENTRY dbNullSecurityDesciptor { 00023   <font class="keyword">public</font>:00024     SECURITY_DESCRIPTOR sd;00025     SECURITY_ATTRIBUTES sa; 00026 00027     dbNullSecurityDesciptor() { 00028         InitializeSecurityDescriptor(&amp;sd, SECURITY_DESCRIPTOR_REVISION);00029         SetSecurityDescriptorDacl(&amp;sd, TRUE, NULL, FALSE);00030         sa.nLength = <font class="keyword">sizeof</font>(sa);00031         sa.bInheritHandle = TRUE; 00032         sa.lpSecurityDescriptor = &amp;sd;00033     }00034     00035     <font class="keyword">static</font> dbNullSecurityDesciptor instance;00036 };00037 <font class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES &amp;dbNullSecurityDesciptor::instance.sa</font>00038 <font class="preprocessor"></font><font class="preprocessor">#else    </font>00039 <font class="preprocessor"></font><font class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES NULL</font>00040 <font class="preprocessor"></font><font class="preprocessor">#endif</font>00041 <font class="preprocessor"></font>00042 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbMutex { 00043     CRITICAL_SECTION cs;00044   <font class="keyword">public</font>:00045     dbMutex() { 00046         InitializeCriticalSection(&amp;cs);00047     }00048     ~dbMutex() { 00049         DeleteCriticalSection(&amp;cs);00050     }00051     <font class="keywordtype">void</font> lock() { 00052         EnterCriticalSection(&amp;cs);00053     }00054     <font class="keywordtype">void</font> unlock() { 00055         LeaveCriticalSection(&amp;cs);00056     }00057 };00058 00059 <font class="preprocessor">#define thread_proc WINAPI</font>00060 <font class="preprocessor"></font>00061 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbThread { 00062     HANDLE h;00063   <font class="keyword">public</font>:00064     <font class="keyword">typedef</font> void (thread_proc* thread_proc_t)(<font class="keywordtype">void</font>*);00065 00066     <font class="keywordtype">void</font> create(thread_proc_t f, <font class="keywordtype">void</font>* arg) { 00067         DWORD threadid;00068         h = CreateThread(FASTDB_SECURITY_ATTRIBUTES, NULL, LPTHREAD_START_ROUTINE(f), arg,00069                          0, &amp;threadid);00070     }00071     <font class="keyword">enum</font> ThreadPriority { 00072         THR_PRI_LOW, 00073         THR_PRI_HIGH00074     };00075 00076     <font class="keywordtype">void</font> setPriority(ThreadPriority pri) { 00077         SetThreadPriority(h, pri == THR_PRI_LOW ? THREAD_PRIORITY_IDLE : THREAD_PRIORITY_HIGHEST);00078     }00079         00080     <font class="keywordtype">void</font> join() { 00081         WaitForSingleObject(h, INFINITE);00082         CloseHandle(h);00083         h = NULL;00084     }00085     <font class="keywordtype">void</font> detach() { 00086         <font class="keywordflow">if</font> (h != NULL) { 00087             CloseHandle(h);00088             h = NULL;00089         }00090     }   00091     dbThread() { 00092         h = NULL; 00093     }00094     ~dbThread() { 00095         <font class="keywordflow">if</font> (h != NULL) { 00096             CloseHandle(h);00097         }00098     }00099     <font class="keyword">static</font> <font class="keywordtype">int</font> numberOfProcessors() { 00100 <font class="preprocessor">#ifdef PHAR_LAP</font>00101 <font class="preprocessor"></font>        <font class="keywordflow">return</font> 1;00102 <font class="preprocessor">#else</font>00103 <font class="preprocessor"></font>        SYSTEM_INFO sysinfo;00104         GetSystemInfo(&amp;sysinfo);00105         <font class="keywordflow">return</font> sysinfo.dwNumberOfProcessors;00106 <font class="preprocessor">#endif</font>00107 <font class="preprocessor"></font>    }00108 };00109     00110 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbProcessId { 00111     DWORD tid;00112   <font class="keyword">public</font>:00113     <font class="keywordtype">bool</font> operator != (dbProcessId <font class="keyword">const</font>&amp; other)<font class="keyword"> const </font>{ 00114         <font class="keywordflow">return</font> tid != other.tid;00115     }00116 00117     <font class="keywordtype">void</font> clear() { 00118         tid = 0;00119     }00120 00121     <font class="keyword">static</font> dbProcessId getCurrent() {00122         dbProcessId curr;00123         curr.tid = GetCurrentThreadId();00124         <font class="keywordflow">return</font> curr;00125     }00126 };00127 00128 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbInitializationMutex { 00129     HANDLE m;00130   <font class="keyword">public</font>: 00131     <font class="keyword">enum</font> initializationStatus { 00132         InitializationError, 00133         AlreadyInitialized,00134         NotYetInitialized00135     };00136     initializationStatus initialize(<font class="keywordtype">char</font> <font class="keyword">const</font>* name) { 00137         initializationStatus status;00138         m = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, <font class="keyword">true</font>, name);00139         <font class="keywordflow">if</font> (GetLastError() == ERROR_ALREADY_EXISTS) { 00140             status = WaitForSingleObject(m, INFINITE) == WAIT_OBJECT_0 00141                    ? AlreadyInitialized : InitializationError;00142             ReleaseMutex(m);00143         } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (m != NULL) { 00144             status = NotYetInitialized;00145         } <font class="keywordflow">else</font> { 00146             status = InitializationError;00147         }00148         <font class="keywordflow">return</font> status;00149     }00150     <font class="keywordtype">void</font> done() { 00151         ReleaseMutex(m);00152     }00153     <font class="keywordtype">bool</font> close() {00154         CloseHandle(m);00155         <font class="keywordflow">return</font> <font class="keyword">false</font>;00156     }00157     <font class="keywordtype">void</font> erase() { 00158         close();00159     }00160 };00161 00162 00163 <font class="keyword">const</font> <font class="keywordtype">int</font> dbMaxSemValue = 1000000;00164 00165 00166 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbSemaphore { 00167   <font class="keyword">protected</font>:00168     HANDLE s;00169   <font class="keyword">public</font>:00170     <font class="keywordtype">bool</font> wait(<font class="keywordtype">unsigned</font> msec = INFINITE) { 00171         <font class="keywordtype">int</font> rc = WaitForSingleObject(s, msec);00172         assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00173         <font class="keywordflow">return</font> rc == WAIT_OBJECT_0;00174     }00175     <font class="keywordtype">void</font> signal(<font class="keywordtype">unsigned</font> inc = 1) {00176         <font class="keywordflow">if</font> (inc != 0) { 00177             ReleaseSemaphore(s, inc, NULL);00178         }00179     }00180     <font class="keywordtype">void</font> reset() { 00181         <font class="keywordflow">while</font> (WaitForSingleObject(s, 0) == WAIT_OBJECT_0);00182     }    00183     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">unsigned</font> initValue = 0) {00184         s = CreateSemaphore(FASTDB_SECURITY_ATTRIBUTES, initValue, dbMaxSemValue, name);00185         <font class="keywordflow">return</font> s != NULL; 00186     }00187     <font class="keywordtype">void</font> close() {00188         CloseHandle(s);00189     }00190     <font class="keywordtype">void</font> erase() { 00191         close();00192     }00193 };00194 00195 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbEvent { 00196   <font class="keyword">protected</font>:00197     HANDLE e;00198   <font class="keyword">public</font>:00199     <font class="keywordtype">bool</font> wait(<font class="keywordtype">unsigned</font> msec = INFINITE) { 00200         <font class="keywordtype">int</font> rc = WaitForSingleObject(e, msec);00201         assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00202         <font class="keywordflow">return</font> rc == WAIT_OBJECT_0;00203     }00204     <font class="keywordtype">void</font> signal() {00205         SetEvent(e);00206     }00207     <font class="keywordtype">void</font> reset() {00208         ResetEvent(e);00209     }00210     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">bool</font> signaled = <font class="keyword">false</font>) {00211         e = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, <font class="keyword">true</font>, signaled, name);00212         <font class="keywordflow">return</font> e != NULL; 00213     }00214     <font class="keywordtype">void</font> close() {00215         CloseHandle(e);00216     }00217     <font class="keywordtype">void</font> erase() { 00218         close();00219     }00220 };00221 00222 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbLocalSemaphore : <font class="keyword">public</font> dbSemaphore { 00223   <font class="keyword">public</font>:00224     <font class="keywordtype">bool</font> wait(dbMutex&amp; mutex, time_t timeoutMsec) { 00225         mutex.unlock();00226         <font class="keywordtype">int</font> rc = WaitForSingleObject(s, timeoutMsec);00227         assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00228         mutex.lock();00229         <font class="keywordflow">return</font> rc == WAIT_OBJECT_0;00230     }00231     <font class="keywordtype">void</font> wait(dbMutex&amp; mutex) { 00232         mutex.unlock();00233         <font class="keywordtype">int</font> rc = WaitForSingleObject(s, INFINITE);00234         assert(rc == WAIT_OBJECT_0);00235         mutex.lock();00236     }00237     <font class="keywordtype">bool</font> open(<font class="keywordtype">unsigned</font> initValue = 0) {00238         <font class="keywordflow">return</font> dbSemaphore::open(NULL, initValue);00239     }00240 };00241 00242 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbLocalEvent : <font class="keyword">public</font> dbEvent { 00243   <font class="keyword">public</font>:00244     <font class="keywordtype">bool</font> wait(dbMutex&amp; mutex, time_t timeoutMsec) { 00245         mutex.unlock();00246         <font class="keywordtype">int</font> rc = WaitForSingleObject(e, timeoutMsec);00247         assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00248         mutex.lock();00249         <font class="keywordflow">return</font> rc == WAIT_OBJECT_0;00250     }00251     <font class="keywordtype">void</font> wait(dbMutex&amp; mutex) { 00252         mutex.unlock();00253         <font class="keywordtype">int</font> rc = WaitForSingleObject(e, INFINITE);00254         assert(rc == WAIT_OBJECT_0);00255         mutex.lock();00256     }00257     <font class="keywordtype">bool</font> open(<font class="keywordtype">bool</font> signaled = <font class="keyword">false</font>) {00258          <font class="keywordflow">return</font> dbEvent::open(NULL, signaled);00259      }00260 };00261 00262 <font class="keyword">template</font>&lt;<font class="keyword">class</font> T&gt;00263 <font class="keyword">class </font>dbThreadContext { 00264     <font class="keywordtype">int</font> index;00265   <font class="keyword">public</font>:00266     T* get() { 00267         <font class="keywordflow">return</font> (T*)TlsGetValue(index);00268     }00269     <font class="keywordtype">void</font> set(T* value) { 00270         TlsSetValue(index, value);00271     }00272     dbThreadContext() { 00273         index = TlsAlloc();00274         assert(index != TLS_OUT_OF_INDEXES);00275     }00276     ~dbThreadContext() { 00277         TlsFree(index);00278     }00279 };00280 00281 <font class="keyword">template</font>&lt;<font class="keyword">class</font> T&gt;00282 <font class="keyword">class </font>dbSharedObject { 00283     T*     ptr;00284     HANDLE h;00285   <font class="keyword">public</font>:00286 00287     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font>* name) { 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?