Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Indentation fix
[simgrid.git] / examples / msg / mc / bugged2_liveness.c
1 /***************** Producer/Consumer Algorithm *************************/
2 /* This example implements a producer/consumer algorithm.              */
3 /* If consumer work before producer, message is empty                  */
4 /***********************************************************************/
5
6
7 #include "msg/msg.h"
8 #include "mc/mc.h"
9 #include "xbt/automaton.h"
10 #include "xbt/automatonparse_promela.h"
11 #include "bugged2_liveness.h"
12 #include "y.tab.c"
13
14 XBT_LOG_NEW_DEFAULT_CATEGORY(bugged2_liveness, "my log messages");
15
16 char* buffer;
17
18 int consume = 0;
19 int produce = 0;
20 int cready = 0;
21 int pready = 0;
22
23 int predPready(){
24   return pready;
25 }
26
27 int predCready(){
28   return cready;
29 }
30
31 int predConsume(){
32   return consume;
33 }
34
35 int predProduce(){
36   return produce;
37 }
38
39 int coordinator(int argc, char *argv[])
40 {
41   xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL);
42   int CS_used = 0;
43
44   while(1) {
45     m_task_t task = NULL;
46     MSG_task_receive(&task, "coordinator");
47     const char *kind = MSG_task_get_name(task);
48     if (!strcmp(kind, "request")) {
49       char *req = MSG_task_get_data(task);
50       if (CS_used) {
51         XBT_INFO("CS already used. Queue the request");
52         xbt_dynar_push(requests, &req);
53       } else {
54         m_task_t answer = MSG_task_create("grant", 0, 1000, NULL);
55         MSG_task_send(answer, req);
56         CS_used = 1;
57         XBT_INFO("CS idle. Grant immediatly");
58       }
59     } else {
60       if (xbt_dynar_length(requests) > 0) {
61         XBT_INFO("CS release. Grant to queued requests");
62         char *req;
63         xbt_dynar_pop(requests, &req);
64         MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req);
65       } else {
66         XBT_INFO("CS_realase, ressource now idle");
67         CS_used = 0;
68       }
69     }
70
71     MSG_task_destroy(task);
72
73   }
74
75   return 0;
76
77 }
78
79 int producer(int argc, char *argv[])
80 {
81
82   char * my_mailbox = bprintf("%s", argv[1]);
83   
84   while(1) {
85     
86     /* Create message */
87     const char *mess = "message";
88
89     pready = 1;
90     XBT_INFO("pready = 1");
91     
92     /* CS request */
93     XBT_INFO("Producer ask the request");
94     MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
95
96     /* Wait the answer */
97     m_task_t grant = NULL;
98     MSG_task_receive(&grant, my_mailbox);
99     MSG_task_destroy(grant);
100
101     /* Push message (size of buffer = 1) */
102     buffer = strdup(mess);
103
104     produce = 1;
105     XBT_INFO("produce = 1");
106
107     /* CS release */
108     MSG_task_send(MSG_task_create("release", 0, 1000, my_mailbox), "coordinator");
109
110     produce = 0;
111     pready = 0;
112
113     XBT_INFO("pready et produce = 0");
114
115   }
116
117   return 0;
118
119 }
120
121 int consumer(int argc, char *argv[])
122 {
123
124   char * my_mailbox = bprintf("%s", argv[1]);
125   char *mess;
126
127
128   while(1) {
129     
130     /* CS request */
131     XBT_INFO("Consumer ask the request");
132     MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
133
134     cready = 1;
135     XBT_INFO("cready = 1");
136
137     /* Wait the answer */
138     m_task_t grant = NULL;
139     MSG_task_receive(&grant, my_mailbox);
140     MSG_task_destroy(grant);
141
142     /* Pop message  */
143     mess = malloc(8*sizeof(char));
144     mess = strdup(buffer);
145     buffer[0] = '\0'; 
146
147     /* Display message */
148     XBT_INFO("Message : %s", mess);
149     if(strcmp(mess, "") != 0){
150       consume = 1;
151       XBT_INFO("consume = 1");
152     }
153
154     /* CS release */
155     MSG_task_send(MSG_task_create("release", 0, 1000, my_mailbox), "coordinator");
156
157     free(mess);
158
159     consume = 0;
160     cready = 0;
161
162     XBT_INFO("cready et consume = 0");
163
164   }
165
166   return 0;
167
168 }
169
170
171 int main(int argc, char *argv[])
172 {
173
174   buffer = malloc(8*sizeof(char));
175   buffer[0]='\0';
176
177   init();
178   yyparse();
179   automaton = get_automaton();
180   xbt_new_propositional_symbol(automaton,"pready", &predPready); 
181   xbt_new_propositional_symbol(automaton,"cready", &predCready); 
182   xbt_new_propositional_symbol(automaton,"consume", &predConsume);
183   xbt_new_propositional_symbol(automaton,"produce", &predProduce); 
184   
185   MSG_global_init(&argc, argv);
186   MSG_create_environment("../msg_platform.xml");
187   MSG_function_register("coordinator", coordinator);
188   MSG_function_register("consumer", consumer);
189   MSG_function_register("producer", producer);
190   MSG_launch_application("deploy_bugged2_liveness.xml");
191   MSG_main_liveness(automaton);
192
193   return 0;
194
195 }