/***************************************************************************** fifo.c fifo primitives ******************************************************************************/ // extern fifotab_t sys_fifot; /***************************************************************************** initialize a fifo ******************************************************************************/ int init_fifo(fifoptr fp) { int fifoid; //sys_fifot.curridx++; // fifoid=sys_fifot.curridx; // sys_fifot.fifos[fifoid]=fp; fp->state=ALLOCATED; fp->fifo_size=FIFO_SIZE; sema_init(&fp->fullsem,0,USYNC_THREAD,0); sema_init(&fp->emptysem,fp->fifo_size,USYNC_THREAD,0); mutex_init(&fp->fifomut,USYNC_THREAD,0); fp->read_idx=0; fp->write_idx=0; return(fifoid); } /***************************************************************************** read a buffer from a fifo ******************************************************************************/ bufptr read_fifo(fifoptr fp) { bufptr bp; sema_wait(&fp->fullsem); mutex_lock(&fp->fifomut); bp=fp->bufs[fp->read_idx++]; fp->read_idx %= fp->fifo_size; mutex_unlock(&fp->fifomut); sema_post(&fp->emptysem); return(bp); } /***************************************************************************** write a buffer to a fifo ******************************************************************************/ int write_fifo(fifoptr fp, bufptr bp) { sema_wait(&fp->emptysem); mutex_lock(&fp->fifomut); fp->bufs[fp->write_idx++]=bp; fp->write_idx %= fp->fifo_size; mutex_unlock(&fp->fifomut); sema_post(&fp->fullsem); }