int cf_queue_priority_pop(cf_queue_priority *q, void *buf, int ms_wait) { QUEUE_LOCK(q); struct timespec tp; if (ms_wait > 0) { clock_gettime( CLOCK_REALTIME, &tp); tp.tv_sec += ms_wait / 1000; tp.tv_nsec += (ms_wait % 1000) * 1000000; if (tp.tv_nsec > 1000000000) { tp.tv_nsec -= 1000000000; tp.tv_sec++; } } if (q->threadsafe) { #ifdef EXTERNAL_LOCKS if (CF_Q_PRI_EMPTY(q)) { QUEUE_UNLOCK(q); return -1; } #else while (CF_Q_PRI_EMPTY(q)) { if (CF_QUEUE_FOREVER == ms_wait) { pthread_cond_wait(&q->CV, &q->LOCK); } else if (CF_QUEUE_NOWAIT == ms_wait) { pthread_mutex_unlock(&q->LOCK); return(CF_QUEUE_EMPTY); } else { pthread_cond_timedwait(&q->CV, &q->LOCK, &tp); if (CF_Q_PRI_EMPTY(q)) { pthread_mutex_unlock(&q->LOCK); return(CF_QUEUE_EMPTY); } } } #endif //EXERNAL_LOCKS } int rv; if (CF_Q_SZ(q->high_q)) rv = cf_queue_pop(q->high_q, buf, 0); else if (CF_Q_SZ(q->medium_q)) rv = cf_queue_pop(q->medium_q, buf, 0); else if (CF_Q_SZ(q->low_q)) rv = cf_queue_pop(q->low_q, buf, 0); else rv = CF_QUEUE_EMPTY; QUEUE_UNLOCK(q); return(rv); }
int cf_queue_priority_pop(cf_queue_priority *q, void *buf, int ms_wait) { cf_queue_priority_lock(q); struct timespec tp; if (ms_wait > 0) { cf_set_wait_timespec(ms_wait, &tp); } if (q->threadsafe) { while (CF_Q_PRI_EMPTY(q)) { if (CF_QUEUE_FOREVER == ms_wait) { pthread_cond_wait(&q->CV, &q->LOCK); } else if (CF_QUEUE_NOWAIT == ms_wait) { pthread_mutex_unlock(&q->LOCK); return CF_QUEUE_EMPTY; } else { pthread_cond_timedwait(&q->CV, &q->LOCK, &tp); if (CF_Q_PRI_EMPTY(q)) { pthread_mutex_unlock(&q->LOCK); return CF_QUEUE_EMPTY; } } } } int rv = CF_QUEUE_EMPTY; if (CF_Q_SZ(q->high_q)) { rv = cf_queue_pop(q->high_q, buf, 0); } else if (CF_Q_SZ(q->medium_q)) { rv = cf_queue_pop(q->medium_q, buf, 0); } else if (CF_Q_SZ(q->low_q)) { rv = cf_queue_pop(q->low_q, buf, 0); } cf_queue_priority_unlock(q); return rv; }