/* Code to implement readers/writers that preserves FIFO priority */ #include "csapp.h" #include /* Represents individual thread's position in queue */ typedef struct TOK { bool is_reader; sem_t enable; // Enables access struct TOK *next; // Allows chaining as linked list } rw_token_t; /* Queue data structure */ typedef struct { sem_t mutex; // Mutual exclusion int reading_count; // Number of active readers int writing_count; // Number of active writers // FIFO queue implemented as linked list with tail pointer rw_token_t *head; rw_token_t *tail; } rw_queue_t; void rw_queue_init(rw_queue_t *q); void rw_queue_request_read(rw_queue_t *q, rw_token_t *t); void rw_queue_request_write(rw_queue_t *q, rw_token_t *t); void rw_queue_release(rw_queue_t *q); /* Print information about queue */ void rw_queue_status(rw_queue_t *q);