void queue_destroy_finalize(queue_entry_t *queue) { LOCK(&queue->s.lock); if (queue->s.status == QUEUE_STATUS_DESTROYED) { queue->s.status = QUEUE_STATUS_FREE; schedule_queue_destroy(queue); } UNLOCK(&queue->s.lock); }
void queue_destroy_finalize(queue_entry_t *queue) { LOCK(queue); if (LOAD_S32(queue->s.status) == QUEUE_STATUS_DESTROYED) { INVALIDATE(queue); queue->s.status = QUEUE_STATUS_FREE; schedule_queue_destroy(queue); } UNLOCK(queue); }
int odp_queue_destroy(odp_queue_t handle) { queue_entry_t *queue; queue = queue_to_qentry(handle); LOCK(queue); INVALIDATE(queue); if (queue->s.status == QUEUE_STATUS_FREE) { UNLOCK(queue); ODP_ERR("queue \"%s\" already free\n", queue->s.name); return -1; } if (queue->s.status == QUEUE_STATUS_DESTROYED) { UNLOCK(queue); ODP_ERR("queue \"%s\" already destroyed\n", queue->s.name); return -1; } if (queue->s.head != NULL) { UNLOCK(queue); ODP_ERR("queue \"%s\" not empty\n", queue->s.name); return -1; } switch (queue->s.status) { case QUEUE_STATUS_READY: queue->s.status = QUEUE_STATUS_FREE; break; case QUEUE_STATUS_NOTSCHED: queue->s.status = QUEUE_STATUS_FREE; schedule_queue_destroy(queue); break; case QUEUE_STATUS_SCHED: /* Queue is still in scheduling */ queue->s.status = QUEUE_STATUS_DESTROYED; break; default: ODP_ABORT("Unexpected queue status\n"); } UNLOCK(queue); return 0; }