From 7fabb9914081a3925f380812e1289ee322b694ee Mon Sep 17 00:00:00 2001 From: mquinson Date: Fri, 15 Jan 2010 21:58:17 +0000 Subject: [PATCH] add a proper example of master/slaves, using mailboxes git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7012 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- examples/msg/Makefile.am | 5 + .../msg/masterslave/masterslave_mailbox.c | 139 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 examples/msg/masterslave/masterslave_mailbox.c diff --git a/examples/msg/Makefile.am b/examples/msg/Makefile.am index b7419254f3..2b4286c614 100644 --- a/examples/msg/Makefile.am +++ b/examples/msg/Makefile.am @@ -89,6 +89,7 @@ endif noinst_PROGRAMS = sendrecv/sendrecv \ suspend/suspend \ + masterslave/masterslave_mailbox \ masterslave/masterslave_forwarder \ masterslave/masterslave_failure \ masterslave/masterslave_bypass \ @@ -140,6 +141,10 @@ priority_priority_LDADD = $(top_builddir)/src/libsimgrid.la masterslave_masterslave_forwarder_SOURCES = masterslave/masterslave_forwarder.c masterslave_masterslave_forwarder_LDADD = $(top_builddir)/src/libsimgrid.la +# master/slave application example using a mailboxes +masterslave_masterslave_mailbox_SOURCES = masterslave/masterslave_mailbox.c +masterslave_masterslave_mailbox_LDADD = $(top_builddir)/src/libsimgrid.la + # master/slave application example with failures masterslave_masterslave_failure_SOURCES = masterslave/masterslave_failure.c masterslave_masterslave_failure_LDADD = $(top_builddir)/src/libsimgrid.la diff --git a/examples/msg/masterslave/masterslave_mailbox.c b/examples/msg/masterslave/masterslave_mailbox.c new file mode 100644 index 0000000000..b150334cf6 --- /dev/null +++ b/examples/msg/masterslave/masterslave_mailbox.c @@ -0,0 +1,139 @@ +/* $Id$ */ + +/* Copyright (c) 2002,2003,2004 Arnaud Legrand. All rights reserved. */ + +/* 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. */ + +#include +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt/sysdep.h" /* calloc, printf */ + +/* 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[]); +MSG_error_t test_all(const char *platform_file, const char *application_file); + +/** Emitter function */ +int master(int argc, char *argv[]) +{ + long number_of_tasks = atol(argv[1]); + double task_comp_size = atof(argv[2]); + double task_comm_size = atof(argv[3]); + long slaves_count = atol(argv[4]); + + int i; + + printf("Got %ld slaves and %ld tasks to process\n", slaves_count,number_of_tasks); +// INFO2("Got %ld slaves and %ld tasks to process", slaves_count,number_of_tasks); + + for (i = 0; i < number_of_tasks; i++) { + char mailbox[256]; + char sprintf_buffer[256]; + m_task_t task=NULL; + + sprintf(mailbox,"slave-%ld",i % slaves_count); + sprintf(sprintf_buffer, "Task_%d", i); + task = MSG_task_create(sprintf_buffer, task_comp_size, task_comm_size, NULL); + if (number_of_tasks<10000 || i%10000 == 0) { + printf("Sending \"%s\" (of %ld) to mailbox \"%s\"\n", task->name, number_of_tasks, mailbox); + fflush(stdout); + } + + MSG_task_send(task, mailbox); + // INFO0("Sent"); + } + + INFO0("All tasks have been dispatched. Let's tell everybody the computation is over."); + for (i = 0; i < slaves_count; i++) { + char mailbox[80]; + + sprintf(mailbox,"slave-%ld",i % slaves_count); + MSG_task_send(MSG_task_create("finalize", 0, 0, 0), mailbox); + } + +// INFO0("Goodbye now!"); + exit(0); +} /* end_of_master */ + +/** Receiver function */ +int slave(int argc, char *argv[]) +{ + m_task_t task = NULL; + int res; + int id = -1; + char mailbox[80]; + + xbt_assert1(sscanf(argv[1],"%d", &id), + "Invalid argument %s\n",argv[1]); + + sprintf(mailbox,"slave-%d",id); + + while(1) { + res = MSG_task_receive(&(task), mailbox); + xbt_assert0(res == MSG_OK, "MSG_task_get failed"); + +// INFO1("Received \"%s\"", MSG_task_get_name(task)); + if (!strcmp(MSG_task_get_name(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)); + MSG_task_destroy(task); + task = NULL; + } + INFO0("I'm done. See you!"); + return 0; +} /* end_of_slave */ + +/** 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(0); + MSG_paje_output("msg_test.trace"); + MSG_create_environment(platform_file); + } + { /* Application deployment */ + MSG_function_register("master", master); + MSG_function_register("slave", slave); + MSG_launch_application(application_file); + } + 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); + } + res = test_all(argv[1],argv[2]); + MSG_clean(); + + if(res==MSG_OK) + return 0; + else + return 1; +} /* end_of_main */ -- 2.20.1