Files

46 lines
1.8 KiB
C
Raw Permalink Normal View History

2026-05-28 08:48:01 +08:00
/* 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;
}