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

📄 sync__unix_8h-source.html

📁 俄罗斯牛人KK的作品,著名的ORDBMS,这里上传最新的3.39版本源代码.希望了解对象关系数据库的同好,请不要错过.
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00279         curr.tid = pthread_self();00280         <span class="keywordflow">return</span> curr;00281     }00282 };00283 00284 <span class="preprocessor">#else // NO_PTHREAD</span>00285 <span class="preprocessor"></span>00286 <span class="comment">// Non pthread based threads, mutexes, etc.</span>00287 <span class="comment">// Maps to skeleton  functions, this implementation isn't using threads.</span>00288 00289 <span class="keyword">class </span>dbMutex {00290     <span class="keywordtype">bool</span> initialized;00291 00292    <span class="keyword">public</span>:00293     dbMutex() {00294         initialized = <span class="keyword">true</span>;00295     }00296 00297     ~dbMutex() { 00298         initialized = <span class="keyword">false</span>;00299     }00300 00301     <span class="keywordtype">bool</span> isInitialized() { 00302         <span class="keywordflow">return</span> initialized;00303     }00304 00305     <span class="keywordtype">void</span> lock() {}00306     <span class="keywordtype">void</span> unlock() {}00307 };00308 00309 <span class="keyword">class </span>dbThread { 00310   <span class="keyword">public</span>:00311     <span class="keyword">typedef</span> void (thread_proc* thread_proc_t)(<span class="keywordtype">void</span>*);00312     <span class="keywordtype">void</span> create(thread_proc_t f, <span class="keywordtype">void</span>* arg) { f(arg); }00313     <span class="keywordtype">void</span> join() {}00314     <span class="keywordtype">void</span> detach() {}00315     <span class="keyword">enum</span> ThreadPriority { 00316         THR_PRI_LOW, 00317         THR_PRI_HIGH00318     };00319     <span class="keywordtype">void</span> setPriority(ThreadPriority pri) { }00320     <span class="keyword">static</span> <span class="keywordtype">int</span> numberOfProcessors() { <span class="keywordflow">return</span> 1; }00321 };00322 00323 <span class="keyword">class </span>dbLocalSemaphore { 00324     <span class="keywordtype">int</span> count;00325   <span class="keyword">public</span>:00326     <span class="keywordtype">void</span> wait(dbMutex&amp;) { 00327         assert (count &gt; 0);00328         count -= 1;00329     }00330     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {00331         count += inc;00332     }00333     <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) {00334         count = initValue;00335     }00336     <span class="keywordtype">void</span> close() {}00337 };00338 00339 <span class="keyword">class </span>dbLocalEvent { 00340     <span class="keywordtype">bool</span> signaled;00341   <span class="keyword">public</span>:00342     <span class="keywordtype">void</span> wait(dbMutex&amp;) { 00343         assert(signaled);00344     }00345     <span class="keywordtype">bool</span> wait(dbMutex&amp; mutex, time_t timeout) {00346         <span class="keywordflow">return</span> <span class="keyword">true</span>;00347     }00348     <span class="keywordtype">void</span> signal() {00349         signaled = <span class="keyword">true</span>;00350     }00351     <span class="keywordtype">void</span> reset() {00352         signaled = <span class="keyword">false</span>;00353     }00354     <span class="keywordtype">void</span> open(<span class="keywordtype">bool</span> initValue = <span class="keyword">false</span>) {00355         signaled = initValue;00356     }00357     <span class="keywordtype">void</span> close() {}00358 };00359 00360 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;00361 <span class="keyword">class </span>dbThreadContext { 00362     T* value;00363   <span class="keyword">public</span>:00364     T* get() { 00365         <span class="keywordflow">return</span> value;00366     }00367     <span class="keywordtype">void</span> set(T* value) { 00368         this-&gt;value = value;00369     }00370     dbThreadContext() { value = NULL; }00371 };00372 00373 00374 <span class="keyword">class </span>dbProcessId { 00375     <span class="keywordtype">int</span>       pid;00376   <span class="keyword">public</span>:00377     <span class="keywordtype">bool</span> operator != (dbProcessId <span class="keyword">const</span>&amp; other)<span class="keyword"> const </span>{ 00378         <span class="keywordflow">return</span> pid != other.pid;00379     }00380     00381     <span class="keywordtype">void</span> clear() { 00382         pid = 0;00383     }00384 00385     <span class="keyword">static</span> dbProcessId getCurrent() {00386         dbProcessId curr;00387         curr.pid = getpid();00388         <span class="keywordflow">return</span> curr;00389     }00390 };00391 00392 <span class="preprocessor">#endif // NO_PTHREAD</span>00393 <span class="preprocessor"></span>00394 00395 <span class="preprocessor">#define INFINITE (~0U)</span>00396 <span class="preprocessor"></span>00397 00398 <span class="preprocessor">#ifdef USE_POSIX_SEMAPHORES</span>00399 <span class="preprocessor"></span>00400 <span class="comment">// Initialization Mutex using Posix based semaphores</span>00401 <span class="keyword">class </span>dbInitializationMutex { 00402     sem_t* sem;00403   <span class="keyword">public</span>: 00404     <span class="keyword">enum</span> initializationStatus { 00405         InitializationError, 00406         AlreadyInitialized,00407         NotYetInitialized00408     };00409     initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name) { 00410         initializationStatus status;00411         <span class="keywordtype">char</span>* tmp = NULL;00412         <span class="keywordflow">if</span> (*name != <span class="charliteral">'/'</span>) { 00413             tmp = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name)+2];00414             strcpy(tmp+1, name);00415             *tmp = <span class="charliteral">'/'</span>;00416             name = tmp;00417         }00418         <span class="keywordflow">while</span> (true) {00419             sem = sem_open(name, 0);00420             <span class="keywordflow">if</span> (sem == SEM_FAILED) { 00421                 <span class="keywordflow">if</span> (errno == ENOENT) {00422                     sem = sem_open(name, O_CREAT|O_EXCL, 0777, 0);00423                     <span class="keywordflow">if</span> (sem != SEM_FAILED) { 00424                         status = NotYetInitialized;00425                         <span class="keywordflow">break</span>;00426                     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (errno != EEXIST) { 00427                         status = InitializationError;00428                         <span class="keywordflow">break</span>;00429                     }00430                 } <span class="keywordflow">else</span> { 00431                     status = InitializationError;00432                     <span class="keywordflow">break</span>;00433                 }00434             } <span class="keywordflow">else</span> { 00435                 status = (sem_wait(sem) == 0 &amp;&amp; sem_post(sem) == 0) 00436                     ? AlreadyInitialized : InitializationError;00437                 <span class="keywordflow">break</span>;00438             }00439         }00440         <span class="keyword">delete</span>[] tmp;00441         <span class="keywordflow">return</span> status;00442     }00443 00444     <span class="keywordtype">void</span> done() { 00445         sem_post(sem);00446     }00447     <span class="keywordtype">bool</span> close() {00448         sem_close(sem);00449         <span class="keywordflow">return</span> <span class="keyword">false</span>;00450     }00451     <span class="keywordtype">void</span> erase() { 00452         close();00453     }00454 };00455 00456 <span class="keyword">class </span>dbSemaphore { 00457   <span class="keyword">protected</span>:00458     sem_t* sem;00459   <span class="keyword">public</span>:00460     <span class="keywordtype">void</span> wait() { 00461         <span class="keywordtype">int</span> rc = sem_wait(sem);00462         assert(rc == 0);00463     }00464 00465     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) { 00466 <span class="preprocessor">#ifdef POSIX_1003_1d</span>00467 <span class="preprocessor"></span>        <span class="keyword">struct </span>timespec abs_ts;00468         <span class="keyword">struct </span>timeval  cur_tv;00469         clock_gettime(CLOCK_REALTIME, &amp;cur_tv);00470         abs_ts.tv_sec = cur_tv.tv_sec + (msec + cur_tv.tv_usec / 1000) / 1000000; 00471         abs_ts.tv_nsec = (msec + cur_tv.tv_usec / 1000) % 1000000 * 1000;00472         <span class="keywordtype">int</span> rc = sem_timedwait(sem, &amp;abs_ts);00473         <span class="keywordflow">if</span> (rc &lt; 0) { 00474             assert(errno == ETIMEDOUT);00475             <span class="keywordflow">return</span> <span class="keyword">false</span>;00476         }00477         <span class="keywordflow">return</span> <span class="keyword">true</span>;00478 <span class="preprocessor">#else </span>00479 <span class="preprocessor"></span>        <span class="keywordtype">int</span> rc = sem_wait(sem);00480         assert(rc == 0);00481         <span class="keywordflow">return</span> <span class="keyword">true</span>;00482 <span class="preprocessor">#endif  </span>00483 <span class="preprocessor"></span>    }00484 00485     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {00486         <span class="keywordflow">while</span> (--inc &gt; 0) { 00487             sem_post(sem);00488         }00489     }00490     <span class="keywordtype">void</span> reset() { 00491         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);00492     }    00493     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">unsigned</span> initValue = 0) {00494         <span class="keywordtype">char</span>* tmp = NULL;00495         <span class="keywordflow">if</span> (*name != <span class="charliteral">'/'</span>) { 00496             tmp = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name)+2];00497             strcpy(tmp+1, name);00498             *tmp = <span class="charliteral">'/'</span>;00499             name = tmp;00500         }00501         sem = sem_open(name, O_CREAT, 0777, initValue);00502         <span class="keyword">delete</span>[] tmp;00503         <span class="keywordflow">return</span> sem != NULL; 00504     }00505     <span class="keywordtype">void</span> close() {00506         sem_close(sem);00507     }00508     <span class="keywordtype">void</span> erase() { 00509         close();00510     }00511 };00512 00513 <span class="keyword">class </span>dbEvent : <span class="keyword">public</span> dbSemaphore { 00514   <span class="keyword">public</span>:00515     <span class="keywordtype">void</span> wait() { 00516         dbSemaphore::wait();00517         sem_post(sem);00518     }00519     <span class="keywordtype">bool</span> wait(<span class="keywordtype">unsigned</span> msec) { 00520         <span class="keywordflow">if</span> (dbSemaphore::wait(msec)) { 00521             sem_post(sem);00522             <span class="keywordflow">return</span> <span class="keyword">true</span>;00523         }00524         <span class="keywordflow">return</span> <span class="keyword">false</span>;00525     }00526     <span class="keywordtype">void</span> signal() {00527         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);00528         sem_post(sem);00529     }00530     <span class="keywordtype">void</span> reset() {00531         <span class="keywordflow">while</span> (sem_trywait(sem) == 0);00532     }00533     <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>) {00534         <span class="keywordflow">return</span> dbSemaphore::open(name, (<span class="keywordtype">int</span>)signaled);00535     }00536 };00537 <span class="preprocessor">#else // USE_POSIX_SEMAPHORES</span>00538 <span class="preprocessor"></span>00539 <span class="keyword">class </span>FASTDB_DLL_ENTRY dbWatchDog { 00540     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name, <span class="keywordtype">int</span> flags);00541   <span class="keyword">public</span>:00542     <span class="keywordtype">bool</span> watch();00543     <span class="keywordtype">void</span> close(); 00544     <span class="keywordtype">bool</span> open(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);00545     <span class="keywordtype">bool</span> create(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);00546     <span class="keywordtype">int</span> id;00547 };00548 00549 <span class="comment">// Define local implemenation of InitializationMutex in sync.cpp</span>00550 <span class="keyword">class </span>dbInitializationMutex { 00551     <span class="keywordtype">int</span> semid;00552   <span class="keyword">public</span>: 00553     <span class="keyword">enum</span> initializationStatus { 00554         InitializationError, 00555         AlreadyInitialized,00556         NotYetInitialized00557     };00558     initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name);00559     <span class="keywordtype">void</span> done(); 00560     <span class="keywordtype">bool</span> close();00561     <span class="keywordtype">void</span> erase();00562 };00563 

⌨️ 快捷键说明

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