sync_8h-source.html

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

HTML
1,178
字号
00288 <font class="preprocessor">#ifdef NO_MMAP</font>00289 <font class="preprocessor"></font>        ptr = <font class="keyword">new</font> T();00290 <font class="preprocessor">#else</font>00291 <font class="preprocessor"></font>        h = CreateFileMapping(INVALID_HANDLE_VALUE,00292                               FASTDB_SECURITY_ATTRIBUTES, PAGE_READWRITE, 0, 00293                               <font class="keyword">sizeof</font>(T), name);00294         <font class="keywordflow">if</font> (h == NULL) { 00295             <font class="keywordflow">return</font> <font class="keyword">false</font>;00296         }00297         ptr = (T*)MapViewOfFile(h, FILE_MAP_ALL_ACCESS, 0, 0, 0);00298         <font class="keywordflow">if</font> (ptr == NULL) { 00299             CloseHandle(h);00300             <font class="keywordflow">return</font> <font class="keyword">false</font>;00301         }00302 <font class="preprocessor">#endif</font>00303 <font class="preprocessor"></font>        <font class="keywordflow">return</font> <font class="keyword">true</font>;00304     }00305 00306     T* get() { <font class="keywordflow">return</font> ptr; }00307 00308     <font class="keywordtype">void</font> close() { 00309 <font class="preprocessor">#ifdef NO_MMAP</font>00310 <font class="preprocessor"></font>        <font class="keyword">delete</font>[] ptr;00311 <font class="preprocessor">#else</font>00312 <font class="preprocessor"></font>        UnmapViewOfFile(ptr);00313         CloseHandle(h);00314 <font class="preprocessor">#endif</font>00315 <font class="preprocessor"></font>    }00316     <font class="keywordtype">void</font> erase() { 00317         close();00318     }00319 };00320 00321 <font class="keyword">typedef</font> <font class="keywordtype">long</font> sharedsem_t;00322 00323 <font class="keyword">class </font>FASTDB_DLL_ENTRY dbGlobalCriticalSection { 00324     HANDLE       event;00325     sharedsem_t* count;00326 00327   <font class="keyword">public</font>:00328     <font class="keywordtype">void</font> enter() { 00329         <font class="keywordflow">if</font> (InterlockedDecrement(count) != 0) { 00330             <font class="comment">// another process is in critical section</font>00331             <font class="keywordtype">int</font> rc = WaitForSingleObject(event, INFINITE);00332             assert (rc == WAIT_OBJECT_0);00333         }00334     }00335 00336     <font class="keywordtype">void</font> leave() { 00337         <font class="keywordflow">if</font> (InterlockedIncrement(count) &lt;= 0) { 00338             <font class="comment">// some other processes try to enter critical section</font>00339             SetEvent(event);00340         }00341     }00342 00343     <font class="keywordtype">bool</font> open(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">long</font>* count) { 00344         this-&gt;count = count;00345         event = OpenEvent(EVENT_ALL_ACCESS, FALSE, name);00346         <font class="keywordflow">return</font> event != NULL;00347     }00348     <font class="keywordtype">bool</font> create(<font class="keywordtype">char</font> <font class="keyword">const</font>* name, <font class="keywordtype">long</font>* count) { 00349         this-&gt;count = count;00350         *count = 1;00351         event = CreateEvent(FASTDB_SECURITY_ATTRIBUTES, <font class="keyword">false</font>, <font class="keyword">false</font>, name);00352         <font class="keywordflow">return</font> event != NULL;00353     }00354     <font class="keywordtype">void</font> close() { 00355         CloseHandle(event);00356     }00357     <font class="keywordtype">void</font> erase() { 00358         close();00359     }00360 };00361         00362     00363 <font class="preprocessor">#else // Unix</font>00364 <font class="preprocessor"></font>00365 <font class="preprocessor">#include &lt;unistd.h&gt;</font>00366 <font class="preprocessor">#include &lt;string.h&gt;</font>00367 <font class="preprocessor">#include &lt;fcntl.h&gt;</font>00368 <font class="preprocessor">#include &lt;sys/time.h&gt;</font>00369 <font class="preprocessor">#include &lt;sys/types.h&gt;</font>00370 <font class="preprocessor">#include &lt;errno.h&gt;</font>00371 00372 <font class="preprocessor">#ifdef USE_POSIX_API</font>00373 <font class="preprocessor"></font><font class="preprocessor">#include &lt;semaphore.h&gt;</font>00374 <font class="preprocessor">#include &lt;sys/mman.h&gt;</font>00375 <font class="preprocessor">#else</font>00376 <font class="preprocessor"></font><font class="preprocessor">#include &lt;sys/ipc.h&gt;</font>00377 <font class="preprocessor">#include &lt;sys/sem.h&gt;</font>00378 <font class="preprocessor">#include &lt;sys/shm.h&gt;</font>00379 <font class="preprocessor">#include &lt;sys/mman.h&gt;</font>00380 <font class="preprocessor">#endif</font>00381 <font class="preprocessor"></font>00382 <font class="preprocessor">#define thread_proc</font>00383 <font class="preprocessor"></font>00384 <font class="preprocessor">#ifndef NO_PTHREADS</font>00385 <font class="preprocessor"></font>00386 <font class="preprocessor">#include &lt;pthread.h&gt;</font>00387 00388 <font class="keyword">class </font>dbMutex { 00389     <font class="keyword">friend</font> <font class="keyword">class </font>dbLocalEvent;00390     <font class="keyword">friend</font> <font class="keyword">class </font>dbLocalSemaphore;00391     pthread_mutex_t cs;00392   <font class="keyword">public</font>:00393     dbMutex() { 00394         pthread_mutex_init(&amp;cs, NULL);00395     }00396     ~dbMutex() { 00397         pthread_mutex_destroy(&amp;cs);00398     }00399     <font class="keywordtype">void</font> lock() { 00400         pthread_mutex_lock(&amp;cs);00401     }00402     <font class="keywordtype">void</font> unlock() { 00403         pthread_mutex_unlock(&amp;cs);00404     }00405 };00406 00407 <font class="keyword">const</font> size_t dbThreadStackSize = 1024*1024;00408 00409 <font class="keyword">class </font>dbThread { 00410     pthread_t thread;00411   <font class="keyword">public</font>:00412     <font class="keyword">typedef</font> void (thread_proc* thread_proc_t)(<font class="keywordtype">void</font>*);00413     <font class="keywordtype">void</font> create(thread_proc_t f, <font class="keywordtype">void</font>* arg) {00414         pthread_attr_t attr;00415         pthread_attr_init(&amp;attr);00416 <font class="preprocessor">#if !defined(__linux__)</font>00417 <font class="preprocessor"></font>        pthread_attr_setstacksize(&amp;attr, dbThreadStackSize);00418 <font class="preprocessor">#endif</font>00419 <font class="preprocessor"></font><font class="preprocessor">#if defined(_AIX41)</font>00420 <font class="preprocessor"></font>        <font class="comment">// At AIX 4.1, 4.2 threads are by default created detached</font>00421         pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_UNDETACHED);00422 <font class="preprocessor">#endif</font>00423 <font class="preprocessor"></font>        pthread_create(&amp;thread, &amp;attr, (<font class="keywordtype">void</font>*(*)(<font class="keywordtype">void</font>*))f, arg);00424         pthread_attr_destroy(&amp;attr);00425     }00426 00427     <font class="keywordtype">void</font> join() { 00428         <font class="keywordtype">void</font>* result;00429         pthread_join(thread, &amp;result);00430     }00431     <font class="keywordtype">void</font> detach() { 00432         pthread_detach(thread);00433     }00434 00435     <font class="keyword">enum</font> ThreadPriority { 00436         THR_PRI_LOW, 00437         THR_PRI_HIGH00438     };00439     <font class="keywordtype">void</font> setPriority(ThreadPriority pri) { 00440 <font class="preprocessor">#if defined(PRI_OTHER_MIN) &amp;&amp; defined(PRI_OTHER_MAX)</font>00441 <font class="preprocessor"></font>        <font class="keyword">struct </font>sched_param sp;00442         sp.gsched_priority = pri == THR_PRI_LOW ? PRI_OTHER_MIN : PRI_OTHER_MAX;00443         pthread_setschedparam(thread, SCHED_OTHER, &amp;sp); 00444 <font class="preprocessor">#endif</font>00445 <font class="preprocessor"></font>    }00446 00447     <font class="keyword">static</font> <font class="keywordtype">int</font> numberOfProcessors();00448 };00449 00450 00451 <font class="keyword">class </font>dbLocalEvent { 00452     pthread_cond_t   cond;00453     <font class="keywordtype">int</font>              signaled;00454   <font class="keyword">public</font>:00455     <font class="keywordtype">void</font> wait(dbMutex&amp; mutex) { 00456         <font class="keywordflow">while</font> (!signaled) { 00457             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00458         }00459     }00460     <font class="keywordtype">bool</font> wait(dbMutex&amp; mutex, time_t timeout) {00461         <font class="keywordflow">while</font> (!signaled) {00462             <font class="keyword">struct </font>timespec abs_ts; 00463 <font class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</font>00464 <font class="preprocessor"></font>            <font class="keyword">struct </font>timespec rel_ts; 00465             rel_ts.tv_sec = timeout/1000; 00466             rel_ts.tv_nsec = timeout%1000*1000000;00467             pthread_get_expiration_np(&amp;rel_ts, &amp;abs_ts);00468 <font class="preprocessor">#else</font>00469 <font class="preprocessor"></font>            <font class="keyword">struct </font>timeval cur_tv;00470             gettimeofday(&amp;cur_tv, NULL);00471             abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00472             abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00473             <font class="keywordflow">if</font> (abs_ts.tv_nsec &gt; 1000000000) { 00474                 abs_ts.tv_nsec -= 1000000000;00475                 abs_ts.tv_sec += 1;00476             }00477 <font class="preprocessor">#endif</font>00478 <font class="preprocessor"></font>            <font class="keywordtype">int</font> rc = pthread_cond_timedwait(&amp;cond, &amp;mutex.cs, &amp;abs_ts);00479             <font class="keywordflow">if</font> (rc == ETIMEDOUT) { 00480                 <font class="keywordflow">return</font> <font class="keyword">false</font>;00481             }00482         }00483         <font class="keywordflow">return</font> <font class="keyword">true</font>;00484     }00485     <font class="keywordtype">void</font> signal() {00486         signaled = <font class="keyword">true</font>;00487         pthread_cond_broadcast(&amp;cond);00488     }00489     <font class="keywordtype">void</font> reset() {00490         signaled = <font class="keyword">false</font>;00491     }00492     <font class="keywordtype">void</font> open(<font class="keywordtype">bool</font> initValue = <font class="keyword">false</font>) { 00493         signaled = initValue;00494         pthread_cond_init(&amp;cond, NULL);00495     }00496     <font class="keywordtype">void</font> close() {00497         pthread_cond_destroy(&amp;cond);00498     }00499 };00500 00501 <font class="keyword">class </font>dbLocalSemaphore { 00502     pthread_cond_t   cond;00503     <font class="keywordtype">int</font>              count;00504   <font class="keyword">public</font>:00505     <font class="keywordtype">void</font> wait(dbMutex&amp; mutex) { 00506         <font class="keywordflow">while</font> (count == 0) { 00507             pthread_cond_wait(&amp;cond, &amp;mutex.cs);00508         }00509         count -= 1;00510     }00511     <font class="keywordtype">void</font> wait(dbMutex&amp; mutex, time_t timeout) {00512         <font class="keywordflow">while</font> (count == 0) {00513             <font class="keyword">struct </font>timespec abs_ts; 00514 <font class="preprocessor">#ifdef PTHREAD_GET_EXPIRATION_NP</font>00515 <font class="preprocessor"></font>            <font class="keyword">struct </font>timespec rel_ts; 00516             rel_ts.tv_sec = timeout/1000; 00517             rel_ts.tv_nsec = timeout%1000*1000000;00518             pthread_get_expiration_np(&amp;rel_ts, &amp;abs_ts);00519 <font class="preprocessor">#else</font>00520 <font class="preprocessor"></font>            <font class="keyword">struct </font>timeval cur_tv;00521             gettimeofday(&amp;cur_tv, NULL);00522             abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 00523             abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;00524             <font class="keywordflow">if</font> (abs_ts.tv_nsec &gt; 1000000000) { 00525                 abs_ts.tv_nsec -= 1000000000;00526                 abs_ts.tv_sec += 1;00527             }00528 <font class="preprocessor">#endif</font>00529 <font class="preprocessor"></font>            pthread_cond_timedwait(&amp;cond, &amp;mutex.cs, &amp;abs_ts);00530         }00531         count -= 1;00532     }00533      <font class="keywordtype">void</font> signal(<font class="keywordtype">unsigned</font> inc = 1) {00534         count += inc;00535         <font class="keywordflow">if</font> (inc &gt; 1) { 00536             pthread_cond_broadcast(&amp;cond);00537         } <font class="keywordflow">else</font> <font class="keywordflow">if</font> (inc == 1) { 00538             pthread_cond_signal(&amp;cond);00539         }00540     }00541     <font class="keywordtype">void</font> open(<font class="keywordtype">unsigned</font> initValue = 0) { 00542         pthread_cond_init(&amp;cond, NULL);00543         count = initValue;00544     }00545     <font class="keywordtype">void</font> close() {00546         pthread_cond_destroy(&amp;cond);00547     }00548 };00549 00550 <font class="keyword">template</font>&lt;<font class="keyword">class</font> T&gt; 00551 <font class="keyword">class </font>dbThreadContext { 00552     pthread_key_t key;00553   <font class="keyword">public</font>:00554     T* get() { 00555         <font class="keywordflow">return</font> (T*)pthread_getspecific(key);00556     }00557     <font class="keywordtype">void</font> set(T* value) { 00558         pthread_setspecific(key, value);00559     }00560     dbThreadContext() { 00561         pthread_key_create(&amp;key, NULL);00562     }00563     ~dbThreadContext() { 00564         pthread_key_delete(key);00565     }00566 };00567 00568 <font class="keyword">class </font>dbProcessId { 00569     <font class="keywordtype">int</font>       pid;00570     pthread_t tid;00571   <font class="keyword">public</font>:00572     <font class="keywordtype">bool</font> operator != (dbProcessId <font class="keyword">const</font>&amp; other)<font class="keyword"> const </font>{ 00573         <font class="keywordflow">return</font> pid != other.pid || tid != other.tid;00574     }00575 00576     <font class="keywordtype">void</font> clear() { 00577         pid = 0;00578         tid = 0;00579     }00580 00581     <font class="keyword">static</font> dbProcessId getCurrent() {00582         dbProcessId curr;

⌨️ 快捷键说明

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