#include <vppinfra/format.h>
#include <vppinfra/cache.h>
#include <svm/queue.h>
+#include <vppinfra/time.h>
#include <signal.h>
/*
* svm_queue_sub
*/
int
-svm_queue_sub (svm_queue_t * q, u8 * elem, int nowait)
+svm_queue_sub (svm_queue_t * q, u8 * elem, svm_q_conditional_wait_t cond,
+ u32 time)
{
i8 *headp;
int need_broadcast = 0;
+ int rc = 0;
- if (nowait)
+ if (cond == SVM_Q_NOWAIT)
{
/* zero on success */
if (pthread_mutex_trylock (&q->mutex))
if (PREDICT_FALSE (q->cursize == 0))
{
- if (nowait)
+ if (cond == SVM_Q_NOWAIT)
{
pthread_mutex_unlock (&q->mutex);
return (-2);
}
- while (q->cursize == 0)
+ else if (cond == SVM_Q_TIMEDWAIT)
{
- (void) pthread_cond_wait (&q->condvar, &q->mutex);
+ struct timespec ts;
+ ts.tv_sec = unix_time_now () + time;
+ ts.tv_nsec = 0;
+ while (q->cursize == 0 && rc == 0)
+ {
+ rc = pthread_cond_timedwait (&q->condvar, &q->mutex, &ts);
+ }
+ if (rc == ETIMEDOUT)
+ {
+ pthread_mutex_unlock (&q->mutex);
+ return ETIMEDOUT;
+ }
+ }
+ else
+ {
+ while (q->cursize == 0)
+ {
+ (void) pthread_cond_wait (&q->condvar, &q->mutex);
+ }
}
}