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> <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.h</h1><div class="fragment"><pre>00001 <font class="comment">//-< SYNC.H >--------------------------------------------------------*--------*</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(&sd, SECURITY_DESCRIPTOR_REVISION);00029 SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);00030 sa.nLength = <font class="keyword">sizeof</font>(sa);00031 sa.bInheritHandle = TRUE; 00032 sa.lpSecurityDescriptor = &sd;00033 }00034 00035 <font class="keyword">static</font> dbNullSecurityDesciptor instance;00036 };00037 <font class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES &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(&cs);00047 }00048 ~dbMutex() { 00049 DeleteCriticalSection(&cs);00050 }00051 <font class="keywordtype">void</font> lock() { 00052 EnterCriticalSection(&cs);00053 }00054 <font class="keywordtype">void</font> unlock() { 00055 LeaveCriticalSection(&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, &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(&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>& 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& 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& 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& 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& 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><<font class="keyword">class</font> T>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><<font class="keyword">class</font> T>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 + -
显示快捷键?