X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2ddab1a7a92fa2a458963cf9dc8dd5d2da30283e..f456ea03242380351789e2e8b380ee0da6ef635f:/examples/msg/msg_test.c diff --git a/examples/msg/msg_test.c b/examples/msg/msg_test.c index f8841cb44f..a619042a9e 100644 --- a/examples/msg/msg_test.c +++ b/examples/msg/msg_test.c @@ -5,59 +5,27 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -/** \file msg_test.c - * \ingroup MSG_examples - * \brief Simulation of a master-slave application using a realistic platform - * and an external description of the deployment. -*/ +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt/sysdep.h" /* calloc, printf */ -/** Yeah! If you want to use msg, you need to include msg/msg.h */ -#include "msg/msg.h" - -/** This includes creates a log channel for to have nice outputs. */ +/* Create a log channel to have nice outputs. */ #include "xbt/log.h" +#include "xbt/asserts.h" 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; -/** Print arguments - * 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 - * This function has to be assigned to a m_process_t that will behave as the master. - It should not be called directly but either given as a parameter to - #MSG_process_create() or registered as a public function through - #MSG_function_register() and then automatically assigned to a process through - #MSG_launch_application(). - - C style arguments (argc/argv) are interpreted as - \li the number of tasks to distribute - \li the computation size of each task - \li the size of the files associated to each task - \li a list of host that will accept those tasks. +#define FINALIZE ((void*)221297) /* a magic number to tell people to stop working */ - Tasks are dumbly sent in a round-robin style. - */ +/** Emitter function */ int master(int argc, char *argv[]) { int slaves_count = 0; @@ -70,8 +38,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), @@ -116,62 +82,57 @@ int master(int argc, char *argv[]) INFO2("Sending \"%s\" to \"%s\"", todo[i]->name, slaves[i % slaves_count]->name); + if(MSG_host_self()==slaves[i % slaves_count]) { + INFO0("Hey ! It's me ! :)"); + } MSG_task_put(todo[i], slaves[i % slaves_count], PORT_22); 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; -} - -/** Receiver function - * This function has to be assigned to a #m_process_t that has to behave as a slave. - Just like #master(), it should not be called directly. +} /* end_of_master */ - This function keeps waiting for tasks and executes them as it receives them. - */ +/** 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!"); return 0; -} - -/** Receiver function - * This function has to be assigned to a #m_process_t that has to behave as a forwarder. - Just like #master(), it should not be called directly. +} /* end_of_slave */ - C style arguments (argc/argv) are interpreted as a list of host - that will accept those tasks. - - This function keeps waiting for tasks and dispathes them to its slaves. - */ +/** Receiver function */ int forwarder(int argc, char *argv[]) { int i; - int slaves_count = argc - 1; - m_host_t *slaves = calloc(slaves_count, sizeof(m_host_t)); - - print_args(argc,argv); + int slaves_count; + m_host_t *slaves; { /* Process organisation */ slaves_count = argc - 1; @@ -192,38 +153,39 @@ int forwarder(int argc, char *argv[]) int a; a = MSG_task_get(&(task), PORT_22); if (a == MSG_OK) { - INFO1("Received \"%s\" ", task->name); + 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\"", - task->name, - slaves[i % slaves_count]->name); + MSG_task_get_name(task), + slaves[i% slaves_count]->name); MSG_task_put(task, slaves[i % slaves_count], PORT_22); + i++; } else { INFO0("Hey ?! What's up ? "); - xbt_assert0(0,"Unexpected behaviour"); + xbt_assert0(0,"Unexpected behavior"); } } INFO0("I'm done. See you!"); return 0; -} +} /* end_of_forwarder */ -/** Test function - * This function is the core of the simulation and is divided only into 3 parts - * thanks to MSG_create_environment() and MSG_launch_application(). - * -# Simulation settings : MSG_create_environment() creates a realistic - * environment - * -# Application deployment : create the agents on the right locations with - * MSG_launch_application() - * -# The simulation is run with #MSG_main() - * @param platform_file the name of a file containing an valid surfxml platform - * description. - * @param application_file the name of a file containing a valid surfxml application - * description - */ -void test_all(const char *platform_file,const char *application_file) +/** Test function */ +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 */ MSG_set_channel_number(MAX_CHANNEL); MSG_paje_output("msg_test.trace"); @@ -235,25 +197,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_getClock()); -} + INFO1("Simulation time %g",MSG_get_clock()); + return res; +} /* end_of_test_all */ -/** Main function - * This initializes MSG, runs a simulation, and free all data-structures created - * by MSG. - */ +/** Main function */ int main(int argc, char *argv[]) { - MSG_global_init_args(&argc,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 */