46 lines
1.8 KiB
C
46 lines
1.8 KiB
C
|
|
/* task pool management fucntions */
|
||
|
|
/* task_pool_init */
|
||
|
|
|
||
|
|
#include "common.h"
|
||
|
|
#include "taskline.h"
|
||
|
|
void task_line_init(task_line_t *tlp, int n)
|
||
|
|
{
|
||
|
|
tlp->taskp = calloc(n, sizeof(task_t));
|
||
|
|
tlp->cnt = n; /* socks holds max of n items */
|
||
|
|
tlp->inpos= tlp->outpos = 0; /* Empty socks iff inpos== outpos */
|
||
|
|
sem_init(&tlp->mutex, 0, 1); /* Binary semaphore for locking */
|
||
|
|
sem_init(&tlp->avail, 0, tlp->cnt);/* Initially, socks has cnt empty cell */
|
||
|
|
sem_init(&tlp->ready, 0, 0); /* Initially, socks has zero data items */
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Clean up task line */
|
||
|
|
void task_line_deinit(task_line_t *tlp)
|
||
|
|
{
|
||
|
|
free(tlp->taskp);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Insert item onto the rear of task line */
|
||
|
|
void task_insert (task_line_t *tlp, task_t item)
|
||
|
|
{ sem_wait(&tlp->avail); /* Wait for available cell */
|
||
|
|
sem_wait(&tlp->mutex); /* Lock the shared variable inpos pointer */
|
||
|
|
tlp->taskp[tlp->inpos] = item; /* Insert the item */
|
||
|
|
tlp->inpos =(tlp-> inpos +1)%(tlp->cnt); /* adjuset inpos point */
|
||
|
|
sem_post(&tlp->mutex); /* Unlock the buffer */
|
||
|
|
sem_post(&tlp->ready); /* Announce available item */
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/* Remove and return the first item from task_pool */
|
||
|
|
task_t task_remove(task_line_t *tlp)
|
||
|
|
{
|
||
|
|
task_t item;
|
||
|
|
sem_wait(&tlp->ready); /* Wait for available item */
|
||
|
|
sem_wait(&tlp->mutex); /* Lock the shared pointer variable tp->outpos */
|
||
|
|
item = tlp->taskp[tlp->outpos]; /* Remove the item */
|
||
|
|
tlp->outpos=(tlp->outpos+1)%(tlp->cnt); /* adjuset outpos point */
|
||
|
|
sem_post(&tlp->avail); /* Announce available slot */
|
||
|
|
sem_post(&tlp->mutex); /* Unlock the shared pointer variable tp->outpos */
|
||
|
|
return item;
|
||
|
|
}
|
||
|
|
|