X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/059291b87112991d41f426698f45afea178efb0b..409f7a8342cc507a9117bfda8b782bf862670005:/examples/msg/mc/centralized_liveness.c diff --git a/examples/msg/mc/centralized_liveness.c b/examples/msg/mc/centralized_liveness.c index 350c59bb85..b1438e2775 100644 --- a/examples/msg/mc/centralized_liveness.c +++ b/examples/msg/mc/centralized_liveness.c @@ -1,19 +1,19 @@ +/***************** Centralized Mutual Exclusion Algorithm *********************/ +/* This example implements a centralized mutual exclusion algorithm. */ +/* LTL property checked : !(GFcs) */ +/******************************************************************************/ + #include "msg/msg.h" #include "mc/mc.h" #include "xbt/automaton.h" -#include "xbt/automatonparse_promela.h" #include "centralized_liveness.h" -#include "y.tab.c" - -#define AMOUNT_OF_CLIENTS 2 -#define CS_PER_PROCESS 1 XBT_LOG_NEW_DEFAULT_CATEGORY(centralized, "my log messages"); -int cs2 = 0; +int cs = 0; -int predCS2(){ - return cs2; +int predCS(){ + return cs; } @@ -22,7 +22,6 @@ int client(int argc, char **argv); int coordinator(int argc, char *argv[]) { - xbt_dynar_t requests = xbt_dynar_new(sizeof(char *), NULL); // dynamic vector storing requests (which are char*) int CS_used = 0; // initially the CS is idle while (1) { @@ -31,9 +30,10 @@ 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); - if (CS_used) { // need to push the request in the vector - XBT_INFO("CS already used. Queue the request"); - xbt_dynar_push(requests, &req); + if (CS_used) { + XBT_INFO("CS already used."); + m_task_t answer = MSG_task_create("not grant", 0, 1000, NULL); + MSG_task_send(answer, req); } else { // can serve it immediatly XBT_INFO("CS idle. Grant immediatly"); m_task_t answer = MSG_task_create("grant", 0, 1000, NULL); @@ -41,16 +41,8 @@ int coordinator(int argc, char *argv[]) CS_used = 1; } } else { // that's a release. Check if someone was waiting for the lock - if (!xbt_dynar_is_empty(requests)) { - XBT_INFO("CS release. Grant to queued requests (queue size: %lu)", - xbt_dynar_length(requests)); - char *req; - xbt_dynar_pop(requests, &req); - MSG_task_send(MSG_task_create("grant", 0, 1000, NULL), req); - } else { // nobody wants it - XBT_INFO("CS release. resource now idle"); - CS_used = 0; - } + XBT_INFO("CS release. resource now idle"); + CS_used = 0; } MSG_task_destroy(task); } @@ -62,27 +54,42 @@ int client(int argc, char *argv[]) { int my_pid = MSG_process_get_PID(MSG_process_self()); char *my_mailbox = bprintf("%s", argv[1]); + const char* kind; while(1){ - if(!strcmp(my_mailbox, "2")) - cs2 = 0; - - XBT_INFO("Client (%s) ask the request", my_mailbox); + XBT_INFO("Client (%s) asks the request", my_mailbox); MSG_task_send(MSG_task_create("request", 0, 1000, my_mailbox), "coordinator"); // wait the answer - m_task_t grant = NULL; - MSG_task_receive(&grant, my_mailbox); - MSG_task_destroy(grant); - XBT_INFO("got the answer. Sleep a bit and release it"); + m_task_t answer = NULL; + MSG_task_receive(&answer, my_mailbox); - if(!strcmp(my_mailbox, "2")) - cs2 = 1; + kind = MSG_task_get_name(answer); + + if (!strcmp(kind, "grant")) { - MSG_process_sleep(1); - MSG_task_send(MSG_task_create("release", 0, 1000, NULL), - "coordinator"); + XBT_INFO("Client (%s) got the answer (grant). Sleep a bit and release it", my_mailbox); + + if(!strcmp(my_mailbox, "1")) + cs = 1; + + /*MSG_process_sleep(my_pid); + MSG_task_send(MSG_task_create("release", 0, 1000, NULL), + "coordinator"); + XBT_INFO("Client (%s) releases the CS", my_mailbox); + + if(!strcmp(my_mailbox, "1")) + cs = 0;*/ + + }else{ + + XBT_INFO("Client (%s) got the answer (not grant). Try again", my_mailbox); + + } + + MSG_task_destroy(answer); + MSG_process_sleep(my_pid); } @@ -91,17 +98,16 @@ int client(int argc, char *argv[]) int main(int argc, char *argv[]) { - init(); - yyparse(); - automaton = get_automaton(); - xbt_new_propositional_symbol(automaton,"cs2", &predCS2); + + xbt_automaton_t a = MC_create_automaton("promela_centralized_liveness"); + xbt_new_propositional_symbol(a,"cs", &predCS); MSG_global_init(&argc, argv); MSG_create_environment("../msg_platform.xml"); MSG_function_register("coordinator", coordinator); MSG_function_register("client", client); MSG_launch_application("deploy_centralized_liveness.xml"); - MSG_main_liveness(automaton, argv[0]); + MSG_main_liveness(a); return 0;