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

📄 sync__unix_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 4 页
字号:
00450                 }
00451             } <span class="keywordflow">else</span> { 
00452                 status = (sem_wait(sem) == 0 &amp;&amp; sem_post(sem) == 0) 
00453                     ? AlreadyInitialized : InitializationError;
00454                 <span class="keywordflow">break</span>;
00455             }
00456         }
00457         <span class="keywordflow">return</span> status;
00458     }
00459 
00460     <span class="keywordtype">void</span> done() { 
00461         sem_post(sem);
00462     }
00463     <span class="keywordtype">bool</span> close() {
00464         sem_close(sem);
00465         <span class="keywordflow">return</span> <span class="keyword">true</span>;
00466     }
00467     <span class="keywordtype">void</span> erase() {
00468         sem_unlink(name);
00469         <span class="keyword">delete</span>[] name;
00470     }
00471 };
00472 
00473 <span class="keyword">class </span>dbSemaphore { 
00474   <span class="keyword">protected</span>:
00475     sem_t* sem;
00476     <span class="keywordtype">char</span>*  name;
00477   <span class="keyword">public</span>:
00478     <span class="keywordtype">void</span> wait() { 
00479 <span class="preprocessor">#ifdef NDEBUG</span>
00480 <span class="preprocessor"></span>        sem_wait(sem);
00481 <span class="preprocessor">#else</span>
00482 <span class="preprocessor"></span>        <span class="keywordtype">int</span> rc = sem_wait(sem);
00483         assert(rc == 0);
00484 <span class="preprocessor">#endif</span>
00485 <span class="preprocessor"></span>    }
00486 
00487     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) { 
00488 <span class="preprocessor">#ifdef POSIX_1003_1d</span>
00489 <span class="preprocessor"></span>        <span class="keyword">struct </span>timespec abs_ts;
00490         <span class="keyword">struct </span>timeval  cur_tv;
00491         clock_gettime(CLOCK_REALTIME, &amp;cur_tv);
00492         abs_ts.tv_sec = cur_tv.tv_sec + (msec + cur_tv.tv_usec / 1000) / 1000000; 
00493         abs_ts.tv_nsec = (msec + cur_tv.tv_usec / 1000) % 1000000 * 1000;
00494         <span class="keywordtype">int</span> rc = sem_timedwait(sem, &amp;abs_ts);
00495         <span class="keywordflow">if</span> (rc &lt; 0) { 
00496             assert(errno == ETIMEDOUT);
00497             <span class="keywordflow">return</span> <span class="keyword">false</span>;
00498         }
00499         <span class="keywordflow">return</span> <span class="keyword">true</span>;
00500 <span class="preprocessor">#else </span>
00501 <span class="preprocessor"></span><span class="preprocessor">#ifdef NDEBUG</span>
00502 <span class="preprocessor"></span>        sem_wait(sem);
00503 <span class="preprocessor">#else</span>
00504 <span class="preprocessor"></span>        <span class="keywordtype">int</span> rc = sem_wait(sem);
00505         assert(rc == 0);
00506 <span class="preprocessor">#endif</span>
00507 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="keyword">true</span>;
00508 <span class="preprocessor">#endif  </span>
00509 <span class="preprocessor"></span>    }
00510 
00511     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {
00512         <span class="keywordflow">while</span> (inc-- &gt; 0) { 
00513             sem_post(sem);
00514         }
00515     }
00516     <span class="keywordtype">void</span> reset() { 
00517         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00518     }    
00519     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0) {
00520         this-&gt;name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name)+2];
00521         <span class="keywordflow">if</span> (*name != <span class="charliteral">'/'</span>) { 
00522             strcpy(this-&gt;name+1, name);
00523             *this-&gt;name = <span class="charliteral">'/'</span>;
00524         } <span class="keywordflow">else</span> { 
00525             strcpy(this-&gt;name, name);
00526         }
00527         sem = sem_open(this-&gt;name, O_CREAT, 0777, initValue);
00528         <span class="keywordflow">return</span> sem != NULL; 
00529     }
00530     <span class="keywordtype">void</span> close() {
00531         <span class="keywordflow">if</span> (sem != NULL) { 
00532             sem_close(sem);
00533             sem = NULL;
00534         }
00535     }
00536     <span class="keywordtype">void</span> erase() { 
00537         close();
00538         sem_unlink(name);
00539         <span class="keyword">delete</span>[] name;
00540     }
00541 };
00542 
00543 <span class="keyword">class </span>dbEvent : <span class="keyword">public</span> dbSemaphore { 
00544   <span class="keyword">public</span>:
00545     <span class="keywordtype">void</span> wait() { 
00546         dbSemaphore::wait();
00547         sem_post(sem);
00548     }
00549     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) { 
00550         <span class="keywordflow">if</span> (dbSemaphore::wait(msec)) { 
00551             sem_post(sem);
00552             <span class="keywordflow">return</span> <span class="keyword">true</span>;
00553         }
00554         <span class="keywordflow">return</span> <span class="keyword">false</span>;
00555     }
00556     <span class="keywordtype">void</span> signal() {
00557         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00558         sem_post(sem);
00559     }
00560     <span class="keywordtype">void</span> reset() {
00561         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);
00562     }
00563     <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>) {
00564         <span class="keywordflow">return</span> dbSemaphore::open(name, (<span class="keywordtype">int</span>)signaled);
00565     }
00566 };
00567 <span class="preprocessor">#else // USE_POSIX_SEMAPHORES</span>
00568 <span class="preprocessor"></span>
00569 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbWatchDog { 
00570     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">int</span> flags);
00571   <span class="keyword">public</span>:
00572     <span class="keywordtype">bool</span> watch();
00573     <span class="keywordtype">void</span> close(); 
00574     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00575     <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00576     <span class="keywordtype">int</span> id;
00577 };
00578 
00579 <span class="comment">// Define local implemenation of InitializationMutex in sync.cpp</span>
00580 <span class="keyword">class </span>dbInitializationMutex { 
00581     <span class="keywordtype">int</span> semid;
00582   <span class="keyword">public</span>: 
00583     <span class="keyword">enum</span> initializationStatus { 
00584         InitializationError, 
00585         AlreadyInitialized,
00586         NotYetInitialized
00587     };
00588     initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);
00589     <span class="keywordtype">void</span> done(); 
00590     <span class="keywordtype">bool</span> close();
00591     <span class="keywordtype">void</span> erase();
00592 };
00593 
00594 
00595 <span class="keyword">class </span>dbSemaphore { 
00596     <span class="keywordtype">int</span> s;
00597   <span class="keyword">public</span>:
00598     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);
00599     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1);
00600     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0);
00601     <span class="keywordtype">void</span> reset();
00602     <span class="keywordtype">void</span> close();
00603     <span class="keywordtype">void</span> erase();
00604 };
00605 
00606 <span class="keyword">class </span>dbEvent { 
00607     <span class="keywordtype">int</span> e;
00608   <span class="keyword">public</span>:
00609     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec = INFINITE);
00610     <span class="keywordtype">void</span> signal();
00611     <span class="keywordtype">void</span> reset();
00612     <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>);
00613     <span class="keywordtype">void</span> close();
00614     <span class="keywordtype">void</span> erase();
00615 };
00616 <span class="preprocessor">#endif // USE_POSIX_SEMAPHORES</span>
00617 <span class="preprocessor"></span>
00618 
00619 <span class="comment">// Define dbSharedObject and dbSharedMemory</span>
00620 <span class="preprocessor">#if defined(USE_POSIX_MMAP) &amp;&amp; USE_POSIX_MMAP</span>
00621 <span class="preprocessor"></span>
00622 <span class="comment">// For POSIX dbSharedObject, we use mmap()</span>
00623 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
00624 <span class="keyword">class </span>dbSharedObject { 
00625     <span class="keywordtype">char</span>* name;
00626     T*  ptr;
00627     <span class="keywordtype">int</span> fd;
00628   <span class="keyword">public</span>:
00629 
00630     dbSharedObject() { 
00631         name = NULL;
00632         ptr = NULL;
00633         fd = -1;
00634     }
00635 
00636     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span>* fileName) { 
00637         <span class="keyword">delete</span>[] name;
00638         name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(fileName) + 1];
00639         strcpy(name, fileName);
00640         fd = ::open(fileName, O_RDWR|O_CREAT, 0777);
00641         <span class="keywordflow">if</span> (fd &lt; 0) { 
00642             <span class="keywordflow">return</span> <span class="keyword">false</span>;
00643         }
00644         <span class="keywordflow">if</span> (ftruncate(fd, <span class="keyword">sizeof</span>(T)) &lt; 0) {
00645             ::close(fd);
00646             <span class="keywordflow">return</span> <span class="keyword">false</span>;
00647         }
00648         ptr = (T*)mmap(NULL,
00649                        DOALIGN(<span class="keyword">sizeof</span>(T), 4096),
00650                        PROT_READ|PROT_WRITE,
00651                        MAP_SHARED,
00652                        fd,
00653                        0);
00654         <span class="keywordflow">if</span> (ptr == MAP_FAILED) { 
00655             ptr = NULL;
00656             ::close(fd);
00657             <span class="keywordflow">return</span> <span class="keyword">false</span>;
00658         }
00659         <span class="keywordflow">return</span> <span class="keyword">true</span>;
00660     }
00661 
00662     T* get() { <span class="keywordflow">return</span> ptr; }
00663 
00664     <span class="keywordtype">void</span> close() { 
00665         <span class="keywordflow">if</span> (ptr != NULL) { 
00666             munmap((<span class="keywordtype">char</span>*)ptr, DOALIGN(<span class="keyword">sizeof</span>(T), 4096));
00667         }
00668         <span class="keywordflow">if</span> (fd &gt; 0) { 
00669             ::close(fd);
00670         }
00671     }
00672     <span class="keywordtype">void</span> erase() {
00673         close();
00674         unlink(name);   
00675     }  
00676 
00677     ~dbSharedObject() { 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -