📄 sync__unix_8h-source.html
字号:
00564 00565 <span class="keyword">class </span>dbSemaphore { 00566 <span class="keywordtype">int</span> s;00567 <span class="keyword">public</span>:00568 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);00569 <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1);00570 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0);00571 <span class="keywordtype">void</span> reset();00572 <span class="keywordtype">void</span> close();00573 <span class="keywordtype">void</span> erase();00574 };00575 00576 <span class="keyword">class </span>dbEvent { 00577 <span class="keywordtype">int</span> e;00578 <span class="keyword">public</span>:00579 <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);00580 <span class="keywordtype">void</span> signal();00581 <span class="keywordtype">void</span> reset();00582 <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>);00583 <span class="keywordtype">void</span> close();00584 <span class="keywordtype">void</span> erase();00585 };00586 <span class="preprocessor">#endif // USE_POSIX_SEMAPHORES</span>00587 <span class="preprocessor"></span>00588 00589 <span class="comment">// Define dbSharedObject and dbSharedMemory</span>00590 <span class="preprocessor">#if defined(USE_POSIX_MMAP) && USE_POSIX_MMAP</span>00591 <span class="preprocessor"></span>00592 <span class="comment">// For POSIX dbSharedObject, we use mmap()</span>00593 <span class="keyword">template</span><<span class="keyword">class</span> T>00594 <span class="keyword">class </span>dbSharedObject { 00595 <span class="keywordtype">char</span>* name;00596 T* ptr;00597 <span class="keywordtype">int</span> fd;00598 <span class="keyword">public</span>:00599 00600 dbSharedObject() { 00601 name = NULL;00602 ptr = NULL;00603 fd = -1;00604 }00605 00606 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* fileName) { 00607 <span class="keyword">delete</span>[] name;00608 name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(fileName) + 1];00609 strcpy(name, fileName);00610 fd = ::open(fileName, O_RDWR|O_CREAT, 0777);00611 <span class="keywordflow">if</span> (fd < 0) { 00612 <span class="keywordflow">return</span> <span class="keyword">false</span>;00613 }00614 <span class="keywordflow">if</span> (ftruncate(fd, <span class="keyword">sizeof</span>(T)) < 0) {00615 ::close(fd);00616 <span class="keywordflow">return</span> <span class="keyword">false</span>;00617 }00618 ptr = (T*)mmap(NULL,00619 DOALIGN(<span class="keyword">sizeof</span>(T), 4096),00620 PROT_READ|PROT_WRITE,00621 MAP_SHARED,00622 fd,00623 0);00624 <span class="keywordflow">if</span> (ptr == MAP_FAILED) { 00625 ptr = NULL;00626 ::close(fd);00627 <span class="keywordflow">return</span> <span class="keyword">false</span>;00628 }00629 <span class="keywordflow">return</span> <span class="keyword">true</span>;00630 }00631 00632 T* get() { <span class="keywordflow">return</span> ptr; }00633 00634 <span class="keywordtype">void</span> close() { 00635 <span class="keywordflow">if</span> (ptr != NULL) { 00636 munmap((<span class="keywordtype">char</span>*)ptr, DOALIGN(<span class="keyword">sizeof</span>(T), 4096));00637 }00638 <span class="keywordflow">if</span> (fd > 0) { 00639 ::close(fd);00640 }00641 }00642 <span class="keywordtype">void</span> erase() {00643 close();00644 unlink(name); 00645 } 00646 00647 ~dbSharedObject() { 00648 <span class="keyword">delete</span>[] name;00649 }00650 };00651 00652 <span class="preprocessor">#else // USE_POSIX_MMAP</span>00653 <span class="preprocessor"></span>00654 <span class="comment">// Non POSIX, internal implementations of SharedMemory and SharedObject</span>00655 <span class="keyword">extern</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* keyFileDir; <span class="comment">// default value: "/tmp/" </span>00656 <span class="keyword">class </span>dbSharedMemory { 00657 <span class="keyword">protected</span>:00658 <span class="keywordtype">char</span>* ptr;00659 <span class="keywordtype">int</span> shm;00660 00661 <span class="keyword">public</span>:00662 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, size_t size); 00663 <span class="keywordtype">void</span> close();00664 <span class="keywordtype">void</span> erase(); 00665 <span class="keywordtype">char</span>* get_base() { 00666 <span class="keywordflow">return</span> ptr;00667 }00668 };00669 00670 <span class="keyword">template</span><<span class="keyword">class</span> T>00671 <span class="keyword">class </span>dbSharedObject : <span class="keyword">public</span> dbSharedMemory { 00672 <span class="keyword">public</span>:00673 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* name) { 00674 <span class="keywordflow">return</span> dbSharedMemory::open(name, <span class="keyword">sizeof</span>(T));00675 }00676 T* get() { <span class="keywordflow">return</span> (T*)ptr; }00677 };00678 00679 <span class="preprocessor">#endif</span>00680 <span class="preprocessor"></span>00682 <span class="comment">// Define dBGlobalCriticalSection for various platforms</span>00683 00684 <span class="comment">// QNX uses a pthread based mutex for its implementation</span>00685 <span class="comment">// Use only if pthread support is also enabled, else we'll use the default case</span>00686 <span class="preprocessor">#if defined(__QNX__) && !defined(NO_PTHREADS)</span>00687 <span class="preprocessor"></span><span class="keyword">typedef</span> pthread_mutex_t sharedsem_t;00688 00689 <span class="keyword">class </span>dbGlobalCriticalSection { 00690 pthread_mutexattr_t attr;00691 sharedsem_t* sem;00692 <span class="keyword">public</span>:00693 <span class="keywordtype">void</span> enter() {00694 <span class="keywordtype">int</span> rc = pthread_mutex_lock(sem);00695 assert(rc == 0);00696 }00697 <span class="keywordtype">void</span> leave() { 00698 <span class="keywordtype">int</span> rc = pthread_mutex_unlock(sem);00699 assert(rc == 0);00700 }00701 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00702 sem = shr;00703 <span class="keywordflow">return</span> <span class="keyword">true</span>;00704 }00705 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00706 sem = shr;00707 pthread_mutexattr_init(&attr);00708 pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);00709 pthread_mutexattr_setrecursive(&attr, PTHREAD_RECURSIVE_ENABLE);00710 pthread_mutex_init(sem, &attr);00711 <span class="keywordflow">return</span> <span class="keyword">true</span>;00712 }00713 <span class="keywordtype">void</span> close() {}00714 <span class="keywordtype">void</span> erase() {00715 pthread_mutex_destroy(sem);00716 }00717 };00718 00719 00720 <span class="preprocessor">#elif defined(__osf__) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>00721 <span class="preprocessor"></span><span class="comment">// OSF uses "shared memory semaphores", located within a region mapped with mmap().</span>00722 <span class="preprocessor">#include <errno.h></span>00723 <span class="keyword">typedef</span> msemaphore sharedsem_t;00724 00725 <span class="keyword">class </span>dbGlobalCriticalSection { 00726 sharedsem_t* sem;00727 <span class="keyword">public</span>:00728 <span class="keywordtype">void</span> enter() { 00729 <span class="keywordtype">int</span> rc;00730 <span class="keywordflow">while</span> ((rc = msem_lock(sem, 0)) < 0 && errno == EINTR);00731 assert(rc == 0);00732 }00733 <span class="keywordtype">void</span> leave() { 00734 <span class="keywordtype">int</span> rc = msem_unlock(sem, 0);00735 assert(rc == 0); 00736 }00737 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00738 sem = shr;00739 <span class="keywordflow">return</span> <span class="keyword">true</span>;00740 }00741 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00742 sem = shr;00743 msem_init(shr, MSEM_UNLOCKED);00744 <span class="keywordflow">return</span> <span class="keyword">true</span>;00745 }00746 <span class="keywordtype">void</span> close() {}00747 <span class="keywordtype">void</span> erase() {00748 msem_remove(sem);00749 }00750 };00751 00752 00753 <span class="preprocessor">#elif defined(__sun) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>00754 <span class="preprocessor"></span><span class="comment">// Sun uses the Solaris style semaphore implemenation (sema_init(), sema_post())</span>00755 <span class="preprocessor">#include <synch.h></span>00756 <span class="preprocessor">#include <errno.h></span>00757 <span class="keyword">typedef</span> sema_t sharedsem_t;00758 00759 <span class="keyword">class </span>dbGlobalCriticalSection { 00760 sharedsem_t* sem;00761 <span class="keyword">public</span>:00762 <span class="keywordtype">void</span> enter() { 00763 <span class="keywordtype">int</span> rc;00764 <span class="keywordflow">while</span> ((rc = sema_wait(sem)) < 0 && errno == EINTR);00765 assert(rc == 0);00766 }00767 <span class="keywordtype">void</span> leave() { 00768 <span class="keywordtype">int</span> rc = sema_post(sem);00769 assert(rc == 0);00770 }00771 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00772 sem = shr;00773 <span class="keywordflow">return</span> <span class="keyword">true</span>;00774 }00775 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) { 00776 sem = shr;00777 <span class="keywordflow">return</span> sema_init(shr, 1, USYNC_PROCESS, NULL) == 0;00778 }00779 <span class="keywordtype">void</span> close() {}00780 <span class="keywordtype">void</span> erase() {00781 sema_destroy(sem);00782 }00783 };00784 00785 <span class="preprocessor">#elif defined(USE_POSIX_SEMAPHORES) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>00786 <span class="preprocessor"></span><span class="comment">// Everyone else uses the POSIX style semaphores (sem_wait(), sem_post(), etc) if defined</span>00787 <span class="keyword">typedef</span> sem_t sharedsem_t;00788 00789 <span class="keyword">class </span>dbGlobalCriticalSection { 00790 sharedsem_t* sem;00791 00792 <span class="keyword">public</span>:00793 <span class="keywordtype">void</span> enter() { 00794 <span class="keywordtype">int</span> rc = sem_wait(sem);00795 assert(rc == 0);00796 }00797 <span class="keywordtype">void</span> leave() { 00798 <span class="keywordtype">int</span> rc = sem_post(sem);00799 assert(rc == 0);00800 }00801 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) { 00802 sem = shr;00803 <span class="keywordflow">return</span> <span class="keyword">true</span>;00804 }00805 00806 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) { 00807 sem = shr;00808 <span class="keywordflow">return</span> sem_init(sem, 1, 1) == 0;00809 }00810 00811 <span class="keywordtype">void</span> close() {}00812 <span class="keywordtype">void</span> erase() { 00813 sem_destroy(sem);00814 }00815 };00816 00817 <span class="preprocessor">#else</span>00818 <span class="preprocessor"></span>00819 <span class="preprocessor">#define USE_LOCAL_CS_IMPL</span>00820 <span class="preprocessor"></span>00821 <span class="comment">// Lastly, use the local implementation</span>00822 <span class="keyword">typedef</span> <span class="keywordtype">long</span> sharedsem_t;00823 00824 <span class="keyword">class </span>dbGlobalCriticalSection { 00825 <span class="keywordtype">int</span> semid;00826 sharedsem_t* count;00827 00828 <span class="keyword">public</span>:00829 <span class="keywordtype">void</span> enter(); 00830 <span class="keywordtype">void</span> leave();00831 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);00832 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);00833 <span class="keywordtype">void</span> close() {}00834 <span class="keywordtype">void</span> erase();00835 };00836 <span class="preprocessor">#endif //dbGLobalCriticalSection switch</span>00837 <span class="preprocessor"></span>00838 END_FASTDB_NAMESPACE00839 00840 <span class="preprocessor">#endif //__SYNC_UNIX_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 + -