From 5d3371b450c02d427a69462ca166772385117791 Mon Sep 17 00:00:00 2001 From: Marion Guthmuller Date: Wed, 9 Nov 2011 11:59:32 +0100 Subject: [PATCH] model-checker : example for detection of acceptance cycle with liveness properties fixed --- examples/msg/mc/example_liveness_with_cycle.c | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/examples/msg/mc/example_liveness_with_cycle.c b/examples/msg/mc/example_liveness_with_cycle.c index 58703a15e9..8ec9725a46 100644 --- a/examples/msg/mc/example_liveness_with_cycle.c +++ b/examples/msg/mc/example_liveness_with_cycle.c @@ -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; -- 2.20.1