📄 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_NAMESPACE
00451
00452 <span class="preprocessor">#endif //__SYNC_W32_H__</span>
</pre></div><hr><address style="align: right;"><small>Generated on Thu Feb 14 12:42:30 2008 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 + -