+svm_queue_sub2 (svm_queue_t * q, u8 * elem)
+{
+ int need_broadcast;
+ i8 *headp;
+
+ pthread_mutex_lock (&q->mutex);
+ if (q->cursize == 0)
+ {
+ pthread_mutex_unlock (&q->mutex);
+ return -1;
+ }
+
+ headp = (i8 *) (&q->data[0] + q->elsize * q->head);
+ clib_memcpy (elem, headp, q->elsize);
+
+ q->head++;
+ need_broadcast = (q->cursize == q->maxsize / 2);
+ q->cursize--;
+
+ if (PREDICT_FALSE (q->head == q->maxsize))
+ q->head = 0;
+ pthread_mutex_unlock (&q->mutex);
+
+ if (need_broadcast)
+ (void) pthread_cond_broadcast (&q->condvar);
+
+ return 0;
+}
+
+int
+svm_queue_sub_raw (svm_queue_t * q, u8 * elem)