X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c6d533c9cc016b1efb935af6b8407a94f3e65a30..5fd1ec2b83838d9500400430bcbdf56dd0855f7f:/examples/msg/actions/actions.c diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index a45db1fd84..d2c306c0f9 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -11,6 +11,34 @@ #include "xbt.h" /* calloc, printf */ #include "instr/instr_private.h" +/** @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 + * MSG_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"); int communicator_size = 0; @@ -87,8 +115,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 +164,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 +245,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 +265,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 +410,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 +495,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 +511,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)