Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
model-checker : example for detection of acceptance cycle with liveness properties...
authorMarion Guthmuller <marion.guthmuller@loria.fr>
Wed, 9 Nov 2011 10:59:32 +0000 (11:59 +0100)
committerMarion Guthmuller <marion.guthmuller@loria.fr>
Wed, 9 Nov 2011 10:59:32 +0000 (11:59 +0100)
examples/msg/mc/example_liveness_with_cycle.c

index 58703a1..8ec9725 100644 (file)
@@ -12,7 +12,7 @@
 #include "y.tab.c"
 
 #define AMOUNT_OF_CLIENTS 2
-#define CS_PER_PROCESS 1
+#define CS_PER_PROCESS 3
 
 XBT_LOG_NEW_DEFAULT_CATEGORY(example_liveness_with_cycle, "my log messages");
 
@@ -29,9 +29,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*)
@@ -43,9 +40,8 @@ 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
        if(strcmp(req, "1") == 0){
@@ -53,24 +49,19 @@ int coordinator(int argc, char *argv[])
          MSG_task_send(answer, req);
          CS_used = 1;
          XBT_INFO("CS idle. Grant immediatly");
-       }else{
-         m_task_t answer = MSG_task_create("notgrant", 0, 1000, NULL);
-         MSG_task_send(answer, req);
-         XBT_INFO("CS idle but not grant");
        }
       }
     } 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");
@@ -87,7 +78,7 @@ 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 3 times, sleeping a bit in between
   int i;
@@ -95,8 +86,7 @@ int client(int argc, char *argv[])
   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;
@@ -104,19 +94,17 @@ int client(int argc, char *argv[])
     // 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") == 0){
-      if(strcmp(my_mailbox, "2") == 0){
-       q = 1;
-       p = 0;
-      }
-      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");
+
+    if(strcmp(my_mailbox, "2") == 0){
+      q = 1;
+      p = 0;
     }
 
+    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);
     
     q=0;