/* 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; }