static int semaphore_test(pj_pool_t *pool) { pj_sem_t *sem; pj_status_t status; PJ_LOG(3,("", "...testing semaphore")); status = pj_sem_create(pool, NULL, 0, 1, &sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_create()", status); return -151; } status = pj_sem_post(sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_post()", status); pj_sem_destroy(sem); return -153; } status = pj_sem_trywait(sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_trywait()", status); pj_sem_destroy(sem); return -156; } status = pj_sem_post(sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_post()", status); pj_sem_destroy(sem); return -159; } status = pj_sem_wait(sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_wait()", status); pj_sem_destroy(sem); return -161; } status = pj_sem_destroy(sem); if (status != PJ_SUCCESS) { app_perror("...error: pj_sem_destroy()", status); return -163; } return 0; }
PJ_DEF(pj_status_t) pj_sem_trywait2(pj_sem_t *sem) { #if 1 pj_status_t result; uint64_t delay_ms = 1000000; dispatch_time_t delay_t = dispatch_time(DISPATCH_TIME_NOW, delay_ms); if(dispatch_semaphore_wait(sem->sem, delay_t)){ usleep(1000); return PJ_RETURN_OS_ERROR(pj_get_native_os_error()); }else return PJ_SUCCESS; #else pj_status_t st = -1; unsigned long start_t, curr_t; //uint64_t tstart; //struct timespec tstart={0,0}, tend={0,0}; //clock_serv_t cclock; //clock_gettime(cclock , &tstart); struct timeval tstart,tcurr; gettimeofday(&tstart, NULL); start_t = 1000000*tstart.tv_sec+ tstart.tv_usec; while(st = pj_sem_trywait(sem) == -1 ){ if(errno == EAGAIN){ //clock_gettime(cclock, &tend); gettimeofday(&tcurr, NULL); curr_t = 1000000*tcurr.tv_sec + tcurr.tv_usec; if(curr_t-start_t > 1000) { st = -1; break; } else usleep(10); }else{ st = -1; break; } } return st; #endif }
// // Try wait semaphore. // pj_status_t trywait() { return pj_sem_trywait(this->pj_sem_t_()); }