void producer(void *vptr) { shared_data_t *data = (shared_data_t*)vptr; while (!data->stop) { ta_yield(); ta_sem_wait(&(data->emptyBuffer)); // produce ta_sem_wait(&(data->pmutex)); ta_yield(); printf("producer filling slot %d\n", data->pindex); data->buffer[data->pindex] = pcount++; data->pindex = (data->pindex + 1) % BUFFERSIZE; ta_sem_signal(&(data->pmutex)); ta_sem_signal(&(data->fullBuffer)); } }
void consumer(void *vptr) { shared_data_t *data = (shared_data_t*)vptr; while (!data->stop) { ta_yield(); ta_sem_wait(&(data->fullBuffer)); // consume ta_sem_wait(&(data->cmutex)); printf("consumer eating slot %d\n", data->cindex); ta_yield(); assert(data->buffer[data->cindex] == ccount); ccount++; data->cindex = (data->cindex + 1) % BUFFERSIZE; ta_sem_signal(&(data->cmutex)); ta_sem_signal(&(data->emptyBuffer)); } }
void philosophize(void *vptr) { shared_data_t *data = (shared_data_t*)vptr; int philosopher_index = 0; ta_sem_wait(&data->atTableSem); philosopher_index = data->atTable++; ta_sem_signal(&data->atTableSem); fprintf(stderr, "Philosopher %d has been seated\n", philosopher_index); while (!data->stop) { think(philosopher_index); take_chopsticks(philosopher_index, data); eat(philosopher_index); release_chopsticks(philosopher_index, data); } }
void producer(void *vptr) { shared_data_t *data = (shared_data_t*)vptr; int i = 0; while (!data->stop) { ta_yield(); ta_sem_wait(&(data->emptyBuffer)); // produce assert(data->buffer[i] == 0xFEEDFEED); ta_yield(); printf("producer filled slot %d\n", i); data->buffer[i] = 0xDEADBEEF; i = (i+1)%BUFFERSIZE; ta_sem_signal(&(data->fullBuffer)); } }
void consumer(void *vptr) { shared_data_t *data = (shared_data_t*)vptr; int j = 0; while (!data->stop) { ta_yield(); ta_sem_wait(&(data->fullBuffer)); // consume assert(data->buffer[j] == 0xDEADBEEF); data->buffer[j] = 0xFEEDFEED; ta_yield(); printf("consumer read slot %d\n", j); j = (j+1)%BUFFERSIZE; ta_sem_signal(&(data->emptyBuffer)); } }
void release_chopsticks(int i, shared_data_t *data) { fprintf(stderr, "Philosopher %d is releasing chopsticks %d and %d\n", i, i, (i+1)%NPHILOSOPHERS); ta_sem_signal(&data->chopstickSem[i]); ta_sem_signal(&data->chopstickSem[(i+1)%NPHILOSOPHERS]); }