📄 sync__unix_8h-source.html
字号:
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&) { 00327 assert (count > 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&) { 00343 assert(signaled);00344 }00345 <span class="keywordtype">bool</span> wait(dbMutex& 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><<span class="keyword">class</span> T>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->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>& 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 && 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, &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, &abs_ts);00473 <span class="keywordflow">if</span> (rc < 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 > 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 + -