void queue_push(QUEUE q, VALUE v) { if (queue_empty(q)) { q->head = q->tail = make_queue_node(v, NULL, NULL); } else { QUEUE_NODE n = make_queue_node(v, tail, NULL); q->tail->next = n; q->tail = n; } }
/** * Adds an item to the specified queue * @returns 1 on success, 0 on failure */ int enqueue(queue_t* queue, void* data) { queue_node_t* new_node; new_node = make_queue_node(data); if (new_node == NULL) { return 0; } sem_wait(queue->limit_sem); pthread_mutex_lock(&queue->mutex); // If queue is empty if (queue->head == NULL) { assert(queue->tail == NULL); queue->head = new_node; queue->tail = new_node; pthread_mutex_unlock(&queue->mutex); sem_post(queue->fill_sem); return 1; } // If queue already has something in it assert(queue->tail->next == NULL); new_node->prev = queue->tail; queue->tail->next = new_node; queue->tail = new_node; pthread_mutex_unlock(&queue->mutex); sem_post(queue->fill_sem); return 1; }