X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/bc2dfd3f45249f43cc56579e52cc1bbe465113e1..e40065bf1c41a83ae34b6e192abc77f970143006:/teshsuite/mc/mcmini/barber_shop_deadlock.c diff --git a/teshsuite/mc/mcmini/barber_shop_deadlock.c b/teshsuite/mc/mcmini/barber_shop_deadlock.c new file mode 100644 index 0000000000..c10c970bd5 --- /dev/null +++ b/teshsuite/mc/mcmini/barber_shop_deadlock.c @@ -0,0 +1,107 @@ +#define _REENTRANT + +#include +#include +#include +#include +#include + +// The maximum number of customer threads. +#define MAX_CUSTOMERS 10 + +// Define the semaphores. +sem_t waitingRoom; +sem_t barberChair; +sem_t barberPillow; +sem_t seatBelt; + +// Flag to stop the barber thread when all customers have been serviced. +int allDone = 0; +int DEBUG = 0; + +static void *customer(void *number) { + int num = *(int *)number; + + if(DEBUG) printf("Customer %d leaving for barber shop.\n", num); + if(DEBUG) printf("Customer %d arrived at barber shop.\n", num); + + sem_wait(&waitingRoom); + + if(DEBUG) printf("Customer %d entering waiting room.\n", num); + + sem_wait(&barberChair); + + if(DEBUG) printf("Customer %d waking the barber.\n", num); + sem_post(&barberPillow); + + sem_wait(&seatBelt); + + sem_post(&barberChair); + if(DEBUG) printf("Customer %d leaving barber shop.\n", num); + return NULL; +} + +static void *barber(void *junk) { + while (!allDone) { + if(DEBUG) printf("The barber is sleeping\n"); + sem_wait(&barberPillow); + + if (!allDone) { + if(DEBUG) printf("The barber is cutting hair\n"); + if(DEBUG) printf("The barber has finished cutting hair.\n"); + sem_post(&seatBelt); + } + else { + if(DEBUG) printf("The barber is going home for the day.\n"); + } + } + return NULL; +} + +int main(int argc, char *argv[]) { + if(argc != 5){ + printf("Usage: %s numCustomers numChairs RandSeed DEBUG\n", argv[0]); + return 1; + } + + pthread_t btid; + pthread_t tid[MAX_CUSTOMERS]; + int i, numCustomers, numChairs; + long RandSeed; + int Number[MAX_CUSTOMERS]; + + numCustomers = atoi(argv[1]); + numChairs = atoi(argv[2]); + RandSeed = atol(argv[3]); + DEBUG = atoi(argv[4]); + + if (numCustomers > MAX_CUSTOMERS) { + printf("The maximum number of Customers is %d.\n", MAX_CUSTOMERS); + exit(-1); + } + + srand48(RandSeed); + + for (i=0; i