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

📄 sync__unix_8h-source.html

📁 FastDb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 3 页
字号:
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) &amp;&amp; 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>&lt;<span class="keyword">class</span> T&gt;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 &lt; 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)) &lt; 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 &gt; 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>&lt;<span class="keyword">class</span> T&gt;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__) &amp;&amp; !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(&amp;attr);00676         pthread_mutexattr_setpshared(&amp;attr, PTHREAD_PROCESS_SHARED);00677         pthread_mutexattr_setrecursive(&amp;attr, PTHREAD_RECURSIVE_ENABLE);00678         pthread_mutex_init(sem, &amp;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 &lt;errno.h&gt;</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)) &lt; 0 &amp;&amp; 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 &lt;synch.h&gt;</span>00725 <span class="preprocessor">#include &lt;errno.h&gt;</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)) &lt; 0 &amp;&amp; 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 + -