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&) { 00610 assert (count > 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&) { 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><<font class="keyword">class</font> T>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->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>& 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 && 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, &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, &abs_ts);00751 <font class="keywordflow">if</font> (rc < 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 > 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><<font class="keyword">class</font> T>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 < 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 > 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 + -
显示快捷键?