aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVenkatesh Vivekanandan <venkatesh.vivekanandan@linaro.org>2015-03-12 04:43:01 +0530
committerVenkatesh Vivekanandan <venkatesh.vivekanandan@linaro.org>2015-03-17 14:23:40 +0530
commit429f4df06bd6f209cf11172f5de7f68d6b6a1a3c (patch)
tree69120f60bc35f10cb5105c8dec2d7b7ff4f71f06
parentcfc6686e6d8d9084fb8acaa48fc600b4daa8d230 (diff)
Fix undefined reference to odp_queue_destroy
- It internally implements, queue_enq_dummy queue_enq_multi_dummy and queue_deq_multi_destroy Port of 72011097 Signed-off-by: Venkatesh Vivekanandan <venkatesh.vivekanandan@linaro.org> Acked-by: Zoltan Kiss <zoltan.kiss.org>
-rw-r--r--platform/linux-dpdk/odp_queue.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/platform/linux-dpdk/odp_queue.c b/platform/linux-dpdk/odp_queue.c
index 68954377e..9b0889867 100644
--- a/platform/linux-dpdk/odp_queue.c
+++ b/platform/linux-dpdk/odp_queue.c
@@ -191,6 +191,58 @@ odp_queue_t odp_queue_create(const char *name, odp_queue_type_t type,
return handle;
}
+int odp_queue_destroy(odp_queue_t handle)
+{
+ queue_entry_t *queue;
+ queue = queue_to_qentry(handle);
+
+ LOCK(&queue->s.lock);
+ if (queue->s.status == QUEUE_STATUS_FREE) {
+ UNLOCK(&queue->s.lock);
+ ODP_ERR("queue_destroy: queue \"%s\" already free\n",
+ queue->s.name);
+ return -1;
+ }
+ if (queue->s.head != NULL) {
+ UNLOCK(&queue->s.lock);
+ ODP_ERR("queue_destroy: queue \"%s\" not empty\n",
+ queue->s.name);
+ return -1;
+ }
+
+ queue->s.enqueue = queue_enq_dummy;
+ queue->s.enqueue_multi = queue_enq_multi_dummy;
+
+ switch (queue->s.status) {
+ case QUEUE_STATUS_READY:
+ queue->s.status = QUEUE_STATUS_FREE;
+ queue->s.head = NULL;
+ queue->s.tail = NULL;
+ break;
+ case QUEUE_STATUS_SCHED:
+ /*
+ * Override dequeue_multi to destroy queue when it will
+ * be scheduled next time.
+ */
+ queue->s.status = QUEUE_STATUS_DESTROYED;
+ queue->s.dequeue_multi = queue_deq_multi_destroy;
+ break;
+ case QUEUE_STATUS_NOTSCHED:
+ /* Queue won't be scheduled anymore */
+ odp_buffer_free(queue->s.sched_buf);
+ queue->s.sched_buf = ODP_BUFFER_INVALID;
+ queue->s.status = QUEUE_STATUS_FREE;
+ queue->s.head = NULL;
+ queue->s.tail = NULL;
+ break;
+ default:
+ ODP_ABORT("Unexpected queue status\n");
+ }
+ UNLOCK(&queue->s.lock);
+
+ return 0;
+}
+
odp_buffer_t queue_sched_buf(odp_queue_t handle)
{
@@ -297,6 +349,19 @@ int queue_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int num)
return 0;
}
+int queue_enq_dummy(queue_entry_t *queue ODP_UNUSED,
+ odp_buffer_hdr_t *buf_hdr ODP_UNUSED)
+{
+ return -1;
+}
+
+int queue_enq_multi_dummy(queue_entry_t *queue ODP_UNUSED,
+ odp_buffer_hdr_t *buf_hdr[] ODP_UNUSED,
+ int num ODP_UNUSED)
+{
+ return -1;
+}
+
int odp_queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
{
@@ -390,6 +455,22 @@ int queue_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int num)
return i;
}
+int queue_deq_multi_destroy(queue_entry_t *queue,
+ odp_buffer_hdr_t *buf_hdr[] ODP_UNUSED,
+ int num ODP_UNUSED)
+{
+ LOCK(&queue->s.lock);
+
+ odp_buffer_free(queue->s.sched_buf);
+ queue->s.sched_buf = ODP_BUFFER_INVALID;
+ queue->s.status = QUEUE_STATUS_FREE;
+ queue->s.head = NULL;
+ queue->s.tail = NULL;
+
+ UNLOCK(&queue->s.lock);
+
+ return 0;
+}
int odp_queue_deq_multi(odp_queue_t handle, odp_event_t events[], int num)
{