/***************************************************************************** buffer pool management primitives ******************************************************************************/ /***************************************************************************** initialize a buffer pool ******************************************************************************/ int init_pool (poolptr pp, int pool_length) { int i ; pp->pool_size=pool_length; sema_init(&pp->poolsem,pp->pool_size,USYNC_THREAD,0); mutex_init(&pp->poolmut,USYNC_THREAD,0); pp->front=&(pp->bufs[0]); for (i=0; ipool_size - 1; i ++) pp->bufs[i].next = &(pp->bufs[i+1]); pp->rear=&(pp->bufs[pp->pool_size-1]); } /***************************************************************************** check a buffer pool ******************************************************************************/ bufptr check_pool(poolptr pp) { bufptr bp; bp=pp->front; return(bp); } /***************************************************************************** get a buffer from a pool ******************************************************************************/ bufptr get_buf(poolptr pp) { bufptr bp; sema_wait(&pp->poolsem); mutex_lock(&pp->poolmut); bp= pp->front; pp->front=bp->next; mutex_unlock(&pp->poolmut); return(bp); } /***************************************************************************** put a buffer to a pool ******************************************************************************/ int put_buf(poolptr pp, bufptr bp) { bp->next=NULL; mutex_lock(&pp->poolmut); pp->rear->next=bp; pp->rear=bp; if (pp->front==NULL) pp->front=bp; mutex_unlock(&pp->poolmut); sema_post(&pp->poolsem); }