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

📄 sync__unix_8h-source.html

📁 俄罗斯牛人KK的作品,著名的ORDBMS,这里上传最新的3.39版本源代码.希望了解对象关系数据库的同好,请不要错过.
💻 HTML
📖 第 1 页 / 共 3 页
字号:
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) &amp;&amp; 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>&lt;<span class="keyword">class</span> T&gt;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 &lt; 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)) &lt; 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 &gt; 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>&lt;<span class="keyword">class</span> T&gt;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__) &amp;&amp; !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(&amp;attr);00708         pthread_mutexattr_setpshared(&amp;attr, PTHREAD_PROCESS_SHARED);00709         pthread_mutexattr_setrecursive(&amp;attr, PTHREAD_RECURSIVE_ENABLE);00710         pthread_mutex_init(sem, &amp;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__) &amp;&amp; !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 &lt;errno.h&gt;</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)) &lt; 0 &amp;&amp; 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) &amp;&amp; !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 &lt;synch.h&gt;</span>00756 <span class="preprocessor">#include &lt;errno.h&gt;</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)) &lt; 0 &amp;&amp; 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) &amp;&amp; !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 + -