#ifndef __SBUF_H__
#define __SBUF_H__

#include "csapp.h"

/* $begin sbuft */
typedef struct {
    int *buf;     /* Buffer array                       */         
    int n;        /* Maximum number of slots            */
    int front;    /* buf[front+1 (mod n)] is first item */
    int rear;     /* buf[rear]   is last item           */
    sem_t mutex;  /* Protects accesses to buf           */
    sem_t slots;  /* Counts available slots             */
    sem_t items;  /* Counts available items             */
} sbuf_t;
/* $end sbuft */

void sbuf_init(sbuf_t *sp, int n);
void sbuf_deinit(sbuf_t *sp);
void sbuf_insert(sbuf_t *sp, int item);
int sbuf_remove(sbuf_t *sp);

#endif /* __SBUF_H__ */
