📄 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_NAMESPACE
00015
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((DWORD)(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_HIGH
00084 };
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 NotYetInitialized
00147 };
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 + -