📄 sync__unix_8h-source.html
字号:
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(&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 > 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(&cond, &mutex.cs, &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 > 1) {
00247 pthread_cond_broadcast(&cond);
00248 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (inc == 1) {
00249 pthread_cond_signal(&cond);
00250 }
00251 }
00252 <span class="keywordtype">void</span> open(<span class="keywordtype">unsigned</span> initValue = 0) {
00253 pthread_cond_init(&cond, NULL);
00254 count = initValue;
00255 }
00256 <span class="keywordtype">void</span> close() {
00257 pthread_cond_destroy(&cond);
00258 }
00259 };
00260
00261 <span class="keyword">template</span><<span class="keyword">class</span> T>
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(&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>& 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&) {
00343 assert (count > 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&) {
00359 assert(signaled);
00360 }
00361 <span class="keywordtype">bool</span> wait(dbMutex& 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><<span class="keyword">class</span> T>
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->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>& 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->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->name+1, name);
00431 *this->name = <span class="charliteral">'/'</span>;
00432 } <span class="keywordflow">else</span> {
00433 strcpy(this->name, name);
00434 }
00435 <span class="keywordflow">while</span> (true) {
00436 sem = sem_open(this->name, 0);
00437 <span class="keywordflow">if</span> (sem == SEM_FAILED) {
00438 <span class="keywordflow">if</span> (errno == ENOENT) {
00439 sem = sem_open(this->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 + -