📄 sync__unix_8h-source.html
字号:
00678 <span class="keyword">delete</span>[] name;
00679 }
00680 };
00681
00682 <span class="preprocessor">#else // USE_POSIX_MMAP</span>
00683 <span class="preprocessor"></span>
00684 <span class="comment">// Non POSIX, internal implementations of SharedMemory and SharedObject</span>
00685 <span class="keyword">extern</span> <span class="keywordtype">char</span> <span class="keyword">const</span>* keyFileDir; <span class="comment">// default value: "/tmp/" </span>
00686 <span class="keyword">class </span>dbSharedMemory {
00687 <span class="keyword">protected</span>:
00688 <span class="keywordtype">char</span>* ptr;
00689 <span class="keywordtype">int</span> shm;
00690
00691 <span class="keyword">public</span>:
00692 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, size_t size);
00693 <span class="keywordtype">void</span> close();
00694 <span class="keywordtype">void</span> erase();
00695 <span class="keywordtype">char</span>* get_base() {
00696 <span class="keywordflow">return</span> ptr;
00697 }
00698 };
00699
00700 <span class="keyword">template</span><<span class="keyword">class</span> T>
00701 <span class="keyword">class </span>dbSharedObject : <span class="keyword">public</span> dbSharedMemory {
00702 <span class="keyword">public</span>:
00703 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* name) {
00704 <span class="keywordflow">return</span> dbSharedMemory::open(name, <span class="keyword">sizeof</span>(T));
00705 }
00706 T* get() { <span class="keywordflow">return</span> (T*)ptr; }
00707 };
00708
00709 <span class="preprocessor">#endif</span>
00710 <span class="preprocessor"></span>
00712 <span class="comment">// Define dBGlobalCriticalSection for various platforms</span>
00713
00714 <span class="comment">// QNX uses a pthread based mutex for its implementation</span>
00715 <span class="comment">// Use only if pthread support is also enabled, else we'll use the default case</span>
00716 <span class="preprocessor">#if defined(__QNX__) && !defined(NO_PTHREADS)</span>
00717 <span class="preprocessor"></span><span class="keyword">typedef</span> pthread_mutex_t sharedsem_t;
00718
00719 <span class="keyword">class </span>dbGlobalCriticalSection {
00720 pthread_mutexattr_t attr;
00721 sharedsem_t* sem;
00722 <span class="keyword">public</span>:
00723 <span class="keywordtype">void</span> enter() {
00724 <span class="preprocessor">#ifdef NDEBUG</span>
00725 <span class="preprocessor"></span> pthread_mutex_lock(sem);
00726 <span class="preprocessor">#else</span>
00727 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_lock(sem);
00728 assert(rc == 0);
00729 <span class="preprocessor">#endif</span>
00730 <span class="preprocessor"></span> }
00731 <span class="keywordtype">void</span> leave() {
00732 <span class="preprocessor">#ifdef NDEBUG</span>
00733 <span class="preprocessor"></span> pthread_mutex_unlock(sem);
00734 <span class="preprocessor">#else</span>
00735 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = pthread_mutex_unlock(sem);
00736 assert(rc == 0);
00737 <span class="preprocessor">#endif</span>
00738 <span class="preprocessor"></span> }
00739 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00740 sem = shr;
00741 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00742 }
00743 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00744 sem = shr;
00745 pthread_mutexattr_init(&attr);
00746 pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
00747 pthread_mutexattr_setrecursive(&attr, PTHREAD_RECURSIVE_ENABLE);
00748 pthread_mutex_init(sem, &attr);
00749 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00750 }
00751 <span class="keywordtype">void</span> close() {}
00752 <span class="keywordtype">void</span> erase() {
00753 pthread_mutex_destroy(sem);
00754 }
00755 };
00756
00757
00758 <span class="preprocessor">#elif defined(__osf__) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>
00759 <span class="preprocessor"></span><span class="comment">// OSF uses "shared memory semaphores", located within a region mapped with mmap().</span>
00760 <span class="preprocessor">#include <errno.h></span>
00761 <span class="keyword">typedef</span> msemaphore sharedsem_t;
00762
00763 <span class="keyword">class </span>dbGlobalCriticalSection {
00764 sharedsem_t* sem;
00765 <span class="keyword">public</span>:
00766 <span class="keywordtype">void</span> enter() {
00767 <span class="keywordtype">int</span> rc;
00768 <span class="keywordflow">while</span> ((rc = msem_lock(sem, 0)) < 0 && errno == EINTR);
00769 assert(rc == 0);
00770 }
00771 <span class="keywordtype">void</span> leave() {
00772 <span class="keywordtype">int</span> rc = msem_unlock(sem, 0);
00773 assert(rc == 0);
00774 }
00775 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00776 sem = shr;
00777 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00778 }
00779 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00780 sem = shr;
00781 msem_init(shr, MSEM_UNLOCKED);
00782 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00783 }
00784 <span class="keywordtype">void</span> close() {}
00785 <span class="keywordtype">void</span> erase() {
00786 msem_remove(sem);
00787 }
00788 };
00789
00790
00791 <span class="preprocessor">#elif defined(__sun) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>
00792 <span class="preprocessor"></span><span class="comment">// Sun uses the Solaris style semaphore implemenation (sema_init(), sema_post())</span>
00793 <span class="preprocessor">#include <synch.h></span>
00794 <span class="preprocessor">#include <errno.h></span>
00795 <span class="keyword">typedef</span> sema_t sharedsem_t;
00796
00797 <span class="keyword">class </span>dbGlobalCriticalSection {
00798 sharedsem_t* sem;
00799 <span class="keyword">public</span>:
00800 <span class="keywordtype">void</span> enter() {
00801 <span class="preprocessor">#ifdef NDEBUG</span>
00802 <span class="preprocessor"></span> <span class="keywordflow">while</span> (sema_wait(sem) < 0 && errno == EINTR);
00803 <span class="preprocessor">#else</span>
00804 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc;
00805 <span class="keywordflow">while</span> ((rc = sema_wait(sem)) < 0 && errno == EINTR);
00806 assert(rc == 0);
00807 <span class="preprocessor">#endif</span>
00808 <span class="preprocessor"></span> }
00809 <span class="keywordtype">void</span> leave() {
00810 <span class="preprocessor">#ifdef NDEBUG</span>
00811 <span class="preprocessor"></span> sema_post(sem);
00812 <span class="preprocessor">#else</span>
00813 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = sema_post(sem);
00814 assert(rc == 0);
00815 <span class="preprocessor">#endif</span>
00816 <span class="preprocessor"></span> }
00817 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00818 sem = shr;
00819 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00820 }
00821 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>*, sharedsem_t* shr) {
00822 sem = shr;
00823 <span class="keywordflow">return</span> sema_init(shr, 1, USYNC_PROCESS, NULL) == 0;
00824 }
00825 <span class="keywordtype">void</span> close() {}
00826 <span class="keywordtype">void</span> erase() {
00827 sema_destroy(sem);
00828 }
00829 };
00830
00831 <span class="preprocessor">#elif defined(USE_POSIX_SEMAPHORES) && !defined(RECOVERABLE_CRITICAL_SECTION)</span>
00832 <span class="preprocessor"></span><span class="comment">// Everyone else uses the POSIX style semaphores (sem_wait(), sem_post(), etc) if defined</span>
00833 <span class="keyword">typedef</span> sem_t sharedsem_t;
00834
00835 <span class="keyword">class </span>dbGlobalCriticalSection {
00836 sharedsem_t* sem;
00837
00838 <span class="keyword">public</span>:
00839 <span class="keywordtype">void</span> enter() {
00840 <span class="preprocessor">#ifdef NDEBUG</span>
00841 <span class="preprocessor"></span> sem_wait(sem);
00842 <span class="preprocessor">#else</span>
00843 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = sem_wait(sem);
00844 assert(rc == 0);
00845 <span class="preprocessor">#endif</span>
00846 <span class="preprocessor"></span> }
00847 <span class="keywordtype">void</span> leave() {
00848 <span class="preprocessor">#ifdef NDEBUG</span>
00849 <span class="preprocessor"></span> sem_post(sem);
00850 <span class="preprocessor">#else</span>
00851 <span class="preprocessor"></span> <span class="keywordtype">int</span> rc = sem_post(sem);
00852 assert(rc == 0);
00853 <span class="preprocessor">#endif</span>
00854 <span class="preprocessor"></span> }
00855 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) {
00856 sem = shr;
00857 <span class="keywordflow">return</span> <span class="keyword">true</span>;
00858 }
00859
00860 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr) {
00861 sem = shr;
00862 <span class="keywordflow">return</span> sem_init(sem, 1, 1) == 0;
00863 }
00864
00865 <span class="keywordtype">void</span> close() {}
00866 <span class="keywordtype">void</span> erase() {
00867 sem_destroy(sem);
00868 }
00869 };
00870
00871 <span class="preprocessor">#else</span>
00872 <span class="preprocessor"></span>
00873 <span class="preprocessor">#define USE_LOCAL_CS_IMPL</span>
00874 <span class="preprocessor"></span>
00875 <span class="preprocessor">#define GLOBAL_CS_DEBUG 1</span>
00876 <span class="preprocessor"></span>
00877 <span class="comment">// Lastly, use the local implementation</span>
00878 <span class="keyword">typedef</span> <span class="keywordtype">long</span> sharedsem_t;
00879
00880 <span class="keyword">class </span>dbGlobalCriticalSection {
00881 <span class="keywordtype">int</span> semid;
00882 sharedsem_t* count;
00883 <span class="preprocessor">#if GLOBAL_CS_DEBUG</span>
00884 <span class="preprocessor"></span> pthread_t owner;
00885 <span class="preprocessor">#endif</span>
00886 <span class="preprocessor"></span>
00887 <span class="keyword">public</span>:
00888 <span class="keywordtype">void</span> enter();
00889 <span class="keywordtype">void</span> leave();
00890 <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);
00891 <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, sharedsem_t* shr);
00892 <span class="keywordtype">void</span> close() {}
00893 <span class="keywordtype">void</span> erase();
00894 };
00895 <span class="preprocessor">#endif //dbGLobalCriticalSection switch</span>
00896 <span class="preprocessor"></span>
00897 END_FASTDB_NAMESPACE
00898
00899 <span class="preprocessor">#endif //__SYNC_UNIX_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 + -