From a8eadc3bb05b2953b06e98b4518373ccb2331763 Mon Sep 17 00:00:00 2001 From: alegrand Date: Mon, 17 Oct 2005 15:11:13 +0000 Subject: [PATCH] Return an error code when the simulation deadlocks. Avoid deadlock in this simulation. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1755 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- examples/msg/msg_test.c | 57 +++++++++++++----------- examples/msg/msg_test_surfxml_bypassed.c | 55 +++++++++++------------ 2 files changed, 58 insertions(+), 54 deletions(-) diff --git a/examples/msg/msg_test.c b/examples/msg/msg_test.c index cec9680a25..451dc02a1b 100644 --- a/examples/msg/msg_test.c +++ b/examples/msg/msg_test.c @@ -14,25 +14,14 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,"Messages specific for this msg example"); int master(int argc, char *argv[]); int slave(int argc, char *argv[]); int forwarder(int argc, char *argv[]); -void test_all(const char *platform_file, const char *application_file); +MSG_error_t test_all(const char *platform_file, const char *application_file); typedef enum { PORT_22 = 0, MAX_CHANNEL } channel_t; -/* This function is just used so that users can check that each process - * has received the arguments it was supposed to receive. - */ -static void print_args(int argc, char** argv) -{ - int i ; - - fprintf(stderr,"<"); - for(i=0; i\n"); -} +#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ /** Emitter function */ int master(int argc, char *argv[]) @@ -47,8 +36,6 @@ int master(int argc, char *argv[]) int i; - print_args(argc,argv); - xbt_assert1(sscanf(argv[1],"%d", &number_of_tasks), "Invalid argument %s\n",argv[1]); xbt_assert1(sscanf(argv[2],"%lg", &task_comp_size), @@ -101,7 +88,12 @@ int master(int argc, char *argv[]) INFO0("Send completed"); } - INFO0("All tasks have been dispatched. Bye!"); + INFO0("All tasks have been dispatched. Let's tell everybody the computation is over."); + for (i = 0; i < slaves_count; i++) + MSG_task_put(MSG_task_create("finalize", 0, 0, FINALIZE), + slaves[i], PORT_22); + + INFO0("Goodbye now!"); free(slaves); free(todo); return 0; @@ -110,14 +102,16 @@ int master(int argc, char *argv[]) /** Receiver function */ int slave(int argc, char *argv[]) { - print_args(argc,argv); - while(1) { m_task_t task = NULL; int a; a = MSG_task_get(&(task), PORT_22); if (a == MSG_OK) { INFO1("Received \"%s\" ", MSG_task_get_name(task)); + if(MSG_task_get_data(task)==FINALIZE) { + MSG_task_destroy(task); + break; + } INFO1("Processing \"%s\" ", MSG_task_get_name(task)); MSG_task_execute(task); INFO1("\"%s\" done ", MSG_task_get_name(task)); @@ -138,8 +132,6 @@ int forwarder(int argc, char *argv[]) int slaves_count = argc - 1; m_host_t *slaves = calloc(slaves_count, sizeof(m_host_t)); - print_args(argc,argv); - { /* Process organisation */ slaves_count = argc - 1; slaves = calloc(slaves_count, sizeof(m_host_t)); @@ -160,9 +152,17 @@ int forwarder(int argc, char *argv[]) a = MSG_task_get(&(task), PORT_22); if (a == MSG_OK) { INFO1("Received \"%s\" ", MSG_task_get_name(task)); + if(MSG_task_get_data(task)==FINALIZE) { + INFO0("All tasks have been dispatched. Let's tell everybody the computation is over."); + for (i = 0; i < slaves_count; i++) + MSG_task_put(MSG_task_create("finalize", 0, 0, FINALIZE), + slaves[i], PORT_22); + MSG_task_destroy(task); + break; + } INFO2("Sending \"%s\" to \"%s\"", MSG_task_get_name(task), - slaves[i % slaves_count]->name); + slaves[i% slaves_count]->name); MSG_task_put(task, slaves[i % slaves_count], PORT_22); } else { @@ -177,8 +177,10 @@ int forwarder(int argc, char *argv[]) /** Test function */ -void test_all(const char *platform_file,const char *application_file) +MSG_error_t test_all(const char *platform_file, + const char *application_file) { + MSG_error_t res = MSG_OK; /* MSG_config("surf_workstation_model","KCCFLN05"); */ { /* Simulation setting */ @@ -192,22 +194,27 @@ void test_all(const char *platform_file,const char *application_file) MSG_function_register("forwarder", forwarder); MSG_launch_application(application_file); } - MSG_main(); + res = MSG_main(); INFO1("Simulation time %g",MSG_get_clock()); + return res; } /* end_of_test_all */ /** Main function */ int main(int argc, char *argv[]) { + MSG_error_t res = MSG_OK; + MSG_global_init(&argc,argv); if (argc < 3) { printf ("Usage: %s platform_file deployment_file\n",argv[0]); printf ("example: %s msg_platform.xml msg_deployment.xml\n",argv[0]); exit(1); } - test_all(argv[1],argv[2]); + res = test_all(argv[1],argv[2]); MSG_clean(); - return (0); + + if(res==MSG_OK) return 0; + else return 1; } /* end_of_main */ diff --git a/examples/msg/msg_test_surfxml_bypassed.c b/examples/msg/msg_test_surfxml_bypassed.c index 9d183f9e65..55f74f626f 100644 --- a/examples/msg/msg_test_surfxml_bypassed.c +++ b/examples/msg/msg_test_surfxml_bypassed.c @@ -12,6 +12,7 @@ /* Create a log channel to have nice outputs. */ #include "xbt/log.h" XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,"Messages specific for this msg example"); +#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ static int surf_parse_bypass(void) { @@ -139,26 +140,13 @@ static int surf_parse_bypass(void) int master(int argc, char *argv[]); int slave(int argc, char *argv[]); -void test_all(void); +MSG_error_t test_all(void); typedef enum { PORT_22 = 0, MAX_CHANNEL } channel_t; -/* This function is just used so that users can check that each process - * has received the arguments it was supposed to receive. - */ -static void print_args(int argc, char** argv) -{ - int i ; - - fprintf(stderr,"<"); - for(i=0; i\n"); -} - /** Emitter function */ int master(int argc, char *argv[]) { @@ -172,8 +160,6 @@ int master(int argc, char *argv[]) int i; - print_args(argc,argv); - xbt_assert1(sscanf(argv[1],"%d", &number_of_tasks), "Invalid argument %s\n",argv[1]); xbt_assert1(sscanf(argv[2],"%lg", &task_comp_size), @@ -226,7 +212,12 @@ int master(int argc, char *argv[]) INFO0("Send completed"); } - INFO0("All tasks have been dispatched. Bye!"); + INFO0("All tasks have been dispatched. Let's tell everybody the computation is over."); + for (i = 0; i < slaves_count; i++) + MSG_task_put(MSG_task_create("finalize", 0, 0, FINALIZE), + slaves[i], PORT_22); + + INFO0("Goodbye now!"); free(slaves); free(todo); return 0; @@ -235,21 +226,23 @@ int master(int argc, char *argv[]) /** Receiver function */ int slave(int argc, char *argv[]) { - print_args(argc,argv); - while(1) { m_task_t task = NULL; int a; a = MSG_task_get(&(task), PORT_22); if (a == MSG_OK) { - INFO1("Received \"%s\" ", task->name); - INFO1("Processing \"%s\" ", task->name); + INFO1("Received \"%s\" ", MSG_task_get_name(task)); + if(MSG_task_get_data(task)==FINALIZE) { + MSG_task_destroy(task); + break; + } + INFO1("Processing \"%s\" ", MSG_task_get_name(task)); MSG_task_execute(task); - INFO1("\"%s\" done ", task->name); + INFO1("\"%s\" done ", MSG_task_get_name(task)); MSG_task_destroy(task); } else { INFO0("Hey ?! What's up ? "); - xbt_assert0(0,"Unexpected behaviour"); + xbt_assert0(0,"Unexpected behavior"); } } INFO0("I'm done. See you!"); @@ -257,10 +250,10 @@ int slave(int argc, char *argv[]) } /* end_of_slave */ /** Test function */ -void test_all(void) +MSG_error_t test_all(void) { + MSG_error_t res = MSG_OK; - /* MSG_config("surf_workstation_model","KCCFLN05"); */ { /* Simulation setting */ MSG_set_channel_number(MAX_CHANNEL); MSG_paje_output("msg_test.trace"); @@ -272,18 +265,22 @@ void test_all(void) MSG_function_register("slave", slave); MSG_launch_application(NULL); } - MSG_main(); + res = MSG_main(); INFO1("Simulation time %g",MSG_get_clock()); + return res; } /* end_of_test_all */ - /** Main function */ int main(int argc, char *argv[]) { + MSG_error_t res = MSG_OK; + MSG_global_init(&argc,argv); - test_all(); + res = test_all(); MSG_clean(); - return (0); + + if(res==MSG_OK) return 0; + else return 1; } /* end_of_main */ -- 2.20.1