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

📄 sync__unix_8h-source.html

📁 最新版本!fastdb是高效的内存数据库系统
💻 HTML
📖 第 1 页 / 共 4 页
字号:
00222             rel_ts.tv_nsec = timeout%1000*1000000;
00223             pthread_get_expiration_np(&rel_ts, &abs_ts);
00224 <span class="preprocessor">#else</span>
00225 <span class="preprocessor"></span>            <span class="keyword">struct </span>timeval cur_tv;
00226             gettimeofday(&amp;cur_tv, NULL);
00227             abs_ts.tv_sec = cur_tv.tv_sec + timeout/1000; 
00228             abs_ts.tv_nsec = cur_tv.tv_usec*1000 + timeout%1000*1000000;
00229             <span class="keywordflow">if</span> (abs_ts.tv_nsec &gt; 1000000000) { 
00230                 abs_ts.tv_nsec -= 1000000000;
00231                 abs_ts.tv_sec += 1;
00232             }
00233 <span class="preprocessor">#endif</span>
00234 <span class="preprocessor"></span>            <span class="keywordflow">do</span> { 
00235                 <span class="keywordtype">int</span> rc = pthread_cond_timedwait(&amp;cond, &amp;mutex.cs, &amp;abs_ts);
00236                 <span class="keywordflow">if</span> (rc != 0) { 
00237                     <span class="keywordflow">return</span> <span class="keyword">false</span>;
00238                 }
00239             } <span class="keywordflow">while</span> (count == 0);
00240         }
00241         count -= 1;
00242         <span class="keywordflow">return</span> <span class="keyword">true</span>;
00243     }
00244     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {
00245         count += inc;
00246         <span class="keywordflow">if</span> (inc &gt; 1) { 
00247             pthread_cond_broadcast(&amp;cond);
00248         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inc == 1) { 
00249             pthread_cond_signal(&amp;cond);
00250         }
00251     }
00252     <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) { 
00253         pthread_cond_init(&amp;cond, NULL);
00254         count = initValue;
00255     }
00256     <span class="keywordtype">void</span> close() {
00257         pthread_cond_destroy(&amp;cond);
00258     }
00259 };
00260 
00261 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt; 
00262 <span class="keyword">class </span>dbThreadContext { 
00263     pthread_key_t key;
00264   <span class="keyword">public</span>:
00265     T* get() { 
00266         <span class="keywordflow">return</span> (T*)pthread_getspecific(key);
00267     }
00268     <span class="keywordtype">void</span> set(T* value) { 
00269         pthread_setspecific(key, value);
00270     }
00271     dbThreadContext() { 
00272         pthread_key_create(&amp;key, NULL);
00273     }
00274     ~dbThreadContext() { 
00275         pthread_key_delete(key);
00276     }
00277 };
00278 
00279 <span class="keyword">class </span>dbProcessId { 
00280     <span class="keywordtype">int</span>       pid;
00281     pthread_t tid;
00282   <span class="keyword">public</span>:
00283     <span class="keywordtype">bool</span> operator != (dbProcessId <span class="keyword">const</span>&amp; other)<span class="keyword"> const </span>{ 
00284         <span class="keywordflow">return</span> pid != other.pid || tid != other.tid;
00285     }
00286 
00287     <span class="keywordtype">void</span> clear() { 
00288         pid = 0;
00289         tid = 0;
00290     }
00291 
00292     <span class="keyword">static</span> dbProcessId getCurrent() {
00293         dbProcessId curr;
00294         curr.pid = getpid();
00295         curr.tid = pthread_self();
00296         <span class="keywordflow">return</span> curr;
00297     }
00298 };
00299 
00300 <span class="preprocessor">#else // NO_PTHREAD</span>
00301 <span class="preprocessor"></span>
00302 <span class="comment">// Non pthread based threads, mutexes, etc.</span>
00303 <span class="comment">// Maps to skeleton  functions, this implementation isn't using threads.</span>
00304 
00305 <span class="keyword">class </span>dbMutex {
00306     <span class="keywordtype">bool</span> initialized;
00307 
00308    <span class="keyword">public</span>:
00309     dbMutex() {
00310         initialized = <span class="keyword">true</span>;
00311     }
00312 
00313     ~dbMutex() { 
00314         initialized = <span class="keyword">false</span>;
00315     }
00316 
00317     <span class="keywordtype">bool</span> isInitialized() { 
00318         <span class="keywordflow">return</span> initialized;
00319     }
00320 
00321     <span class="keywordtype">void</span> lock() {}
00322     <span class="keywordtype">void</span> unlock() {}
00323 };
00324 
00325 <span class="keyword">class </span>dbThread { 
00326   <span class="keyword">public</span>:
00327     <span class="keyword">typedef</span> void (thread_proc* thread_proc_t)(<span class="keywordtype">void</span>*);
00328     <span class="keywordtype">void</span> create(thread_proc_t f, <span class="keywordtype">void</span>* arg) { f(arg); }
00329     <span class="keywordtype">void</span> join() {}
00330     <span class="keywordtype">void</span> detach() {}
00331     <span class="keyword">enum</span> ThreadPriority { 
00332         THR_PRI_LOW, 
00333         THR_PRI_HIGH
00334     };
00335     <span class="keywordtype">void</span> setPriority(ThreadPriority pri) { }
00336     <span class="keyword">static</span> <span class="keywordtype">int</span> numberOfProcessors() { <span class="keywordflow">return</span> 1; }
00337 };
00338 
00339 <span class="keyword">class </span>dbLocalSemaphore { 
00340     <span class="keywordtype">int</span> count;
00341   <span class="keyword">public</span>:
00342     <span class="keywordtype">void</span> wait(dbMutex&amp;) { 
00343         assert (count &gt; 0);
00344         count -= 1;
00345     }
00346     <span class="keywordtype">void</span> signal(<span class="keywordtype">unsigned</span> inc = 1) {
00347         count += inc;
00348     }
00349     <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) {
00350         count = initValue;
00351     }
00352     <span class="keywordtype">void</span> close() {}
00353 };
00354 
00355 <span class="keyword">class </span>dbLocalEvent { 
00356     <span class="keywordtype">bool</span> signaled;
00357   <span class="keyword">public</span>:
00358     <span class="keywordtype">void</span> wait(dbMutex&amp;) { 
00359         assert(signaled);
00360     }
00361     <span class="keywordtype">bool</span> wait(dbMutex&amp; mutex, time_t timeout) {
00362         <span class="keywordflow">return</span> <span class="keyword">true</span>;
00363     }
00364     <span class="keywordtype">void</span> signal() {
00365         signaled = <span class="keyword">true</span>;
00366     }
00367     <span class="keywordtype">void</span> reset() {
00368         signaled = <span class="keyword">false</span>;
00369     }
00370     <span class="keywordtype">void</span> open(<span class="keywordtype">bool</span> initValue = <span class="keyword">false</span>) {
00371         signaled = initValue;
00372     }
00373     <span class="keywordtype">void</span> close() {}
00374 };
00375 
00376 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;
00377 <span class="keyword">class </span>dbThreadContext { 
00378     T* value;
00379   <span class="keyword">public</span>:
00380     T* get() { 
00381         <span class="keywordflow">return</span> value;
00382     }
00383     <span class="keywordtype">void</span> set(T* value) { 
00384         this-&gt;value = value;
00385     }
00386     dbThreadContext() { value = NULL; }
00387 };
00388 
00389 
00390 <span class="keyword">class </span>dbProcessId { 
00391     <span class="keywordtype">int</span>       pid;
00392   <span class="keyword">public</span>:
00393     <span class="keywordtype">bool</span> operator != (dbProcessId <span class="keyword">const</span>&amp; other)<span class="keyword"> const </span>{ 
00394         <span class="keywordflow">return</span> pid != other.pid;
00395     }
00396     
00397     <span class="keywordtype">void</span> clear() { 
00398         pid = 0;
00399     }
00400 
00401     <span class="keyword">static</span> dbProcessId getCurrent() {
00402         dbProcessId curr;
00403         curr.pid = getpid();
00404         <span class="keywordflow">return</span> curr;
00405     }
00406 };
00407 
00408 <span class="preprocessor">#endif // NO_PTHREAD</span>
00409 <span class="preprocessor"></span>
00410 
00411 <span class="preprocessor">#define INFINITE (~0U)</span>
00412 <span class="preprocessor"></span>
00413 
00414 <span class="preprocessor">#ifdef USE_POSIX_SEMAPHORES</span>
00415 <span class="preprocessor"></span>
00416 <span class="comment">// Initialization Mutex using Posix based semaphores</span>
00417 <span class="keyword">class </span>dbInitializationMutex { 
00418     sem_t* sem;
00419     <span class="keywordtype">char</span>*  name;
00420   <span class="keyword">public</span>: 
00421     <span class="keyword">enum</span> initializationStatus { 
00422         InitializationError, 
00423         AlreadyInitialized,
00424         NotYetInitialized
00425     };
00426     initializationStatus initialize(<span class="keywordtype">char</span> <span class="keyword">const</span>* name) { 
00427         initializationStatus status;
00428         this-&gt;name = <span class="keyword">new</span> <span class="keywordtype">char</span>[strlen(name)+2];
00429         <span class="keywordflow">if</span> (*name != <span class="charliteral">'/'</span>) { 
00430             strcpy(this-&gt;name+1, name);
00431             *this-&gt;name = <span class="charliteral">'/'</span>;
00432         } <span class="keywordflow">else</span> { 
00433             strcpy(this-&gt;name, name);
00434         }
00435         <span class="keywordflow">while</span> (true) {
00436             sem = sem_open(this-&gt;name, 0);
00437             <span class="keywordflow">if</span> (sem == SEM_FAILED) { 
00438                 <span class="keywordflow">if</span> (errno == ENOENT) {
00439                     sem = sem_open(this-&gt;name, O_CREAT|O_EXCL, 0777, 0);
00440                     <span class="keywordflow">if</span> (sem != SEM_FAILED) { 
00441                         status = NotYetInitialized;
00442                         <span class="keywordflow">break</span>;
00443                     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (errno != EEXIST) { 
00444                         status = InitializationError;
00445                         <span class="keywordflow">break</span>;
00446                     }
00447                 } <span class="keywordflow">else</span> { 
00448                     status = InitializationError;
00449                     <span class="keywordflow">break</span>;

⌨️ 快捷键说明

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