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

📄 sync__w32_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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> &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_w32.h</h1><div class="fragment"><pre>00001 <span class="comment">//-&lt; SYNC_W32.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</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(&amp;sd, SECURITY_DESCRIPTOR_REVISION);
00024         SetSecurityDescriptorDacl(&amp;sd, TRUE, NULL, FALSE);
00025         sa.nLength = <span class="keyword">sizeof</span>(sa);
00026         sa.bInheritHandle = TRUE; 
00027         sa.lpSecurityDescriptor = &amp;sd;
00028     }
00029     
00030     <span class="keyword">static</span> dbNullSecurityDesciptor instance;
00031 };
00032 <span class="preprocessor">#define FASTDB_SECURITY_ATTRIBUTES &amp;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(&amp;cs);
00043         initialized = <span class="keyword">true</span>;
00044     }
00045     ~dbMutex() {
00046         DeleteCriticalSection(&amp;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(&amp;cs);
00055         }
00056     }
00057     <span class="keywordtype">void</span> unlock() {
00058         <span class="keywordflow">if</span> (initialized) { 
00059             LeaveCriticalSection(&amp;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, &amp;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(&amp;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>&amp; 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 + -