⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync__unix_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 4 页
字号:
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>&lt;<span class="keyword">class</span> T&gt;
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__) &amp;&amp; !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(&amp;attr);
00746         pthread_mutexattr_setpshared(&amp;attr, PTHREAD_PROCESS_SHARED);
00747         pthread_mutexattr_setrecursive(&amp;attr, PTHREAD_RECURSIVE_ENABLE);
00748         pthread_mutex_init(sem, &amp;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__) &amp;&amp; !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 &lt;errno.h&gt;</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)) &lt; 0 &amp;&amp; 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) &amp;&amp; !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 &lt;synch.h&gt;</span>
00794 <span class="preprocessor">#include &lt;errno.h&gt;</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) &lt; 0 &amp;&amp; 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)) &lt; 0 &amp;&amp; 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) &amp;&amp; !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 + -