Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add more tests from McMini
[simgrid.git] / teshsuite / mc / mcmini / barber_shop_deadlock.c
1 #define _REENTRANT
2
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6 #include <pthread.h>
7 #include <semaphore.h>
8
9 // The maximum number of customer threads.
10 #define MAX_CUSTOMERS 10
11
12 // Define the semaphores.
13 sem_t waitingRoom;
14 sem_t barberChair;
15 sem_t barberPillow;
16 sem_t seatBelt;
17
18 // Flag to stop the barber thread when all customers have been serviced.
19 int allDone = 0;
20 int DEBUG = 0;
21
22 static void *customer(void *number) {
23     int num = *(int *)number;
24
25     if(DEBUG) printf("Customer %d leaving for barber shop.\n", num);
26     if(DEBUG) printf("Customer %d arrived at barber shop.\n", num);
27
28     sem_wait(&waitingRoom);
29
30     if(DEBUG) printf("Customer %d entering waiting room.\n", num);
31
32     sem_wait(&barberChair);
33
34     if(DEBUG) printf("Customer %d waking the barber.\n", num);
35     sem_post(&barberPillow);
36
37     sem_wait(&seatBelt);
38
39     sem_post(&barberChair);
40     if(DEBUG) printf("Customer %d leaving barber shop.\n", num);
41     return NULL;
42 }
43
44 static void *barber(void *junk) {
45     while (!allDone) {
46         if(DEBUG) printf("The barber is sleeping\n");
47         sem_wait(&barberPillow);
48
49         if (!allDone) {
50             if(DEBUG) printf("The barber is cutting hair\n");
51             if(DEBUG) printf("The barber has finished cutting hair.\n");
52             sem_post(&seatBelt);
53         }
54         else {
55             if(DEBUG) printf("The barber is going home for the day.\n");
56         }
57     }
58     return NULL;
59 }
60
61 int main(int argc, char *argv[]) {
62     if(argc != 5){
63         printf("Usage: %s numCustomers numChairs RandSeed DEBUG\n", argv[0]);
64         return 1;
65     }
66
67     pthread_t btid;
68     pthread_t tid[MAX_CUSTOMERS];
69     int i, numCustomers, numChairs;
70     long RandSeed;
71     int Number[MAX_CUSTOMERS];
72
73     numCustomers = atoi(argv[1]);
74     numChairs = atoi(argv[2]);
75     RandSeed = atol(argv[3]);
76     DEBUG = atoi(argv[4]);
77
78     if (numCustomers > MAX_CUSTOMERS) {
79         printf("The maximum number of Customers is %d.\n", MAX_CUSTOMERS);
80         exit(-1);
81     }
82
83     srand48(RandSeed);
84
85     for (i=0; i<MAX_CUSTOMERS; i++) {
86         Number[i] = i;
87     }
88
89     sem_init(&waitingRoom, 0, numChairs);
90     sem_init(&barberChair, 0, 1);
91     sem_init(&barberPillow, 0, 0);
92     sem_init(&seatBelt, 0, 0);
93
94     pthread_create(&btid, NULL, barber, NULL);
95
96     for (i=0; i<numCustomers; i++) {
97         pthread_create(&tid[i], NULL, customer, (void *)&Number[i]);
98     }
99
100     for (i=0; i<numCustomers; i++) {
101         pthread_join(tid[i],NULL);
102     }
103
104     allDone = 1;
105     sem_post(&barberPillow);
106     pthread_join(btid,NULL);
107 }