3 #include <simgrid/modelchecker.h>
9 int main(int argc, char **argv){
15 xbt_dynar_t requests = xbt_dynar_new(sizeof(int), NULL);
18 err = MPI_Init(&argc, &argv);
19 if(err != MPI_SUCCESS){
20 printf("MPI initialization failed !\n");
24 MC_ignore(&(status.count), sizeof(status.count));
26 /* Get number of processes */
27 err = MPI_Comm_size(MPI_COMM_WORLD, &size);
28 /* Get id of this process */
29 err = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
31 if(rank == 0){ /* Coordinator */
33 MPI_Recv(&recv_buff, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
34 if(status.MPI_TAG == REQUEST_TAG){
36 printf("CS already used. Queue the request.\n");
37 xbt_dynar_push(requests, &recv_buff);
39 printf("CS idle. Grant immediatly.\n");
40 MPI_Send(&rank, 1, MPI_INT, recv_buff, GRANT_TAG, MPI_COMM_WORLD);
44 if(!xbt_dynar_is_empty(requests)){
45 printf("CS release. Grant to queued requests (queue size: %lu)",
46 xbt_dynar_length(requests));
47 xbt_dynar_shift(requests, &recv_buff);
48 MPI_Send(&rank, 1, MPI_INT, recv_buff, GRANT_TAG, MPI_COMM_WORLD);
51 printf("CS release. Resource now idle.\n");
58 printf("%d asks the request.\n", rank);
59 MPI_Send(&rank, 1, MPI_INT, 0, REQUEST_TAG, MPI_COMM_WORLD);
61 MPI_Recv(&recv_buff, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
63 printf("%d got the answer. Release it.\n", rank);
64 MPI_Send(&rank, 1, MPI_INT, 0, RELEASE_TAG, MPI_COMM_WORLD);