+typedef enum
+{
+ SVM_Q_WAIT = 0, /**< blocking call - best used in combination with
+ condvars, for eventfds we don't yield the cpu */
+ SVM_Q_NOWAIT, /**< non-blocking call - works with both condvar and
+ eventfd signaling */
+ SVM_Q_TIMEDWAIT, /**< blocking call, returns on signal or time-out -
+ best used in combination with condvars, with
+ eventfds we don't yield the cpu */
+} svm_q_conditional_wait_t;
+
+/**
+ * Allocate and initialize svm queue
+ *
+ * @param nels number of elements on the queue
+ * @param elsize element size, presumably 4 and cacheline-size will
+ * be popular choices.
+ * @param pid consumer pid
+ * @return a newly initialized svm queue
+ *
+ * The idea is to call this function in the queue consumer,
+ * and e-mail the queue pointer to the producer(s).
+ *
+ * The vpp process / main thread allocates one of these
+ * at startup; its main input queue. The vpp main input queue
+ * has a pointer to it in the shared memory segment header.
+ *
+ * You probably want to be on an svm data heap before calling this
+ * function.
+ */
+svm_queue_t *svm_queue_alloc_and_init (int nels, int elsize,
+ int consumer_pid);
+svm_queue_t *svm_queue_init (void *base, int nels, int elsize);