Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : more requests of CS per process in the example
[simgrid.git] / examples / msg / mc / example_liveness_with_cycle.c
index 17982c0..0927be0 100644 (file)
@@ -1,7 +1,6 @@
 /***************** Centralized Mutual Exclusion Algorithm *********************/
 /* This example implements a centralized mutual exclusion algorithm.          */
-/* There is no bug on it, it is just provided to test the state space         */
-/* reduction of DPOR.                                                         */
+/* CS requests of client 2 not satisfied                                      */
 /******************************************************************************/
 
 #include "msg/msg.h"
 #include "y.tab.c"
 
 #define AMOUNT_OF_CLIENTS 2
-#define CS_PER_PROCESS 2
+#define CS_PER_PROCESS 10
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(example_liveness_with_cycle, "my log messages");
 
+
 int p=0; 
 int q=0;
 
@@ -28,9 +28,6 @@ int predQ(){
 }
 
 
-//xbt_dynar_t listeVars -> { void *ptr; int size (nb octets); } => liste de structures 
-//=> parcourir la liste et comparer les contenus de chaque pointeur
-
 int coordinator(int argc, char *argv[])
 {
   xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL);   // dynamic vector storing requests (which are char*)
@@ -42,33 +39,28 @@ int coordinator(int argc, char *argv[])
     const char *kind = MSG_task_get_name(task); //is it a request or a release?
     if (!strcmp(kind, "request")) {     // that's a request
       char *req = MSG_task_get_data(task);
-      //XBT_INFO("Req %s", req);
       if (CS_used) {            // need to push the request in the vector
-        XBT_INFO("CS already used. Queue the request");
+        XBT_INFO("CS already used. Queue the request of client %d", atoi(req) +1);
         xbt_dynar_push(requests, &req);
       } else {                  // can serve it immediatly
-        XBT_INFO("CS idle. Grant immediatly");
        if(strcmp(req, "1") == 0){
          m_task_t answer = MSG_task_create("grant", 0, 1000, NULL);
          MSG_task_send(answer, req);
          CS_used = 1;
-       }else{
-         m_task_t answer = MSG_task_create("notgrant", 0, 1000, NULL);
-         MSG_task_send(answer, req);
+         XBT_INFO("CS idle. Grant immediatly");
        }
       }
     } else {                    // that's a release. Check if someone was waiting for the lock
       if (xbt_dynar_length(requests) > 0) {
-        XBT_INFO("CS release. Grant to queued requests (queue size: %lu)",
-              xbt_dynar_length(requests));
+        XBT_INFO("CS release. Grant to queued requests (queue size: %lu)", xbt_dynar_length(requests));
         char *req ;
-       xbt_dynar_pop(requests, &req);
+       xbt_dynar_get_cpy(requests, (xbt_dynar_length(requests) - 1), &req);
        if(strcmp(req, "1") == 0){
+         xbt_dynar_pop(requests, &req);
          MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req);
          todo--;
        }else{
-         MSG_task_send(MSG_task_create("notgrant", 0, 1000, NULL), req);
-         todo--;
+          CS_used = 0;
        }
       } else {                  // nobody wants it
         XBT_INFO("CS release. resource now idle");
@@ -85,40 +77,49 @@ int coordinator(int argc, char *argv[])
 int client(int argc, char *argv[])
 {
   int my_pid = MSG_process_get_PID(MSG_process_self());
-  // use my pid as name of mailbox to contact me
+
   char *my_mailbox = bprintf("%s", argv[1]);
-  // request the CS 2 times, sleeping a bit in between
   int i;
+
+  // request the CS 4 times, sleeping a bit in between
   for (i = 0; i < CS_PER_PROCESS; i++) {
+      
     XBT_INFO("Ask the request");
-    MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox),
-                  "coordinator");
+    MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator");
+
     if(strcmp(my_mailbox, "2") == 0){
       p = 1;
       q = 0;
+      XBT_DEBUG("Propositions changed : p=1, q=0");
     }
+
     // wait the answer
     m_task_t grant = NULL;
     MSG_task_receive(&grant, my_mailbox);
-    const char *kind = MSG_task_get_name(grant);
-    if(!strcmp(kind, "grant")){
-      if(strcmp(my_mailbox, "2") == 0){
-       q = 1;
-       p = 0;
-      }
-       //answers ++;
-      MSG_task_destroy(grant);
-      XBT_INFO("got the answer. Sleep a bit and release it");
-      MSG_process_sleep(1);
-      MSG_task_send(MSG_task_create("release", 0, 1000,NULL ),
-                   "coordinator");
+
+    if(strcmp(my_mailbox, "2") == 0){
+      q = 1;
+      p = 0;
+      XBT_DEBUG("Propositions changed : p=0, q=1");
     }
-    
-    MSG_process_sleep(my_pid);
 
+
+    MSG_task_destroy(grant);
+    XBT_INFO("%s got the answer. Sleep a bit and release it", argv[1]);
+    MSG_process_sleep(1);
+    MSG_task_send(MSG_task_create("release", 0, 1000, NULL), "coordinator");
+
+    MSG_process_sleep(my_pid);
+    
+    if(strcmp(my_mailbox, "2") == 0){
+      q=0;
+      p=0;
+      XBT_DEBUG("Propositions changed : p=0, q=0");
+    }
+    
   }
 
-  //XBT_INFO("Got all the CS I wanted (%s), quit now", my_mailbox);
+  XBT_INFO("Got all the CS I wanted (%s), quit now", my_mailbox);
   return 0;
 }
 
@@ -135,8 +136,7 @@ int main(int argc, char *argv[])
   MSG_function_register("coordinator", coordinator);
   MSG_function_register("client", client);
   MSG_launch_application("deploy_mutex2.xml");
-  MSG_main_liveness_stateless(automaton);
-  //MSG_main();
+  MSG_main_liveness_stateless(automaton, argv[0]);
   
   return 0;
 }