X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2e9105988280d1e88b5b496d6e2eed4c8d541883..a4cd8aafa1caf358f873f87b142f76185acf1901:/examples/msg/cloud/masterslave_virtual_machines.c diff --git a/examples/msg/cloud/masterslave_virtual_machines.c b/examples/msg/cloud/masterslave_virtual_machines.c index e1527eb61e..830739a678 100644 --- a/examples/msg/cloud/masterslave_virtual_machines.c +++ b/examples/msg/cloud/masterslave_virtual_machines.c @@ -4,7 +4,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include -#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "msg/msg.h" #include "xbt/sysdep.h" /* calloc, printf */ /* Create a log channel to have nice outputs. */ @@ -15,217 +15,246 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, /** @addtogroup MSG_examples * - * - cloud/masterslave_virtual_machines.c: Master/slaves - * example, à la cloud. The classical example revisited to demonstrate the use of virtual machines. + * - cloud/masterslave_virtual_machines.c: Master/workers + * example on a cloud. The classical example revisited to demonstrate the use of virtual machines. */ -double task_comp_size = 10000000; -double task_comm_size = 10000000; +const double task_comp_size = 10000000; +const double task_comm_size = 10000000; -int master(int argc, char *argv[]); -int slave_fun(int argc, char *argv[]); +int master_fun(int argc, char *argv[]); +int worker_fun(int argc, char *argv[]); -static void work_batch(int slaves_count) { + +static void work_batch(int workers_count) +{ int i; - for (i = 0; i < slaves_count; i++) { - char taskname_buffer[64]; - char mailbox_buffer[64]; + for (i = 0; i < workers_count; i++) { + char *tname = bprintf("Task%02d", i); + char *mbox = bprintf("MBOX:WRK%02d", i); + + msg_task_t task = MSG_task_create(tname, task_comp_size, task_comm_size, NULL); - sprintf(taskname_buffer, "Task_%d", i); - sprintf(mailbox_buffer,"Slave_%d",i); + XBT_INFO("send task(%s) to mailbox(%s)", tname, mbox); + MSG_task_send(task, mbox); - XBT_INFO("Sending \"%s\" to \"%s\"",taskname_buffer,mailbox_buffer); - MSG_task_send(MSG_task_create(taskname_buffer, task_comp_size, task_comm_size,NULL), - mailbox_buffer); + free(tname); + free(mbox); } } -int master(int argc, char *argv[]) { - int slaves_count = 10; - msg_host_t *slaves = xbt_new(msg_host_t,10); - +int master_fun(int argc, char *argv[]) +{ msg_vm_t vm; unsigned int i; + int workers_count = argc - 1; - /* Retrive the hostnames constituting our playground today */ - for (i = 1; i < argc; i++) { - slaves[i - 1] = MSG_get_host_by_name(argv[i]); - xbt_assert(slaves[i - 1] != NULL, "Cannot use inexistent host %s", argv[i]); - } + msg_host_t *pms = xbt_new(msg_host_t, workers_count); + xbt_dynar_t vms = xbt_dynar_new(sizeof(msg_vm_t), NULL); - /* Launch the sub processes: one VM per host, with one process inside each */ + /* Retrieve the PMs that will launch worker processes. */ + for (i = 1; i < argc; i++) + pms[i - 1] = MSG_get_host_by_name(argv[i]); - for (i=0;i=2, "slave processes need to be given their rank as parameter"); - sprintf(mailbox_name,"Slave_%s",argv[1]); - XBT_INFO("Slave listenning on %s",argv[1]); - while (1) { - res = MSG_task_receive(&(task),mailbox_name); - xbt_assert(res == MSG_OK, "MSG_task_get failed"); - - XBT_INFO("Received \"%s\" from mailbox %s", MSG_task_get_name(task),mailbox_name); + xbt_assert(argc == 2, "need mbox in arguments"); + + char *mbox = argv[1]; + const char *pr_name = MSG_process_get_name(MSG_process_self()); + XBT_INFO("%s is listenning on mailbox(%s)", pr_name, mbox); + + for (;;) { + msg_task_t task = NULL; + + msg_error_t res = MSG_task_receive(&task, mbox); + if (res != MSG_OK) { + XBT_CRITICAL("MSG_task_get failed"); + DIE_IMPOSSIBLE; + } + + XBT_INFO("%s received task(%s) from mailbox(%s)", + pr_name, MSG_task_get_name(task), mbox); + if (!strcmp(MSG_task_get_name(task), "finalize")) { MSG_task_destroy(task); break; } MSG_task_execute(task); - XBT_INFO("\"%s\" done", MSG_task_get_name(task)); + XBT_INFO("%s executed task(%s)", pr_name, MSG_task_get_name(task)); MSG_task_destroy(task); - task = NULL; } return 0; -} /* end_of_slave */ +} + /** Main function */ int main(int argc, char *argv[]) { - msg_error_t res = MSG_OK; - xbt_dynar_t hosts_dynar; - msg_host_t*hosts= xbt_new(msg_host_t,10); - char**hostnames= xbt_new(char*,10); - char**masterargv=xbt_new(char*,12); - int i; + const int nb_hosts = 3; - /* Get the arguments */ MSG_init(&argc, argv); - if (argc < 2) { - printf("Usage: %s platform_file\n", argv[0]); - printf("example: %s msg_platform.xml\n", argv[0]); - exit(1); - } if (argc>2) { - printf("Usage: %s platform_file\n", argv[0]); - printf("Other parameters (such as the deployment file) are ignored."); + if (argc != 2) { + printf("Usage: %s example/msg/msg_platform.xml\n", argv[0]); + return 1; } - /* load the platform file */ + /* Load the platform file */ MSG_create_environment(argv[1]); - /* Retrieve the 10 first hosts of the platform file */ - hosts_dynar = MSG_hosts_as_dynar(); - xbt_assert(xbt_dynar_length(hosts_dynar)>10, - "I need at least 10 hosts in the platform file, but %s contains only %ld hosts_dynar.", - argv[1],xbt_dynar_length(hosts_dynar)); - for (i=0;i<10;i++) { - hosts[i] = xbt_dynar_get_as(hosts_dynar,i,msg_host_t); - hostnames[i] = xbt_strdup(MSG_host_get_name(hosts[i])); + + /* Retrieve hosts from the platform file */ + xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar(); + + if (xbt_dynar_length(hosts_dynar) <= nb_hosts) { + XBT_CRITICAL("need %d hosts", nb_hosts); + return 1; } - masterargv[0]=xbt_strdup("master"); - for (i=1;i<11;i++) { - masterargv[i] = xbt_strdup(MSG_host_get_name(hosts[i-1])); + + msg_host_t master_pm = NULL; + char **master_argv = xbt_new(char *, 12); + master_argv[0] = xbt_strdup("master"); + master_argv[11] = NULL; + + unsigned int i; + msg_host_t host; + xbt_dynar_foreach(hosts_dynar, i, host) { + if (i == 0) { + master_pm = host; + continue; + } + + master_argv[i] = xbt_strdup(MSG_host_get_name(host)); + + if (i == nb_hosts) + break; + } + + msg_error_t res = 1; + if (master_pm!=NULL){ + MSG_process_create_with_arguments("master", master_fun, NULL, master_pm, nb_hosts + 1, master_argv); + + res = MSG_main(); + XBT_INFO("Bye (simulation time %g)", MSG_get_clock()); } - masterargv[11]=NULL; - MSG_process_create_with_arguments("master",master,NULL,hosts[0],11,masterargv); - res = MSG_main(); - XBT_INFO("Simulation time %g", MSG_get_clock()); - - free(hosts); - for (i=0;i<10;i++) - free(hostnames[i]); - free(hostnames); xbt_dynar_free(&hosts_dynar); - if (res == MSG_OK) - return 0; - else - return 1; -} /* end_of_main */ + return !(res == MSG_OK); +}