Пример #1
0
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;
    }
}
Пример #2
0
/**
 * 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;
}