Esempio n. 1
0
/*
 * Add work to the queue
 * TODO: This needs synchronization!
 */
void workq_put(workq_t* workq, void* data)
{
    task_t* task = (task_t*) malloc(sizeof(task_t));
    task->data = data;
    workq_lock(workq);
    task->next = workq->tasks;
    workq->tasks = task;
    workq_signal(workq);
    workq_unlock(workq);
}
Esempio n. 2
0
/*
 * Get a data item from the queue.  We assume NULL data can be used
 * to signal that the queue is empty.
 * TODO: This needs synchronization!
 */
void* workq_get(workq_t* workq)
{
    void* result = NULL;
    workq_lock(workq);
    workq_wait(workq);
    if (workq->tasks) {
        task_t* task = workq->tasks;
        result = task->data;
        workq->tasks = task->next;
        free(task);
    }
    workq_signal(workq);
    workq_unlock(workq);
    return result;
}