📄 sync__unix_8h-source.html
字号:
00541 <span class="keywordtype">void</span> erase();00542 };00543 00544 <span class="keyword">class </span>dbEvent { 00545 <span class="keywordtype">int</span> e;00546 <span class="keyword">public</span>:00547 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);00548 <span class="keywordtype">void</span> signal();00549 <span class="keywordtype">void</span> reset();00550 <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>);00551 <span class="keywordtype">void</span> close();00552 <span class="keywordtype">void</span> erase();00553 };00554 <span class="preprocessor">#endif // USE_POSIX_SEMAPHORES</span>00555 <span class="preprocessor"></span>00556 00557 <span class="comment">// Define dbSharedObject and dbSharedMemory</span>00558 <span class="preprocessor">#if defined(USE_POSIX_MMAP) && USE_POSIX_MMAP</span>00559 <span class="preprocessor"></span>00560 <span class="comment">// For POSIX dbSharedObject, we use mmap()</span>00561 <span class="keyword">template</span><<span class="keyword">class</span> T>00562 <span class="keyword">class </span>dbSharedObject { 00563 <span class="keywordtype">char</span>* name;00564 T* ptr;00565 <span class="keywordtype">int</span> fd;00566 <span class="keyword">public</span>:00567 00568 dbSharedObject() { 00569 name = NULL;00570 ptr = NULL;00571 fd = -1;00572 }00573 00574 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* fileName) { 00575 <span class="keyword">delete</span>[] name;00576 name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(fileName) + 1];00577 strcpy(name, fileName);00578 fd = ::open(fileName, O_RDWR|O_CREAT, 0777);00579 <span class="keywordflow">if</span> (fd < 0) { 00580 <span class="keywordflow">return</span> <span class="keyword">false</span>;00581 }00582 <span class="keywordflow">if</span> (ftruncate(fd, <span class="keyword">sizeof</span>(T)) < 0) {00583 ::close(fd);00584 <span class="keywordflow">return</span> <span class="keyword">false</span>;00585 }00586 ptr = (T*)mmap(NULL,00587 DOALIGN(<span class="keyword">sizeof</span>(T), 4096),00588 PROT_READ|PROT_WRITE,00589 MAP_SHARED,00590 fd,00591 0);00592 <span class="keywordflow">if</span> (ptr == MAP_FAILED) { 00593 ptr = NULL;00594 ::close(fd);00595 <span class="keywordflow">return</span> <span class="keyword">false</span>;00596 }00597 <span class="keywordflow">return</span> <span class="keyword">true</span>;00598 }00599 00600 T* get() { <span class="keywordflow">return</span> ptr; }00601 00602 <span class="keywordtype">void</span> close() { 00603 <span class="keywordflow">if</span> (ptr != NULL) { 00604 munmap(ptr, DOALIGN(<span class="keyword">sizeof</span>(T), 4096));00605 }00606 <span class="keywordflow">if</span> (fd > 0) { 00607 ::close(fd);00608 }00609 }00610 <span class="keywordtype">void</span> erase() {00611 close();00612 unlink(name); 00613 } 00614 00615 ~dbSharedObject() { 00616 <span class="keyword">delete</span>[] name;00617 }00618 };00619 00620 <span class="preprocessor">#else // USE_POSIX_MMAP</span>00621 <span class="preprocessor"></span>00622 <span class="comment">// Non POSIX, internal implementations of SharedMemory and SharedObject</span>00623 <span class="keyword">extern</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* keyFileDir; <span class="comment">// default value: "/tmp/" </span>00624 <span class="keyword">class </span>dbSharedMemory { 00625 <span class="keyword">protected</span>:00626 <span class="keywordtype">char</span>* ptr;00627 <span class="keywordtype">int</span> shm;00628 00629 <span class="keyword">public</span>:00630 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, size_t size); 00631 <span class="keywordtype">void</span> close();00632 <span class="keywordtype">void</span> erase(); 00633 <span class="keywordtype">char</span>* get_base() { 00634 <span class="keywordflow">return</span> ptr;00635 }00636 };00637 00638 <span class="keyword">template</span><<span class="keyword">class</span> T>00639 <span class="keyword">class </span>dbSharedObject : <span class="keyword">public</span> dbSharedMemory { 00640 <span class="keyword">public</span>:00641 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* name) { 00642 <span class="keywordflow">return</span> dbSharedMemory::open(name, <span class="keyword">sizeof</span>(T));00643 }00644 T* get() { <span class="keywordflow">return</span> (T*)ptr; }00645 };00646 00647 <span class="preprocessor">#endif</span>00648 <span class="preprocessor"></span>00650 <span class="comment">// Define dBGlobalCriticalSection for various platforms</span>00651 00652 <span class="comment">// QNX uses a pthread based mutex for its implementation</span>00653 <span class="comment">// Use only if pthread support is also enabled, else we'll use the default case</span>00654 <span class="preprocessor">#if defined(__QNX__) && !defined(NO_PTHREADS)</span>00655 <span class="preprocessor"></span><span class="keyword">typedef</span> pthread_mutex_t sharedsem_t;00656 00657 <span class="keyword">class </span>dbGlobalCriticalSection { 00658 pthread_mutexattr_t attr;00659 sharedsem_t* sem;00660 <span class="keyword">public</span>:00661 <span class="keywordtype">void</span> enter() {00662 <span class="keywordtype">int</span> rc = pthread_mutex_lock(sem);00663 assert(rc == 0);00664 }00665 <span class="keywordtype">void</span> leave() { 00666 <span class="keywordtype">int</span> rc = pthread_mutex_unlock(sem);00667 assert(rc == 0);00668 }00669 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00670 sem = shr;00671 <span class="keywordflow">return</span> <span class="keyword">true</span>;00672 }00673 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00674 sem = shr;00675 pthread_mutexattr_init(&attr);00676 pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);00677 pthread_mutexattr_setrecursive(&attr, PTHREAD_RECURSIVE_ENABLE);00678 pthread_mutex_init(sem, &attr);00679 <span class="keywordflow">return</span> <span class="keyword">true</span>;00680 }00681 <span class="keywordtype">void</span> close() {}00682 <span class="keywordtype">void</span> erase() {00683 pthread_mutex_destroy(sem);00684 }00685 };00686 00687 00688 <span class="preprocessor">#elif defined(__osf__)</span>00689 <span class="preprocessor"></span><span class="comment">// OSF uses "shared memory semaphores", located within a region mapped with mmap().</span>00690 <span class="comment">// XXX: Perhaps Konstantin can give some insight why this method was chosen</span>00691 <span class="preprocessor">#include <errno.h></span>00692 <span class="keyword">typedef</span> msemaphore sharedsem_t;00693 00694 <span class="keyword">class </span>dbGlobalCriticalSection { 00695 sharedsem_t* sem;00696 <span class="keyword">public</span>:00697 <span class="keywordtype">void</span> enter() { 00698 <span class="keywordtype">int</span> rc;00699 <span class="keywordflow">while</span> ((rc = msem_lock(sem, 0)) < 0 && errno == EINTR);00700 assert(rc == 0);00701 }00702 <span class="keywordtype">void</span> leave() { 00703 <span class="keywordtype">int</span> rc = msem_unlock(sem, 0);00704 assert(rc == 0); 00705 }00706 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00707 sem = shr;00708 <span class="keywordflow">return</span> <span class="keyword">true</span>;00709 }00710 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00711 sem = shr;00712 msem_init(shr, MSEM_UNLOCKED);00713 <span class="keywordflow">return</span> <span class="keyword">true</span>;00714 }00715 <span class="keywordtype">void</span> close() {}00716 <span class="keywordtype">void</span> erase() {00717 msem_remove(sem);00718 }00719 };00720 00721 00722 <span class="preprocessor">#elif defined(__sun)</span>00723 <span class="preprocessor"></span><span class="comment">// Sun uses the Solaris style semaphore implemenation (sema_init(), sema_post())</span>00724 <span class="preprocessor">#include <synch.h></span>00725 <span class="preprocessor">#include <errno.h></span>00726 <span class="keyword">typedef</span> sema_t sharedsem_t;00727 00728 <span class="keyword">class </span>dbGlobalCriticalSection { 00729 sharedsem_t* sem;00730 <span class="keyword">public</span>:00731 <span class="keywordtype">void</span> enter() { 00732 <span class="keywordtype">int</span> rc;00733 <span class="keywordflow">while</span> ((rc = sema_wait(sem)) < 0 && errno == EINTR);00734 assert(rc == 0);00735 }00736 <span class="keywordtype">void</span> leave() { 00737 <span class="keywordtype">int</span> rc = sema_post(sem);00738 assert(rc == 0);00739 }00740 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00741 sem = shr;00742 <span class="keywordflow">return</span> <span class="keyword">true</span>;00743 }00744 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00745 sem = shr;00746 <span class="keywordflow">return</span> sema_init(shr, 1, USYNC_PROCESS, NULL) == 0;00747 }00748 <span class="keywordtype">void</span> close() {}00749 <span class="keywordtype">void</span> erase() {00750 sema_destroy(sem);00751 }00752 };00753 00754 <span class="preprocessor">#elif defined(USE_POSIX_SEMAPHORES)</span>00755 <span class="preprocessor"></span><span class="comment">// Everyone else uses the POSIX style semaphores (sem_wait(), sem_post(), etc) if defined</span>00756 <span class="keyword">typedef</span> sem_t sharedsem_t;00757 00758 <span class="keyword">class </span>dbGlobalCriticalSection { 00759 sharedsem_t* sem;00760 00761 <span class="keyword">public</span>:00762 <span class="keywordtype">void</span> enter() { 00763 <span class="keywordtype">int</span> rc = sem_wait(sem);00764 assert(rc == 0);00765 }00766 <span class="keywordtype">void</span> leave() { 00767 <span class="keywordtype">int</span> rc = sem_post(sem);00768 assert(rc == 0);00769 }00770 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) { 00771 sem = shr;00772 <span class="keywordflow">return</span> <span class="keyword">true</span>;00773 }00774 00775 <span class="comment">// XXX: BUG Check the sem_init() return</span>00776 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) { 00777 sem = shr;00778 <span class="keywordflow">return</span> sem_init(sem, 1, 1) == 0;00779 }00780 <span class="keywordtype">void</span> close() {}00781 <span class="keywordtype">void</span> erase() { 00782 sem_destroy(sem);00783 }00784 };00785 00786 <span class="preprocessor">#else</span>00787 <span class="preprocessor"></span>00788 <span class="preprocessor">#define USE_LOCAL_CS_IMPL</span>00789 <span class="preprocessor"></span>00790 <span class="comment">// Lastly, use the local implementation</span>00791 <span class="keyword">typedef</span> <span class="keywordtype">long</span> sharedsem_t;00792 00793 <span class="keyword">class </span>dbGlobalCriticalSection { 00794 <span class="keywordtype">int</span> semid;00795 sharedsem_t* count;00796 00797 <span class="keyword">public</span>:00798 <span class="keywordtype">void</span> enter(); 00799 <span class="keywordtype">void</span> leave();00800 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);00801 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);00802 <span class="keywordtype">void</span> close() {}00803 <span class="keywordtype">void</span> erase();00804 };00805 <span class="preprocessor">#endif //dbGLobalCriticalSection switch</span>00806 <span class="preprocessor"></span>00807 <span class="preprocessor">#endif //__SYNC_UNIX_H__</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Feb 12 13:04:48 2004 for FastDB by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.5 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -