📄 sync__w32_8h-source.html
字号:
<!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_w32.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> <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_w32.h</h1><div class="fragment"><pre>00001 <span class="comment">//-< SYNC_W32.H >----------------------------------------------------*--------*</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</span>00009 <span class="comment">//-------------------------------------------------------------------*--------*</span>00010 00011 <span class="preprocessor">#ifndef __SYNC_W32_H__</span>00012 <span class="preprocessor"></span><span class="preprocessor">#define __SYNC_W32_H__</span>00013 <span class="preprocessor"></span>00014 BEGIN_FASTDB_NAMESPACE00015 00016 <span class="preprocessor">#ifdef SET_NULL_DACL</span>00017 <span class="preprocessor"></span><span class="keyword">class </span>FASTDB_DLL_ENTRY dbNullSecurityDesciptor { 00018 <span class="keyword">public</span>:00019 SECURITY_DESCRIPTOR sd;00020 SECURITY_ATTRIBUTES sa; 00021 00022 dbNullSecurityDesciptor() { 00023 InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);00024 SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);00025 sa.nLength = <span class="keyword">sizeof</span>(sa);00026 sa.bInheritHandle = TRUE; 00027 sa.lpSecurityDescriptor = &sd;00028 }00029 00030 <span class="keyword">static</span> dbNullSecurityDesciptor instance;00031 };00032 <span class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES &dbNullSecurityDesciptor::instance.sa</span>00033 <span class="preprocessor"></span><span class="preprocessor">#else </span>00034 <span class="preprocessor"></span><span class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES NULL</span>00035 <span class="preprocessor"></span><span class="preprocessor">#endif</span>00036 <span class="preprocessor"></span>00037 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbMutex { 00038 CRITICAL_SECTION cs;00039 <span class="keywordtype">bool</span> initialized;00040 <span class="keyword">public</span>:00041 dbMutex() {00042 InitializeCriticalSection(&cs);00043 initialized = <span class="keyword">true</span>;00044 }00045 ~dbMutex() {00046 DeleteCriticalSection(&cs);00047 initialized = <span class="keyword">false</span>;00048 }00049 <span class="keywordtype">bool</span> isInitialized() { 00050 <span class="keywordflow">return</span> initialized;00051 }00052 <span class="keywordtype">void</span> lock() {00053 <span class="keywordflow">if</span> (initialized) { 00054 EnterCriticalSection(&cs);00055 }00056 }00057 <span class="keywordtype">void</span> unlock() {00058 <span class="keywordflow">if</span> (initialized) { 00059 LeaveCriticalSection(&cs);00060 }00061 }00062 };00063 00064 <span class="preprocessor">#define thread_proc WINAPI</span>00065 <span class="preprocessor"></span>00066 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbThread { 00067 HANDLE h;00068 <span class="keyword">public</span>:00069 <span class="keyword">typedef</span> void (thread_proc* thread_proc_t)(<span class="keywordtype">void</span>*);00070 00071 <span class="keyword">static</span> <span class="keywordtype">void</span> sleep(time_t sec) { 00072 Sleep(sec*1000);00073 }00074 00075 00076 <span class="keywordtype">void</span> create(thread_proc_t f, <span class="keywordtype">void</span>* arg) { 00077 DWORD threadid;00078 h = CreateThread(FASTDB_SECURITY_ATTRIBUTES, 0, LPTHREAD_START_ROUTINE(f), arg,00079 0, &threadid);00080 }00081 <span class="keyword">enum</span> ThreadPriority { 00082 THR_PRI_LOW, 00083 THR_PRI_HIGH00084 };00085 00086 <span class="keywordtype">void</span> setPriority(ThreadPriority pri) { 00087 SetThreadPriority(h, pri == THR_PRI_LOW ? THREAD_PRIORITY_IDLE : THREAD_PRIORITY_HIGHEST);00088 }00089 00090 <span class="keywordtype">void</span> join() { 00091 WaitForSingleObject(h, INFINITE);00092 CloseHandle(h);00093 h = NULL;00094 }00095 <span class="keywordtype">void</span> detach() { 00096 <span class="keywordflow">if</span> (h != NULL) { 00097 CloseHandle(h);00098 h = NULL;00099 }00100 } 00101 dbThread() { 00102 h = NULL; 00103 }00104 ~dbThread() { 00105 <span class="keywordflow">if</span> (h != NULL) { 00106 CloseHandle(h);00107 }00108 }00109 <span class="keyword">static</span> <span class="keywordtype">int</span> numberOfProcessors() { 00110 <span class="preprocessor">#ifdef PHAR_LAP</span>00111 <span class="preprocessor"></span> <span class="keywordflow">return</span> 1;00112 <span class="preprocessor">#else</span>00113 <span class="preprocessor"></span> SYSTEM_INFO sysinfo;00114 GetSystemInfo(&sysinfo);00115 <span class="keywordflow">return</span> sysinfo.dwNumberOfProcessors;00116 <span class="preprocessor">#endif</span>00117 <span class="preprocessor"></span> }00118 };00119 00120 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbProcessId { 00121 DWORD tid;00122 <span class="keyword">public</span>:00123 <span class="keywordtype">bool</span> operator != (dbProcessId <span class="keyword">const</span>& other)<span class="keyword"> const </span>{ 00124 <span class="keywordflow">return</span> tid != other.tid;00125 }00126 00127 <span class="keywordtype">void</span> clear() { 00128 tid = 0;00129 }00130 00131 <span class="keyword">static</span> dbProcessId getCurrent() {00132 dbProcessId curr;00133 curr.tid = GetCurrentThreadId();00134 <span class="keywordflow">return</span> curr;00135 }00136 };00137 00138 00139 00140 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbInitializationMutex { 00141 HANDLE m;00142 <span class="keyword">public</span>: 00143 <span class="keyword">enum</span> initializationStatus { 00144 InitializationError, 00145 AlreadyInitialized,00146 NotYetInitialized00147 };00148 initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name) { 00149 initializationStatus status;00150 m = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, <span class="keyword">true</span>, W32_STRING(name));00151 <span class="keywordflow">if</span> (GetLastError() == ERROR_ALREADY_EXISTS) { 00152 status = WaitForSingleObject(m, INFINITE) == WAIT_OBJECT_0 00153 ? AlreadyInitialized : InitializationError;00154 ReleaseMutex(m);00155 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m != NULL) { 00156 status = NotYetInitialized;00157 } <span class="keywordflow">else</span> { 00158 status = InitializationError;00159 }00160 <span class="keywordflow">return</span> status;00161 }00162 <span class="keywordtype">void</span> done() { 00163 ReleaseMutex(m);00164 }00165 <span class="keywordtype">bool</span> close() {00166 CloseHandle(m);00167 <span class="keywordflow">return</span> <span class="keyword">false</span>;00168 }00169 <span class="keywordtype">void</span> erase() { 00170 close();00171 }00172 dbInitializationMutex() { 00173 m = NULL;00174 }00175 };00176 00177 00178 <span class="keyword">const</span> <span class="keywordtype">int</span> dbMaxSemValue = 1000000;00179 00180 00181 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbSemaphore { 00182 <span class="keyword">protected</span>:00183 HANDLE s;00184 <span class="keyword">public</span>:00185 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE) { 00186 <span class="keywordtype">int</span> rc = WaitForSingleObject(s, msec);00187 assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00188 <span class="keywordflow">return</span> rc == WAIT_OBJECT_0;00189 }00190 <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {00191 <span class="keywordflow">if</span> (inc != 0) { 00192 ReleaseSemaphore(s, inc, NULL);00193 }00194 }00195 <span class="keywordtype">void</span> reset() { 00196 <span class="keywordflow">while</span> (WaitForSingleObject(s, 0) == WAIT_OBJECT_0);00197 } 00198 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0) {00199 s = CreateSemaphore(FASTDB_SECURITY_ATTRIBUTES, initValue, dbMaxSemValue, W32_STRING(name));00200 <span class="keywordflow">return</span> s != NULL; 00201 }00202 <span class="keywordtype">void</span> close() {00203 CloseHandle(s);00204 }00205 <span class="keywordtype">void</span> erase() { 00206 close();00207 }00208 dbSemaphore() { 00209 s = NULL;00210 }00211 };00212 00213 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbEvent { 00214 <span class="keyword">protected</span>:00215 HANDLE e;00216 <span class="keyword">public</span>:00217 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE) { 00218 <span class="keywordtype">int</span> rc = WaitForSingleObject(e, msec);00219 assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00220 <span class="keywordflow">return</span> rc == WAIT_OBJECT_0;00221 }00222 <span class="keywordtype">void</span> signal() {00223 SetEvent(e);00224 }00225 <span class="keywordtype">void</span> reset() {00226 ResetEvent(e);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -