📄 sync__unix_8h-source.html
字号:
00450 }
00451 } <span class="keywordflow">else</span> {
00452 status = (sem_wait(sem) == 0 && sem_post(sem) == 0)
00453 ? AlreadyInitialized : InitializationError;
00454 <span class="keywordflow">break</span>;
00455 }
00456 }
00457 <span class="keywordflow">return</span> status;
00458 }
00459
00460 <span class="keywordtype">void</span> done() {
00461 sem_post(sem);
00462 }
00463 <span class="keywordtype">bool</span> close() {
00464 sem_close(sem);
00465 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00466 }
00467 <span class="keywordtype">void</span> erase() {
00468 sem_unlink(name);
00469 <span class="keyword">delete</span>[] name;
00470 }
00471 };
00472
00473 <span class="keyword">class </span>dbSemaphore {
00474 <span class="keyword">protected</span>:
00475 sem_t* sem;
00476 <span class="keywordtype">char</span>* name;
00477 <span class="keyword">public</span>:
00478 <span class="keywordtype">void</span> wait() {
00479 <span class="preprocessor">#ifdef NDEBUG</span>
00480 <span class="preprocessor"></span> sem_wait(sem);
00481 <span class="preprocessor">#else</span>
00482 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = sem_wait(sem);
00483 assert(rc == 0);
00484 <span class="preprocessor">#endif</span>
00485 <span class="preprocessor"></span> }
00486
00487 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) {
00488 <span class="preprocessor">#ifdef POSIX_1003_1d</span>
00489 <span class="preprocessor"></span> <span class="keyword">struct </span>timespec abs_ts;
00490 <span class="keyword">struct </span>timeval cur_tv;
00491 clock_gettime(CLOCK_REALTIME, &cur_tv);
00492 abs_ts.tv_sec = cur_tv.tv_sec + (msec + cur_tv.tv_usec / 1000) / 1000000;
00493 abs_ts.tv_nsec = (msec + cur_tv.tv_usec / 1000) % 1000000 * 1000;
00494 <span class="keywordtype">int</span> rc = sem_timedwait(sem, &abs_ts);
00495 <span class="keywordflow">if</span> (rc < 0) {
00496 assert(errno == ETIMEDOUT);
00497 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00498 }
00499 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00500 <span class="preprocessor">#else </span>
00501 <span class="preprocessor"></span><span class="preprocessor">#ifdef NDEBUG</span>
00502 <span class="preprocessor"></span> sem_wait(sem);
00503 <span class="preprocessor">#else</span>
00504 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = sem_wait(sem);
00505 assert(rc == 0);
00506 <span class="preprocessor">#endif</span>
00507 <span class="preprocessor"></span> <span class="keywordflow">return</span> <span class="keyword">true</span>;
00508 <span class="preprocessor">#endif </span>
00509 <span class="preprocessor"></span> }
00510
00511 <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {
00512 <span class="keywordflow">while</span> (inc-- > 0) {
00513 sem_post(sem);
00514 }
00515 }
00516 <span class="keywordtype">void</span> reset() {
00517 <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00518 }
00519 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0) {
00520 this->name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name)+2];
00521 <span class="keywordflow">if</span> (*name != <span class="charliteral">'/'</span>) {
00522 strcpy(this->name+1, name);
00523 *this->name = <span class="charliteral">'/'</span>;
00524 } <span class="keywordflow">else</span> {
00525 strcpy(this->name, name);
00526 }
00527 sem = sem_open(this->name, O_CREAT, 0777, initValue);
00528 <span class="keywordflow">return</span> sem != NULL;
00529 }
00530 <span class="keywordtype">void</span> close() {
00531 <span class="keywordflow">if</span> (sem != NULL) {
00532 sem_close(sem);
00533 sem = NULL;
00534 }
00535 }
00536 <span class="keywordtype">void</span> erase() {
00537 close();
00538 sem_unlink(name);
00539 <span class="keyword">delete</span>[] name;
00540 }
00541 };
00542
00543 <span class="keyword">class </span>dbEvent : <span class="keyword">public</span> dbSemaphore {
00544 <span class="keyword">public</span>:
00545 <span class="keywordtype">void</span> wait() {
00546 dbSemaphore::wait();
00547 sem_post(sem);
00548 }
00549 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) {
00550 <span class="keywordflow">if</span> (dbSemaphore::wait(msec)) {
00551 sem_post(sem);
00552 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00553 }
00554 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00555 }
00556 <span class="keywordtype">void</span> signal() {
00557 <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00558 sem_post(sem);
00559 }
00560 <span class="keywordtype">void</span> reset() {
00561 <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00562 }
00563 <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>) {
00564 <span class="keywordflow">return</span> dbSemaphore::open(name, (<span class="keywordtype">int</span>)signaled);
00565 }
00566 };
00567 <span class="preprocessor">#else // USE_POSIX_SEMAPHORES</span>
00568 <span class="preprocessor"></span>
00569 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbWatchDog {
00570 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">int</span> flags);
00571 <span class="keyword">public</span>:
00572 <span class="keywordtype">bool</span> watch();
00573 <span class="keywordtype">void</span> close();
00574 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00575 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00576 <span class="keywordtype">int</span> id;
00577 };
00578
00579 <span class="comment">// Define local implemenation of InitializationMutex in sync.cpp</span>
00580 <span class="keyword">class </span>dbInitializationMutex {
00581 <span class="keywordtype">int</span> semid;
00582 <span class="keyword">public</span>:
00583 <span class="keyword">enum</span> initializationStatus {
00584 InitializationError,
00585 AlreadyInitialized,
00586 NotYetInitialized
00587 };
00588 initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00589 <span class="keywordtype">void</span> done();
00590 <span class="keywordtype">bool</span> close();
00591 <span class="keywordtype">void</span> erase();
00592 };
00593
00594
00595 <span class="keyword">class </span>dbSemaphore {
00596 <span class="keywordtype">int</span> s;
00597 <span class="keyword">public</span>:
00598 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);
00599 <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1);
00600 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0);
00601 <span class="keywordtype">void</span> reset();
00602 <span class="keywordtype">void</span> close();
00603 <span class="keywordtype">void</span> erase();
00604 };
00605
00606 <span class="keyword">class </span>dbEvent {
00607 <span class="keywordtype">int</span> e;
00608 <span class="keyword">public</span>:
00609 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);
00610 <span class="keywordtype">void</span> signal();
00611 <span class="keywordtype">void</span> reset();
00612 <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>);
00613 <span class="keywordtype">void</span> close();
00614 <span class="keywordtype">void</span> erase();
00615 };
00616 <span class="preprocessor">#endif // USE_POSIX_SEMAPHORES</span>
00617 <span class="preprocessor"></span>
00618
00619 <span class="comment">// Define dbSharedObject and dbSharedMemory</span>
00620 <span class="preprocessor">#if defined(USE_POSIX_MMAP) && USE_POSIX_MMAP</span>
00621 <span class="preprocessor"></span>
00622 <span class="comment">// For POSIX dbSharedObject, we use mmap()</span>
00623 <span class="keyword">template</span><<span class="keyword">class</span> T>
00624 <span class="keyword">class </span>dbSharedObject {
00625 <span class="keywordtype">char</span>* name;
00626 T* ptr;
00627 <span class="keywordtype">int</span> fd;
00628 <span class="keyword">public</span>:
00629
00630 dbSharedObject() {
00631 name = NULL;
00632 ptr = NULL;
00633 fd = -1;
00634 }
00635
00636 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* fileName) {
00637 <span class="keyword">delete</span>[] name;
00638 name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(fileName) + 1];
00639 strcpy(name, fileName);
00640 fd = ::open(fileName, O_RDWR|O_CREAT, 0777);
00641 <span class="keywordflow">if</span> (fd < 0) {
00642 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00643 }
00644 <span class="keywordflow">if</span> (ftruncate(fd, <span class="keyword">sizeof</span>(T)) < 0) {
00645 ::close(fd);
00646 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00647 }
00648 ptr = (T*)mmap(NULL,
00649 DOALIGN(<span class="keyword">sizeof</span>(T), 4096),
00650 PROT_READ|PROT_WRITE,
00651 MAP_SHARED,
00652 fd,
00653 0);
00654 <span class="keywordflow">if</span> (ptr == MAP_FAILED) {
00655 ptr = NULL;
00656 ::close(fd);
00657 <span class="keywordflow">return</span> <span class="keyword">false</span>;
00658 }
00659 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00660 }
00661
00662 T* get() { <span class="keywordflow">return</span> ptr; }
00663
00664 <span class="keywordtype">void</span> close() {
00665 <span class="keywordflow">if</span> (ptr != NULL) {
00666 munmap((<span class="keywordtype">char</span>*)ptr, DOALIGN(<span class="keyword">sizeof</span>(T), 4096));
00667 }
00668 <span class="keywordflow">if</span> (fd > 0) {
00669 ::close(fd);
00670 }
00671 }
00672 <span class="keywordtype">void</span> erase() {
00673 close();
00674 unlink(name);
00675 }
00676
00677 ~dbSharedObject() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -