sync_8h-source.html
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 1,178 行 · 第 1/4 页
HTML
1,178 行
00288 <font class="preprocessor">#ifdef NO_MMAP</font>00289 <font class="preprocessor"></font> ptr = <font class="keyword">new</font> T();00290 <font class="preprocessor">#else</font>00291 <font class="preprocessor"></font> h = CreateFileMapping(INVALID_HANDLE_VALUE,00292 FASTDB_SECURITY_ATTRIBUTES, PAGE_READWRITE, 0, 00293 <font class="keyword">sizeof</font>(T), name);00294 <font class="keywordflow">if</font> (h == NULL) { 00295 <font class="keywordflow">return</font> <font class="keyword">false</font>;00296 }00297 ptr = (T*)MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0);00298 <font class="keywordflow">if</font> (ptr == NULL) { 00299 CloseHandle(h);00300 <font class="keywordflow">return</font> <font class="keyword">false</font>;00301 }00302 <font class="preprocessor">#endif</font>00303 <font class="preprocessor"></font> <font class="keywordflow">return</font> <font class="keyword">true</font>;00304 }00305 00306 T* get() { <font class="keywordflow">return</font> ptr; }00307 00308 <font class="keywordtype">void</font> close() { 00309 <font class="preprocessor">#ifdef NO_MMAP</font>00310 <font class="preprocessor"></font> <font class="keyword">delete</font>[] ptr;00311 <font class="preprocessor">#else</font>00312 <font class="preprocessor"></font> UnmapViewOfFile(ptr);00313 CloseHandle(h);00314 <font class="preprocessor">#endif</font>00315 <font class="preprocessor"></font> }00316 <font class="keywordtype">void</font> erase() { 00317 close();00318 }00319 };00320 00321 <font class="keyword">typedef</font> <font class="keywordtype">long</font> sharedsem_t;00322 00323 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbGlobalCriticalSection { 00324 HANDLE event;00325 sharedsem_t* count;00326 00327 <font class="keyword">public</font>:00328 <font class="keywordtype">void</font> enter() { 00329 <font class="keywordflow">if</font> (InterlockedDecrement(count) != 0) { 00330 <font class="comment">// another process is in critical section</font>00331 <font class="keywordtype">int</font> rc = WaitForSingleObject(event, INFINITE);00332 assert (rc == WAIT_OBJECT_0);00333 }00334 }00335 00336 <font class="keywordtype">void</font> leave() { 00337 <font class="keywordflow">if</font> (InterlockedIncrement(count) <= 0) { 00338 <font class="comment">// some other processes try to enter critical section</font>00339 SetEvent(event);00340 }00341 }00342 00343 <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">long</font>* count) { 00344 this->count = count;00345 event = OpenEvent(EVENT_ALL_ACCESS, FALSE, name);00346 <font class="keywordflow">return</font> event != NULL;00347 }00348 <font class="keywordtype">bool</font> create(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">long</font>* count) { 00349 this->count = count;00350 *count = 1;00351 event = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, <font class="keyword">false</font>, <font class="keyword">false</font>, name);00352 <font class="keywordflow">return</font> event != NULL;00353 }00354 <font class="keywordtype">void</font> close() { 00355 CloseHandle(event);00356 }00357 <font class="keywordtype">void</font> erase() { 00358 close();00359 }00360 };00361 00362 00363 <font class="preprocessor">#else // Unix</font>00364 <font class="preprocessor"></font>00365 <font class="preprocessor">#include <unistd.h></font>00366 <font class="preprocessor">#include <string.h></font>00367 <font class="preprocessor">#include <fcntl.h></font>00368 <font class="preprocessor">#include <sys/time.h></font>00369 <font class="preprocessor">#include <sys/types.h></font>00370 <font class="preprocessor">#include <errno.h></font>00371 00372 <font class="preprocessor">#ifdef USE_POSIX_API</font>00373 <font class="preprocessor"></font><font class="preprocessor">#include <semaphore.h></font>00374 <font class="preprocessor">#include <sys/mman.h></font>00375 <font class="preprocessor">#else</font>00376 <font class="preprocessor"></font><font class="preprocessor">#include <sys/ipc.h></font>00377 <font class="preprocessor">#include <sys/sem.h></font>00378 <font class="preprocessor">#include <sys/shm.h></font>00379 <font class="preprocessor">#include <sys/mman.h></font>00380 <font class="preprocessor">#endif</font>00381 <font class="preprocessor"></font>00382 <font class="preprocessor">#define thread_proc</font>00383 <font class="preprocessor"></font>00384 <font class="preprocessor">#ifndef NO_PTHREADS</font>00385 <font class="preprocessor"></font>00386 <font class="preprocessor">#include <pthread.h></font>00387 00388 <font class="keyword">class </font>dbMutex { 00389 <font class="keyword">friend</font> <font class="keyword">class </font>dbLocalEvent;00390 <font class="keyword">friend</font> <font class="keyword">class </font>dbLocalSemaphore;00391 pthread_mutex_t cs;00392 <font class="keyword">public</font>:00393 dbMutex() { 00394 pthread_mutex_init(&cs, NULL);00395 }00396 ~dbMutex() { 00397 pthread_mutex_destroy(&cs);00398 }00399 <font class="keywordtype">void</font> lock() { 00400 pthread_mutex_lock(&cs);00401 }00402 <font class="keywordtype">void</font> unlock() { 00403 pthread_mutex_unlock(&cs);00404 }00405 };00406 00407 <font class="keyword">const</font> size_t dbThreadStackSize = 1024*1024;00408 00409 <font class="keyword">class </font>dbThread { 00410 pthread_t thread;00411 <font class="keyword">public</font>:00412 <font class="keyword">typedef</font> void (thread_proc* thread_proc_t)(<font class="keywordtype">void</font>*);00413 <font class="keywordtype">void</font> create(thread_proc_t f, <font class="keywordtype">void</font>* arg) {00414 pthread_attr_t attr;00415 pthread_attr_init(&attr);00416 <font class="preprocessor">#if !defined(__linux__)</font>00417 <font class="preprocessor"></font> pthread_attr_setstacksize(&attr, dbThreadStackSize);00418 <font class="preprocessor">#endif</font>00419 <font class="preprocessor"></font><font class="preprocessor">#if defined(_AIX41)</font>00420 <font class="preprocessor"></font> <font class="comment">// At AIX 4.1, 4.2 threads are by default created detached</font>00421 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);00422 <font class="preprocessor">#endif</font>00423 <font class="preprocessor"></font> pthread_create(&thread, &attr, (<font class="keywordtype">void</font>*(*)(<font class="keywordtype">void</font>*))f, arg);00424 pthread_attr_destroy(&attr);00425 }00426 00427 <font class="keywordtype">void</font> join() { 00428 <font class="keywordtype">void</font>* result;00429 pthread_join(thread, &result);00430 }00431 <font class="keywordtype">void</font> detach() { 00432 pthread_detach(thread);00433 }00434 00435 <font class="keyword">enum</font> ThreadPriority { 00436 THR_PRI_LOW, 00437 THR_PRI_HIGH00438 };00439 <font class="keywordtype">void</font> setPriority(ThreadPriority pri) { 00440 <font class="preprocessor">#if defined(PRI_OTHER_MIN) && defined(PRI_OTHER_MAX)</font>00441 <font class="preprocessor"></font> <font class="keyword">struct </font>sched_param sp;00442 sp.gsched_priority = pri == THR_PRI_LOW ? PRI_OTHER_MIN : PRI_OTHER_MAX;00443 pthread_setschedparam(thread, SCHED_OTHER, &sp); 00444 <font class="preprocessor">#endif</font>00445 <font class="preprocessor"></font> }00446 00447 <font class="keyword">static</font> <font class="keywordtype">int</font> numberOfProcessors();00448 };00449 00450 00451 <font class="keyword">class </font>dbLocalEvent { 00452 pthread_cond_t cond;00453 <font class="keywordtype">int</font> signaled;00454 <font class="keyword">public</font>:00455 <font class="keywordtype">void</font> wait(dbMutex& mutex) { 00456 <font class="keywordflow">while</font> (!signaled) { 00457 pthread_cond_wait(&cond, &mutex.cs);00458 }00459 }00460 <font class="keywordtype">bool</font> wait(dbMutex& mutex, time_t timeout) {00461 <font class="keywordflow">while</font> (!signaled) {00462 <font class="keyword">struct </font>timespec abs_ts; 00463 <font class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</font>00464 <font class="preprocessor"></font> <font class="keyword">struct </font>timespec rel_ts; 00465 rel_ts.tv_sec = timeout/1000; 00466 rel_ts.tv_nsec = timeout%1000*1000000;00467 pthread_get_expiration_np(&rel_ts, &abs_ts);00468 <font class="preprocessor">#else</font>00469 <font class="preprocessor"></font> <font class="keyword">struct </font>timeval cur_tv;00470 gettimeofday(&cur_tv, NULL);00471 abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00472 abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00473 <font class="keywordflow">if</font> (abs_ts.tv_nsec > 1000000000) { 00474 abs_ts.tv_nsec -= 1000000000;00475 abs_ts.tv_sec += 1;00476 }00477 <font class="preprocessor">#endif</font>00478 <font class="preprocessor"></font> <font class="keywordtype">int</font> rc = pthread_cond_timedwait(&cond, &mutex.cs, &abs_ts);00479 <font class="keywordflow">if</font> (rc == ETIMEDOUT) { 00480 <font class="keywordflow">return</font> <font class="keyword">false</font>;00481 }00482 }00483 <font class="keywordflow">return</font> <font class="keyword">true</font>;00484 }00485 <font class="keywordtype">void</font> signal() {00486 signaled = <font class="keyword">true</font>;00487 pthread_cond_broadcast(&cond);00488 }00489 <font class="keywordtype">void</font> reset() {00490 signaled = <font class="keyword">false</font>;00491 }00492 <font class="keywordtype">void</font> open(<font class="keywordtype">bool</font> initValue = <font class="keyword">false</font>) { 00493 signaled = initValue;00494 pthread_cond_init(&cond, NULL);00495 }00496 <font class="keywordtype">void</font> close() {00497 pthread_cond_destroy(&cond);00498 }00499 };00500 00501 <font class="keyword">class </font>dbLocalSemaphore { 00502 pthread_cond_t cond;00503 <font class="keywordtype">int</font> count;00504 <font class="keyword">public</font>:00505 <font class="keywordtype">void</font> wait(dbMutex& mutex) { 00506 <font class="keywordflow">while</font> (count == 0) { 00507 pthread_cond_wait(&cond, &mutex.cs);00508 }00509 count -= 1;00510 }00511 <font class="keywordtype">void</font> wait(dbMutex& mutex, time_t timeout) {00512 <font class="keywordflow">while</font> (count == 0) {00513 <font class="keyword">struct </font>timespec abs_ts; 00514 <font class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</font>00515 <font class="preprocessor"></font> <font class="keyword">struct </font>timespec rel_ts; 00516 rel_ts.tv_sec = timeout/1000; 00517 rel_ts.tv_nsec = timeout%1000*1000000;00518 pthread_get_expiration_np(&rel_ts, &abs_ts);00519 <font class="preprocessor">#else</font>00520 <font class="preprocessor"></font> <font class="keyword">struct </font>timeval cur_tv;00521 gettimeofday(&cur_tv, NULL);00522 abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00523 abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00524 <font class="keywordflow">if</font> (abs_ts.tv_nsec > 1000000000) { 00525 abs_ts.tv_nsec -= 1000000000;00526 abs_ts.tv_sec += 1;00527 }00528 <font class="preprocessor">#endif</font>00529 <font class="preprocessor"></font> pthread_cond_timedwait(&cond, &mutex.cs, &abs_ts);00530 }00531 count -= 1;00532 }00533 <font class="keywordtype">void</font> signal(<font class="keywordtype">unsigned</font> inc = 1) {00534 count += inc;00535 <font class="keywordflow">if</font> (inc > 1) { 00536 pthread_cond_broadcast(&cond);00537 } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (inc == 1) { 00538 pthread_cond_signal(&cond);00539 }00540 }00541 <font class="keywordtype">void</font> open(<font class="keywordtype">unsigned</font> initValue = 0) { 00542 pthread_cond_init(&cond, NULL);00543 count = initValue;00544 }00545 <font class="keywordtype">void</font> close() {00546 pthread_cond_destroy(&cond);00547 }00548 };00549 00550 <font class="keyword">template</font><<font class="keyword">class</font> T> 00551 <font class="keyword">class </font>dbThreadContext { 00552 pthread_key_t key;00553 <font class="keyword">public</font>:00554 T* get() { 00555 <font class="keywordflow">return</font> (T*)pthread_getspecific(key);00556 }00557 <font class="keywordtype">void</font> set(T* value) { 00558 pthread_setspecific(key, value);00559 }00560 dbThreadContext() { 00561 pthread_key_create(&key, NULL);00562 }00563 ~dbThreadContext() { 00564 pthread_key_delete(key);00565 }00566 };00567 00568 <font class="keyword">class </font>dbProcessId { 00569 <font class="keywordtype">int</font> pid;00570 pthread_t tid;00571 <font class="keyword">public</font>:00572 <font class="keywordtype">bool</font> operator != (dbProcessId <font class="keyword">const</font>& other)<font class="keyword"> const </font>{ 00573 <font class="keywordflow">return</font> pid != other.pid || tid != other.tid;00574 }00575 00576 <font class="keywordtype">void</font> clear() { 00577 pid = 0;00578 tid = 0;00579 }00580 00581 <font class="keyword">static</font> dbProcessId getCurrent() {00582 dbProcessId curr;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?