sync_8h-source.html

来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· HTML 代码 · 共 1,178 行 · 第 1/4 页

HTML
1,178
字号
00583         curr.pid = getpid();00584         curr.tid = pthread_self();00585         <font class="keywordflow">return</font> curr;00586     }00587 };00588 00589 <font class="preprocessor">#else</font>00590 <font class="preprocessor"></font>00591 <font class="keyword">class </font>dbMutex { 00592    <font class="keyword">public</font>:00593     <font class="keywordtype">void</font> lock() {}00594     <font class="keywordtype">void</font> unlock() {}00595 };00596 00597 <font class="keyword">class </font>dbThread { 00598   <font class="keyword">public</font>:00599     <font class="keyword">typedef</font> void (thread_proc* thread_proc_t)(<font class="keywordtype">void</font>*);00600     <font class="keywordtype">void</font> create(thread_proc_t f, <font class="keywordtype">void</font>* arg) { f(arg); }00601     <font class="keywordtype">void</font> join() {}00602     <font class="keywordtype">void</font> detach() {}00603     <font class="keyword">static</font> <font class="keywordtype">int</font> numberOfProcessors() { <font class="keywordflow">return</font> 1; }00604 };00605 00606 <font class="keyword">class </font>dbLocalSemaphore { 00607     <font class="keywordtype">int</font> count;00608   <font class="keyword">public</font>:00609     <font class="keywordtype">void</font> wait(dbMutex&amp;) { 00610         assert (count &gt; 0);00611         count -= 1;00612     }00613     <font class="keywordtype">void</font> signal(<font class="keywordtype">unsigned</font> inc = 1) {00614         count += inc;00615     }00616     <font class="keywordtype">void</font> open(<font class="keywordtype">unsigned</font> initValue = 0) {00617         count = initValue;00618     }00619     <font class="keywordtype">void</font> close() {}00620 };00621 00622 <font class="keyword">class </font>dbLocalEvent { 00623     <font class="keywordtype">bool</font> signaled;00624   <font class="keyword">public</font>:00625     <font class="keywordtype">void</font> wait(dbMutex&amp;) { 00626         assert(signaled);00627     }00628     <font class="keywordtype">void</font> signal() {00629         signaled = <font class="keyword">true</font>;00630     }00631     <font class="keywordtype">void</font> reset() {00632         signaled = <font class="keyword">false</font>;00633     }00634     <font class="keywordtype">void</font> open(<font class="keywordtype">bool</font> initValue = <font class="keyword">false</font>) {00635         signaled = initValue;00636     }00637     <font class="keywordtype">void</font> close() {}00638 };00639 00640 <font class="keyword">template</font>&lt;<font class="keyword">class</font> T&gt;00641 <font class="keyword">class </font>dbThreadContext { 00642     T* value;00643   <font class="keyword">public</font>:00644     T* get() { 00645         <font class="keywordflow">return</font> value;00646     }00647     <font class="keywordtype">void</font> set(T* value) { 00648         this-&gt;value = value;00649     }00650     dbThreadContext() { value = NULL; }00651 };00652 00653 00654 <font class="keyword">class </font>dbProcessId { 00655     <font class="keywordtype">int</font>       pid;00656   <font class="keyword">public</font>:00657     <font class="keywordtype">bool</font> operator != (dbProcessId <font class="keyword">const</font>&amp; other)<font class="keyword"> const </font>{ 00658         <font class="keywordflow">return</font> pid != other.pid;00659     }00660     00661     <font class="keywordtype">void</font> clear() { 00662         pid = 0;00663     }00664 00665     <font class="keyword">static</font> dbProcessId getCurrent() {00666         dbProcessId curr;00667         curr.pid = getpid();00668         <font class="keywordflow">return</font> curr;00669     }00670 };00671 00672 <font class="preprocessor">#endif</font>00673 <font class="preprocessor"></font>00674 <font class="preprocessor">#define INFINITE (~0U)</font>00675 <font class="preprocessor"></font>00676 <font class="preprocessor">#ifdef USE_POSIX_API</font>00677 <font class="preprocessor"></font>00678 <font class="keyword">class </font>dbInitializationMutex { 00679     sem_t* sem;00680   <font class="keyword">public</font>: 00681     <font class="keyword">enum</font> initializationStatus { 00682         InitializationError, 00683         AlreadyInitialized,00684         NotYetInitialized00685     };00686     initializationStatus initialize(<font class="keywordtype">char</font> <font class="keyword">const</font>* name) { 00687         initializationStatus status;00688         <font class="keywordtype">char</font>* tmp = NULL;00689         <font class="keywordflow">if</font> (*name != <font class="charliteral">'/'</font>) { 00690             tmp = <font class="keyword">new</font> <font class="keywordtype">char</font>[strlen(name)+2];00691             strcpy(tmp+1, name);00692             *tmp = <font class="charliteral">'/'</font>;00693             name = tmp;00694         }00695         <font class="keywordflow">while</font> (true) {00696             sem = sem_open(name, 0);00697             <font class="keywordflow">if</font> (sem == NULL) { 00698                 <font class="keywordflow">if</font> (errno == ENOENT) {00699                     sem = sem_open(name, O_CREAT|O_EXCL, 0777, 0);00700                     <font class="keywordflow">if</font> (sem != NULL) { 00701                         status = NotYetInitialized;00702                         <font class="keywordflow">break</font>;00703                     } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (errno != EEXIST) { 00704                         status = InitializationError;00705                         <font class="keywordflow">break</font>;00706                     }00707                 } <font class="keywordflow">else</font> { 00708                     status = InitializationError;00709                     <font class="keywordflow">break</font>;00710                 }00711             } <font class="keywordflow">else</font> { 00712                 status = (sem_wait(sem) == 0 &amp;&amp; sem_post(sem) == 0) 00713                     ? AlreadyInitialized : InitializationError;00714                 <font class="keywordflow">break</font>;00715             }00716         }00717         <font class="keyword">delete</font>[] tmp;00718         <font class="keywordflow">return</font> status;00719     }00720 00721     <font class="keywordtype">void</font> done() { 00722         sem_post(sem);00723     }00724     <font class="keywordtype">bool</font> close() {00725         sem_close(sem);00726         <font class="keywordflow">return</font> <font class="keyword">false</font>;00727     }00728     <font class="keywordtype">void</font> erase() { 00729         close();00730     }00731 };00732 00733 00734 <font class="keyword">class </font>dbSemaphore { 00735   <font class="keyword">protected</font>:00736     sem_t* sem;00737   <font class="keyword">public</font>:00738     <font class="keywordtype">void</font> wait() { 00739         <font class="keywordtype">int</font> rc = sem_wait(sem);00740         assert(rc == 0);00741     }00742 00743     <font class="keywordtype">bool</font> wait(<font class="keywordtype">unsigned</font> msec) { 00744 <font class="preprocessor">#ifdef POSIX_1003_1d</font>00745 <font class="preprocessor"></font>        <font class="keyword">struct </font>timespec abs_ts;00746         <font class="keyword">struct </font>timeval  cur_tv;00747         clock_gettime(CLOCK_REALTIME, &amp;cur_tv);00748         abs_ts.tv_sec = cur_tv.tv_sec + (msec + tv.tv_usec / 1000) / 1000000; 00749         abs_ts.tv_nsec = (msec + tv.tv_usec / 1000) % 1000000 * 1000;00750         <font class="keywordtype">int</font> rc = sem_timedwait(sem, &amp;abs_ts);00751         <font class="keywordflow">if</font> (rc &lt; 0) { 00752             assert(errno == ETIMEDOUT);00753             <font class="keywordflow">return</font> <font class="keyword">false</font>;00754         }00755         <font class="keywordflow">return</font> <font class="keyword">true</font>;00756 <font class="preprocessor">#else </font>00757 <font class="preprocessor"></font>        <font class="keywordtype">int</font> rc = sem_wait(sem);00758         assert(rc == 0);00759         <font class="keywordflow">return</font> <font class="keyword">true</font>;00760 <font class="preprocessor">#endif  </font>00761 <font class="preprocessor"></font>    }00762 00763     <font class="keywordtype">void</font> signal(<font class="keywordtype">unsigned</font> inc = 1) {00764         <font class="keywordflow">while</font> (--inc &gt; 0) { 00765             sem_post(sem);00766         }00767     }00768     <font class="keywordtype">void</font> reset() { 00769         <font class="keywordflow">while</font> (sem_trywait(sem) == 0);00770     }    00771     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">unsigned</font> initValue = 0) {00772         <font class="keywordtype">char</font>* tmp = NULL;00773         <font class="keywordflow">if</font> (*name != <font class="charliteral">'/'</font>) { 00774             tmp = <font class="keyword">new</font> <font class="keywordtype">char</font>[strlen(name)+2];00775             strcpy(tmp+1, name);00776             *tmp = <font class="charliteral">'/'</font>;00777             name = tmp;00778         }00779         sem = sem_open(name, O_CREAT, 0777, initValue);00780         <font class="keyword">delete</font>[] tmp;00781         <font class="keywordflow">return</font> sem != NULL; 00782     }00783     <font class="keywordtype">void</font> close() {00784         sem_close(sem);00785     }00786     <font class="keywordtype">void</font> erase() { 00787         close();00788     }00789 };00790 00791 <font class="keyword">class </font>dbEvent : <font class="keyword">public</font> dbSemaphore { 00792   <font class="keyword">public</font>:00793     <font class="keywordtype">void</font> wait() { 00794         dbSemaphore::wait();00795         sem_post(sem);00796     }00797     <font class="keywordtype">bool</font> wait(<font class="keywordtype">unsigned</font> msec) { 00798         <font class="keywordflow">if</font> (dbSemaphore::wait(msec)) { 00799             sem_post(sem);00800             <font class="keywordflow">return</font> <font class="keyword">true</font>;00801         }00802         <font class="keywordflow">return</font> <font class="keyword">false</font>;00803     }00804     <font class="keywordtype">void</font> signal() {00805         <font class="keywordflow">while</font> (sem_trywait(sem) == 0);00806         sem_post(sem);00807     }00808     <font class="keywordtype">void</font> reset() {00809         <font class="keywordflow">while</font> (sem_trywait(sem) == 0);00810     }00811     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">bool</font> signaled = <font class="keyword">false</font>) {00812         <font class="keywordflow">return</font> dbSemaphore::open(name, (<font class="keywordtype">int</font>)signaled);00813     }00814 };00815 00816 <font class="keyword">template</font>&lt;<font class="keyword">class</font> T&gt;00817 <font class="keyword">class </font>dbSharedObject { 00818     <font class="keywordtype">char</font>* name;00819     T*  ptr;00820     <font class="keywordtype">int</font> fd;00821   <font class="keyword">public</font>:00822 00823     dbSharedObject() { 00824         name = NULL;00825         ptr = NULL;00826         fd = -1;00827     }00828 00829     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font>* fileName) { 00830         <font class="keyword">delete</font>[] name;00831         name = <font class="keyword">new</font> <font class="keywordtype">char</font>[strlen(fileName) + 1];00832         strcpy(name, fileName);00833         fd = ::open(fileName, O_RDWR|O_CREAT, 0777);00834         <font class="keywordflow">if</font> (fd &lt; 0) { 00835             <font class="keywordflow">return</font> <font class="keyword">false</font>;00836         }00837         ptr = (T*)mmap(NULL,00838                        DOALIGN(<font class="keyword">sizeof</font>(T), 4096),00839                        PROT_READ|PROT_WRITE,00840                        MAP_SHARED,00841                        fd,00842                        0);00843         <font class="keywordflow">if</font> (ptr == MAP_FAILED) { 00844             ptr = NULL;00845             ::close(fd);00846             <font class="keywordflow">return</font> <font class="keyword">false</font>;00847         }00848         <font class="keywordflow">return</font> <font class="keyword">true</font>;00849     }00850 00851     T* get() { <font class="keywordflow">return</font> ptr; }00852 00853     <font class="keywordtype">void</font> close() { 00854         <font class="keywordflow">if</font> (ptr != NULL) { 00855             munmap(ptr, DOALIGN(<font class="keyword">sizeof</font>(T), 4096));00856         }00857         <font class="keywordflow">if</font> (fd &gt; 0) { 00858             ::close(fd);00859         }00860     }00861     <font class="keywordtype">void</font> erase() {00862         close();00863         unlink(name);   00864     }  00865 00866     ~dbSharedObject() { 00867         <font class="keyword">delete</font>[] name;00868     }00869 };00870 00871 <font class="preprocessor">#else // USE_POSIX_API</font>00872 <font class="preprocessor"></font>00873 <font class="keyword">extern</font> <font class="keywordtype">char</font> <font class="keyword">const</font>* keyFileDir; <font class="comment">// default value: "/tmp/" </font>00874 00875 <font class="keyword">class </font>dbInitializationMutex { 00876     <font class="keywordtype">int</font> semid;00877   <font class="keyword">public</font>: 

⌨️ 快捷键说明

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