//pxsem/mycat2.c
void *
produce(void *arg)
{
	int		i;

	for (i = 0; ; ) {
		Sem_wait(&shared.nempty);	/*       */

		Sem_wait(&shared.mutex);
			/*   */
		Sem_post(&shared.mutex);

		shared.buff[i].n = Read(fd, shared.buff[i].data, BUFFSIZE);
		if (shared.buff[i].n == 0) {
			Sem_post(&shared.nstored);	/*    */
			return(NULL);
		}
		if (++i >= NBUFF)
			i = 0;					/*   */

		Sem_post(&shared.nstored);		/*    */
	}
}

void *
consume(void *arg)
{
	int		i;

	for (i = 0; ; ) {
		Sem_wait(&shared.nstored);		/*      */

		Sem_wait(&shared.mutex);
			/*   */
		Sem_post(&shared.mutex);

		if (shared.buff[i].n == 0)
			return(NULL);
		Write(STDOUT_FILENO, shared.buff[i].data, shared.buff[i].n);
		if (++i >= NBUFF)
			i = 0;					/*   */

		Sem_post(&shared.nempty);		/*     */
	}
}
