Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : new tesh example for liveness model checking with visited state reduction
[simgrid.git] / examples / msg / mc / bugged1_liveness.c
1 /***************** Centralized Mutual Exclusion Algorithm *********************/
2 /* This example implements a centralized mutual exclusion algorithm.          */
3 /* Bug : CS requests of client 1 not satisfied                                      */
4 /* LTL property checked : G(r->F(cs)); (r=request of CS, cs=CS ok)            */
5 /******************************************************************************/
6
7 #include "msg/msg.h"
8 #include "mc/mc.h"
9 #include "xbt/automaton.h"
10 #include "bugged1_liveness.h"
11
12 XBT_LOG_NEW_DEFAULT_CATEGORY(bugged1_liveness, "my log messages");
13
14 int r=0; 
15 int cs=0;
16
17 int predR(){
18   return r;
19 }
20
21 int predCS(){
22   return cs;
23 }
24
25
26 int coordinator(int argc, char *argv[])
27 {
28
29   int CS_used = 0;   
30   msg_task_t task = NULL, answer = NULL; 
31   xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL);
32
33   while(1){  
34     MSG_task_receive(&task, "coordinator");
35     const char *kind = MSG_task_get_name(task); 
36     if (!strcmp(kind, "request")) {    
37       char *req = MSG_task_get_data(task);
38       if (CS_used) {           
39         XBT_INFO("CS already used. Queue the request.");
40         xbt_dynar_push(requests, &req);
41       } else {               
42         if(strcmp(req, "1") != 0){
43           XBT_INFO("CS idle. Grant immediatly");
44           answer = MSG_task_create("grant", 0, 1000, NULL);
45           MSG_task_send(answer, req);
46           CS_used = 1;
47           answer = NULL;
48         }
49       }
50     } else {      
51       if (!xbt_dynar_is_empty(requests)) {
52         XBT_INFO("CS release. Grant to queued requests (queue size: %lu)", xbt_dynar_length(requests));
53         char *req;
54         xbt_dynar_pop(requests, &req);
55         if(strcmp(req, "1") != 0){
56           MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req);
57         }else{
58           xbt_dynar_push(requests, &req);
59           CS_used = 0;
60         }
61       }else{
62         XBT_INFO("CS release. resource now idle");
63         CS_used = 0;
64       }
65     }
66     MSG_task_destroy(task);
67     task = NULL;
68     kind = NULL;
69   }
70  
71   return 0;
72 }
73
74 int client(int argc, char *argv[])
75 {
76   int my_pid = MSG_process_get_PID(MSG_process_self());
77
78   char *my_mailbox = xbt_strdup(argv[1]);
79   msg_task_t grant = NULL, release = NULL;
80     
81   while(1){
82     XBT_INFO("Ask the request");
83     MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
84
85     if(strcmp(my_mailbox, "1") == 0){
86       r = 1;
87       cs = 0;
88       XBT_INFO("Propositions changed : r=1, cs=0");
89     }
90
91     MSG_task_receive(&grant, my_mailbox);
92     const char *kind = MSG_task_get_name(grant);
93
94     if((strcmp(my_mailbox, "1") == 0) && (strcmp("grant", kind) == 0)){
95       cs = 1;
96       r = 0;
97       XBT_INFO("Propositions changed : r=0, cs=1");
98     }
99
100     MSG_task_destroy(grant);
101     grant = NULL;
102     kind = NULL;
103
104     XBT_INFO("%s got the answer. Sleep a bit and release it", argv[1]);
105
106     MSG_process_sleep(1);
107
108     release = MSG_task_create("release", 0, 1000, NULL);
109     MSG_task_send(release, "coordinator");
110
111     release = NULL;
112
113     MSG_process_sleep(my_pid);
114     
115     if(strcmp(my_mailbox, "1") == 0){
116       cs=0;
117       r=0;
118       XBT_INFO("Propositions changed : r=0, cs=0");
119     }
120     
121   }
122
123   return 0;
124 }
125
126 int main(int argc, char *argv[])
127 {
128
129   MSG_init(&argc, argv);
130
131   char **options = &argv[1];
132
133   MSG_config("model-check/property","promela_bugged1_liveness");
134   MC_automaton_new_propositional_symbol("r", &predR);
135   MC_automaton_new_propositional_symbol("cs", &predCS);
136
137   const char* platform_file = options[0];
138   const char* application_file = options[1];
139   
140   MSG_create_environment(platform_file);
141   MSG_function_register("coordinator", coordinator);
142   MSG_function_register("client", client);
143   MSG_launch_application(application_file);
144   MSG_main();
145
146   return 0;
147 }