📄 sync__w32_8h-source.html
字号:
00227 }00228 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">bool</span> signaled = <span class="keyword">false</span>) {00229 e = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, <span class="keyword">true</span>, signaled, W32_STRING(name));00230 <span class="keywordflow">return</span> e != NULL; 00231 }00232 <span class="keywordtype">void</span> close() {00233 CloseHandle(e);00234 }00235 <span class="keywordtype">void</span> erase() { 00236 close();00237 }00238 dbEvent() { 00239 e = NULL;00240 }00241 };00242 00243 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbLocalSemaphore : <span class="keyword">public</span> dbSemaphore { 00244 <span class="keyword">public</span>:00245 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeoutMsec) { 00246 mutex.unlock();00247 <span class="keywordtype">int</span> rc = WaitForSingleObject(s, (DWORD)timeoutMsec);00248 assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00249 mutex.lock();00250 <span class="keywordflow">return</span> rc == WAIT_OBJECT_0;00251 }00252 <span class="keywordtype">void</span> wait(dbMutex& mutex) { 00253 mutex.unlock();00254 <span class="keywordtype">int</span> rc = WaitForSingleObject(s, INFINITE);00255 assert(rc == WAIT_OBJECT_0);00256 mutex.lock();00257 }00258 <span class="keywordtype">bool</span> open(<span class="keywordtype">unsigned</span> initValue = 0) {00259 <span class="keywordflow">return</span> dbSemaphore::open(NULL, initValue);00260 }00261 };00262 00263 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbLocalEvent : <span class="keyword">public</span> dbEvent { 00264 <span class="keyword">public</span>:00265 <span class="keywordtype">bool</span> wait(dbMutex& mutex, time_t timeoutMsec) { 00266 mutex.unlock();00267 <span class="keywordtype">int</span> rc = WaitForSingleObject(e, (DWORD)timeoutMsec);00268 assert(rc == WAIT_OBJECT_0 || rc == WAIT_TIMEOUT);00269 mutex.lock();00270 <span class="keywordflow">return</span> rc == WAIT_OBJECT_0;00271 }00272 <span class="keywordtype">void</span> wait(dbMutex& mutex) { 00273 mutex.unlock();00274 <span class="keywordtype">int</span> rc = WaitForSingleObject(e, INFINITE);00275 assert(rc == WAIT_OBJECT_0);00276 mutex.lock();00277 }00278 <span class="keywordtype">bool</span> open(<span class="keywordtype">bool</span> signaled = <span class="keyword">false</span>) {00279 <span class="keywordflow">return</span> dbEvent::open(NULL, signaled);00280 }00281 };00282 00283 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbWatchDog { 00284 <span class="keyword">public</span>:00285 <span class="keywordtype">bool</span> watch() { 00286 <span class="keywordflow">return</span> WaitForSingleObject(mutex, INFINITE) == ERROR_WAIT_NO_CHILDREN;00287 }00288 <span class="keywordtype">void</span> close() { 00289 CloseHandle(mutex);00290 }00291 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name) {00292 mutex = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, <span class="keyword">true</span>, W32_STRING(name));00293 <span class="keywordflow">return</span> mutex != NULL;00294 }00295 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name) {00296 <span class="preprocessor">#if defined(_WINCE) || defined(UNICODE)</span>00297 <span class="preprocessor"></span> <span class="keywordflow">return</span> create(name);00298 <span class="preprocessor">#else</span>00299 <span class="preprocessor"></span> mutex = OpenMutex(MUTEX_ALL_ACCESS, <span class="keyword">false</span>, name);00300 <span class="keywordflow">return</span> mutex != NULL;00301 <span class="preprocessor">#endif</span>00302 <span class="preprocessor"></span> }00303 HANDLE mutex;00304 };00305 00306 <span class="keyword">template</span><<span class="keyword">class</span> T>00307 <span class="keyword">class </span>dbThreadContext { 00308 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index;00309 <span class="keyword">public</span>:00310 T* get() { 00311 <span class="keywordflow">return</span> (T*)TlsGetValue(index);00312 }00313 <span class="keywordtype">void</span> set(T* value) { 00314 TlsSetValue(index, value);00315 }00316 dbThreadContext() { 00317 index = TlsAlloc();00318 assert(index != TLS_OUT_OF_INDEXES);00319 }00320 ~dbThreadContext() { 00321 TlsFree(index);00322 }00323 };00324 00325 <span class="keyword">template</span><<span class="keyword">class</span> T>00326 <span class="keyword">class </span>dbSharedObject { 00327 T* ptr;00328 HANDLE h;00329 <span class="keyword">public</span>:00330 00331 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* name) { 00332 <span class="preprocessor">#ifdef NO_MMAP</span>00333 <span class="preprocessor"></span> ptr = <span class="keyword">new</span> T();00334 <span class="preprocessor">#else</span>00335 <span class="preprocessor"></span> h = CreateFileMapping(INVALID_HANDLE_VALUE,00336 FASTDB_SECURITY_ATTRIBUTES, PAGE_READWRITE, 0, 00337 <span class="keyword">sizeof</span>(T), W32_STRING(name));00338 <span class="keywordflow">if</span> (h == NULL) { 00339 <span class="keywordflow">return</span> <span class="keyword">false</span>;00340 }00341 ptr = (T*)MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0);00342 <span class="keywordflow">if</span> (ptr == NULL) { 00343 CloseHandle(h);00344 <span class="keywordflow">return</span> <span class="keyword">false</span>;00345 }00346 <span class="preprocessor">#endif</span>00347 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;00348 }00349 00350 T* get() { <span class="keywordflow">return</span> ptr; }00351 00352 <span class="keywordtype">void</span> close() { 00353 <span class="preprocessor">#ifdef NO_MMAP</span>00354 <span class="preprocessor"></span> <span class="keyword">delete</span>[] ptr;00355 <span class="preprocessor">#else</span>00356 <span class="preprocessor"></span> UnmapViewOfFile(ptr);00357 CloseHandle(h);00358 <span class="preprocessor">#endif</span>00359 <span class="preprocessor"></span> }00360 <span class="keywordtype">void</span> erase() { 00361 close();00362 }00363 dbSharedObject() { 00364 ptr = NULL;00365 h = NULL;00366 }00367 };00368 00369 <span class="keyword">typedef</span> <span class="keywordtype">long</span> sharedsem_t;00370 00371 <span class="preprocessor">#ifdef RECOVERABLE_CRITICAL_SECTION</span>00372 <span class="preprocessor"></span><span class="keyword">class </span>FASTDB_DLL_ENTRY dbGlobalCriticalSection { 00373 HANDLE mutex;00374 <span class="keyword">public</span>:00375 <span class="keywordtype">void</span> enter() { 00376 <span class="keywordtype">int</span> rc = WaitForSingleObject(mutex, INFINITE);00377 assert (rc == WAIT_OBJECT_0 || rc == WAIT_ABANDONED);00378 }00379 00380 <span class="keywordtype">void</span> leave() {00381 ReleaseMutex(mutex);00382 }00383 00384 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">long</span>* count) { 00385 mutex = CreateMutex(FASTDB_SECURITY_ATTRIBUTES, <span class="keyword">false</span>, W32_STRING(name));00386 <span class="keywordflow">return</span> mutex != NULL;00387 }00388 00389 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">long</span>* count) { 00390 mutex = OpenMutex(MUTEX_ALL_ACCESS, <span class="keyword">true</span>, W32_STRING(name));00391 <span class="keywordflow">return</span> mutex != NULL;00392 }00393 00394 <span class="keywordtype">void</span> close() { 00395 CloseHandle(mutex);00396 }00397 <span class="keywordtype">void</span> erase() { 00398 close();00399 }00400 dbGlobalCriticalSection() {00401 mutex = NULL;00402 }00403 00404 };00405 <span class="preprocessor">#else</span>00406 <span class="preprocessor"></span><span class="keyword">class </span>FASTDB_DLL_ENTRY dbGlobalCriticalSection { 00407 HANDLE event;00408 sharedsem_t* count;00409 00410 <span class="keyword">public</span>:00411 <span class="keywordtype">void</span> enter() { 00412 <span class="keywordflow">if</span> (InterlockedDecrement(count) != 0) { 00413 <span class="comment">// another process is in critical section</span>00414 <span class="keywordtype">int</span> rc = WaitForSingleObject(event, INFINITE);00415 assert (rc == WAIT_OBJECT_0);00416 }00417 }00418 00419 <span class="keywordtype">void</span> leave() { 00420 <span class="keywordflow">if</span> (InterlockedIncrement(count) <= 0) { 00421 <span class="comment">// some other processes try to enter critical section</span>00422 SetEvent(event);00423 }00424 }00425 00426 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">long</span>* count) { 00427 this->count = count;00428 event = OpenEvent(EVENT_ALL_ACCESS, FALSE, W32_STRING(name));00429 <span class="keywordflow">return</span> event != NULL;00430 }00431 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">long</span>* count) { 00432 this->count = count;00433 *count = 1;00434 event = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, <span class="keyword">false</span>, <span class="keyword">false</span>, W32_STRING(name));00435 <span class="keywordflow">return</span> event != NULL;00436 }00437 <span class="keywordtype">void</span> close() { 00438 CloseHandle(event);00439 }00440 <span class="keywordtype">void</span> erase() { 00441 close();00442 }00443 dbGlobalCriticalSection() {00444 event = NULL;00445 }00446 00447 };00448 <span class="preprocessor">#endif</span>00449 <span class="preprocessor"></span>00450 END_FASTDB_NAMESPACE00451 00452 <span class="preprocessor">#endif //__SYNC_W32_H__</span></pre></div><hr><address style="align: right;"><small>Generated on Mon Oct 23 13:23:58 2006 for FastDB by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.18 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -