X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5f7e9bf9cd6ea2c2cfb9246613c03d667d66fd79..d69523bb9a7c8d5381d44e94f559337bc9745009:/examples/msg/actions/actions.c diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index 38f6c22842..e57369aaed 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -6,57 +6,286 @@ * 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.h" /* calloc, printf */ +#include +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt.h" /* calloc, printf */ + + +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, + "Messages specific for this msg example"); +int communicator_size=0; + +typedef struct coll_ctr_t{ + int bcast_counter; +} *coll_ctr; + +/* Helper function */ +static double parse_double(const char *string) { + double value; + char *endptr; + + value=strtod(string, &endptr); + if (*endptr != '\0') + THROW1(unknown_error, 0, "%s is not a double", string); + return value; +} -XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test,"Messages specific for this msg example"); /* My actions */ -static void send(xbt_dynar_t action) { - INFO1("Send: %s",xbt_str_join(action," ")); +static void send(xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + char *to = xbt_dynar_get_as(action, 2, char *); + char *size = xbt_dynar_get_as(action, 3, char *); + INFO2("Send: %s (size: %lg)", name, parse_double(size)); + MSG_task_send(MSG_task_create(name, 0, parse_double(size), NULL), to); + INFO1("Sent %s", name); + free(name); +} + +static int spawned_send(int argc, char *argv[]) +{ + xbt_dynar_t action= (xbt_dynar_t) MSG_process_get_data(MSG_process_self()); + char *name = xbt_str_join(action, " "); + char *to = xbt_dynar_get_as(action, 2, char *); + char *size = xbt_dynar_get_as(action, 3, char *); + INFO3("name is %s, to is %s, sizeis %s", name, to, size); + INFO1("Sending on %s\n", name); + MSG_task_send(MSG_task_create(name, 0, parse_double(size), NULL), to); + INFO1("Sent %s", name); + free(name); + return 0; } -static void recv(xbt_dynar_t action) { - INFO1("Recv: %s",xbt_str_join(action," ")); + +static void Isend(xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + m_process_t comm_helper; + + INFO1("Isend on %s: spawn process ", + MSG_process_get_name(MSG_process_self())); + + sprintf(name,"%s_wait",MSG_process_self()->name); + comm_helper = MSG_process_create(name,spawned_send, + (void *) action, + MSG_host_self()); + free(name); } -static void sleep(xbt_dynar_t action) { - INFO1("Recv: %s",xbt_str_join(action," ")); + + +static void recv(xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + m_task_t task = NULL; + INFO1("Receiving: %s", name); + //FIXME: argument of action ignored so far; semantic not clear + //char *from=xbt_dynar_get_as(action,2,char*); + MSG_task_receive(&task, MSG_process_get_name(MSG_process_self())); + INFO1("Received %s", MSG_task_get_name(task)); + MSG_task_destroy(task); + free(name); } -static void compute(xbt_dynar_t action) { - INFO1("compute: %s",xbt_str_join(action," ")); + +static int spawned_recv(int argc, char *argv[]) +{ + m_task_t task = NULL; + char* name = (char *) MSG_process_get_data(MSG_process_self()); + INFO1("Receiving on %s", name); + MSG_task_receive(&task, name); + INFO1("Received %s", MSG_task_get_name(task)); + MSG_task_send(MSG_task_create("waiter",0,0,NULL),MSG_process_self()->name); + + MSG_task_destroy(task); + return 0; +} + + +static void Irecv(xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + m_process_t comm_helper; + + INFO1("Irecv on %s: spawn process ", + MSG_process_get_name(MSG_process_self())); + + sprintf(name,"%s_wait",MSG_process_self()->name); + comm_helper = MSG_process_create(name,spawned_recv, + (void *) MSG_process_get_name(MSG_process_self()), + MSG_host_self()); + + + free(name); +} + + +static void wait(xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + char task_name[80]; + m_task_t task = NULL; + + INFO1("wait: %s", name); + sprintf(task_name,"%s_wait",MSG_process_self()->name); + MSG_task_receive(&task,task_name); + INFO1("waited: %s", name); + free(name); +} + +static void barrier (xbt_dynar_t action) +{ + char *name = xbt_str_join(action, " "); + INFO1("barrier: %s", name); + + + free(name); + +} + +static int bcast_spawned_send(int argc, char *argv[]) +{ + char name[80]; + INFO3("%s: Sending %s on %s", MSG_process_self()->name, + argv[1],argv[0]); + MSG_task_send(MSG_task_create(argv[0], 0, parse_double(argv[1]), NULL), + argv[0]); + + sprintf(name,"%s_wait",argv[0]); + return 0; +} + +static void bcast (xbt_dynar_t action) +{ + int i; + char *name; + const char* process_name; + char task_name[80]; + char spawn_name[80]; + char **myargv; + m_process_t comm_helper=NULL; + m_task_t task=NULL; + char *size = xbt_dynar_get_as(action, 2, char *); + coll_ctr counters = (coll_ctr) MSG_process_get_data(MSG_process_self()); + + xbt_assert0(communicator_size, "Size of Communicator is not defined" + ", can't use collective operations"); + + MSG_process_self()->data=NULL; + + process_name = MSG_process_self()->name; + if (!counters){ + DEBUG0("Initialize the counters"); + counters = (coll_ctr) calloc (1, sizeof(struct coll_ctr_t)); + } + + name = bprintf("bcast_%d", counters->bcast_counter++); + if (!strcmp(process_name, "process0")){ + INFO2("%s: %s is the Root",name, process_name); + + for(i=1;i