X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c6d533c9cc016b1efb935af6b8407a94f3e65a30..2b23c502e86e67eb40ee594cda523e5c95b222c8:/examples/msg/actions/actions.c diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index a45db1fd84..6c63e71310 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -7,9 +7,38 @@ #include #include #include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ -#include "simix/simix.h" /* semaphores for the barrier */ +#include "simgrid/simix.h" /* semaphores for the barrier */ #include "xbt.h" /* calloc, printf */ #include "instr/instr_private.h" +#include + +/** @addtogroup MSG_examples + * + * @section MSG_ex_actions Trace driven simulations + * + * The actions/actions.c example demonstrates how to run trace-driven simulations. It + * is very handy when you want to test an algorithm or protocol that + * does nothing unless it receives some events from outside. For + * example, a P2P protocol reacts to requests from the user, but + * does nothing if there is no such event. + * + * In such situations, SimGrid allows to write your protocol in your + * C file, and the events to react to in a separate text file. + * Declare a function handling each of the events that you want to + * accept in your trace files, register them using \ref + * xbt_replay_action_register in your main, and then use \ref + * MSG_action_trace_run to launch the simulation. You can either + * have one trace file containing all your events, or a file per + * simulated process. Check the tesh files in the example directory + * for details on how to do it. + * + * This example uses this approach to replay MPI-like traces. It + * comes with a set of event handlers reproducing MPI events. This + * is somehow similar to SMPI, yet differently implemented. This + * code should probably be changed to use SMPI internals instead, + * but wasn't, so far. + * + */ XBT_LOG_NEW_DEFAULT_CATEGORY(actions, "Messages specific for this msg example"); @@ -87,8 +116,7 @@ static void action_send(const char *const *action) XBT_VERB("%s %f", name, MSG_get_clock() - clock); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, rank, dst_traced, "send"); @@ -137,13 +165,15 @@ static void action_recv(const char *const *action) #endif XBT_DEBUG("Receiving: %s", name); - MSG_task_receive(&task, mailbox_name); + MSG_error_t res = MSG_task_receive(&task, mailbox_name); // MSG_task_receive(&task, MSG_process_get_name(MSG_process_self())); XBT_VERB("%s %f", name, MSG_get_clock() - clock); - MSG_task_destroy(task); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + if (res == MSG_OK) { + MSG_task_destroy(task); + } + + free(name); #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, rank, "recv"); TRACE_smpi_recv(rank, src_traced, rank); @@ -216,8 +246,7 @@ static void action_wait(const char *const *action) MSG_task_destroy(task); XBT_VERB("%s %f", name, MSG_get_clock() - clock); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); #ifdef HAVE_TRACING TRACE_smpi_ptp_out(rank, src_traced, rank, "wait"); TRACE_smpi_recv(rank, src_traced, rank); @@ -237,32 +266,31 @@ static void action_barrier(const char *const *action) name = xbt_str_join_array(action, " "); if (mutex == NULL) { // first arriving on the barrier - mutex = SIMIX_req_mutex_init(); - cond = SIMIX_req_cond_init(); + mutex = simcall_mutex_init(); + cond = simcall_cond_init(); processes_arrived_sofar=0; } XBT_DEBUG("Entering barrier: %s (%d already there)", name,processes_arrived_sofar); - SIMIX_req_mutex_lock(mutex); + simcall_mutex_lock(mutex); if (++processes_arrived_sofar == communicator_size) { - SIMIX_req_cond_broadcast(cond); - SIMIX_req_mutex_unlock(mutex); + simcall_cond_broadcast(cond); + simcall_mutex_unlock(mutex); } else { - SIMIX_req_cond_wait(cond,mutex); - SIMIX_req_mutex_unlock(mutex); + simcall_cond_wait(cond,mutex); + simcall_mutex_unlock(mutex); } XBT_DEBUG("Exiting barrier: %s", name); processes_arrived_sofar--; if (!processes_arrived_sofar) { - SIMIX_req_cond_destroy(cond); - SIMIX_req_mutex_destroy(mutex); + simcall_cond_destroy(cond); + simcall_mutex_destroy(mutex); mutex=NULL; } - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); } @@ -383,8 +411,7 @@ static void action_sleep(const char *const *action) MSG_process_sleep(parse_double(duration)); XBT_VERB("%s %f ", name, MSG_get_clock() - clock); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); } static void action_allReduce(const char *const *action) { @@ -469,8 +496,7 @@ static void action_comm_size(const char *const *action) name = xbt_str_join_array(action, " "); communicator_size = parse_double(size); XBT_VERB("%s %f", name, MSG_get_clock() - clock); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); } static void action_compute(const char *const *action) @@ -486,8 +512,7 @@ static void action_compute(const char *const *action) MSG_task_execute(task); MSG_task_destroy(task); XBT_VERB("%s %f", name, MSG_get_clock() - clock); - if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) - free(name); + free(name); } static void action_init(const char *const *action) @@ -544,20 +569,20 @@ int main(int argc, char *argv[]) MSG_launch_application(argv[2]); /* Action registration */ - MSG_action_register("init", action_init); - MSG_action_register("finalize", action_finalize); - MSG_action_register("comm_size",action_comm_size); - MSG_action_register("send", action_send); - MSG_action_register("Isend", action_Isend); - MSG_action_register("recv", action_recv); - MSG_action_register("Irecv", action_Irecv); - MSG_action_register("wait", action_wait); - MSG_action_register("barrier", action_barrier); - MSG_action_register("bcast", action_bcast); - MSG_action_register("reduce", action_reduce); - MSG_action_register("allReduce",action_allReduce); - MSG_action_register("sleep", action_sleep); - MSG_action_register("compute", action_compute); + xbt_replay_action_register("init", action_init); + xbt_replay_action_register("finalize", action_finalize); + xbt_replay_action_register("comm_size",action_comm_size); + xbt_replay_action_register("send", action_send); + xbt_replay_action_register("Isend", action_Isend); + xbt_replay_action_register("recv", action_recv); + xbt_replay_action_register("Irecv", action_Irecv); + xbt_replay_action_register("wait", action_wait); + xbt_replay_action_register("barrier", action_barrier); + xbt_replay_action_register("bcast", action_bcast); + xbt_replay_action_register("reduce", action_reduce); + xbt_replay_action_register("allReduce",action_allReduce); + xbt_replay_action_register("sleep", action_sleep); + xbt_replay_action_register("compute", action_compute); /* Actually do the simulation using MSG_action_trace_run */