X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c09e10181971ccaea5ad20d05e13564b3856ad24..5fd1ec2b83838d9500400430bcbdf56dd0855f7f:/examples/msg/actions/actions.c diff --git a/examples/msg/actions/actions.c b/examples/msg/actions/actions.c index 031eabe224..d2c306c0f9 100644 --- a/examples/msg/actions/actions.c +++ b/examples/msg/actions/actions.c @@ -7,12 +7,37 @@ #include #include #include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ -#include "msg/mailbox.h" /* we play funny tricks with mailboxes and rdv points */ #include "simix/simix.h" /* semaphores for the barrier */ #include "xbt.h" /* calloc, printf */ #include "instr/instr_private.h" -void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory); +/** @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"); @@ -90,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"); @@ -109,8 +133,8 @@ static void action_Isend(const char *const *action) sprintf(to, "%s_%s", MSG_process_get_name(MSG_process_self()),action[2]); - m_task_t task = MSG_task_create(to,0,parse_double(size),NULL); - msg_comm_t comm = MSG_task_isend_with_matching(task, to, /*matching madness*/NULL,task); + msg_comm_t comm = + MSG_task_isend( MSG_task_create(to,0,parse_double(size),NULL), to); xbt_dynar_push(globals->isends,&comm); XBT_DEBUG("Isend on %s", MSG_process_get_name(MSG_process_self())); @@ -119,12 +143,6 @@ static void action_Isend(const char *const *action) asynchronous_cleanup(); } -static int task_matching(void*ignored,void*sent_task) { - m_task_t t = (m_task_t)sent_task; - if (t!=NULL && MSG_task_get_data_size(t)<65536) - return 1; /* that's supposed to be already arrived */ - return 0; /* rendez-vous mode: it's not there yet */ -} static void action_recv(const char *const *action) { @@ -139,22 +157,6 @@ static void action_recv(const char *const *action) if (XBT_LOG_ISENABLED(actions, xbt_log_priority_verbose)) name = xbt_str_join_array(action, " "); - /* The next chunk is to deal with the fact that for short messages, - * if the send occurs before the receive, the message is already sent and - * buffered on receiver side when the recv() occurs. - * - * So the next chunk detects this fact and cancel the simix communication instead. - */ - - /* make sure the rdv is created on need by asking to MSG instead of simix directly */ - smx_rdv_t rdv = MSG_mailbox_get_by_alias(mailbox_name); - smx_action_t act = SIMIX_comm_get_send_match(rdv,task_matching,NULL); - if (act!=NULL){ - /* FIXME account for the memcopy time if needed */ - SIMIX_comm_finish(act); - return; - } - #ifdef HAVE_TRACING int rank = get_rank(MSG_process_get_name(MSG_process_self())); int src_traced = get_rank(action[2]); @@ -162,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); @@ -241,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); @@ -262,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); } @@ -408,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) { @@ -494,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) @@ -511,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) @@ -548,8 +547,6 @@ int main(int argc, char *argv[]) { MSG_error_t res = MSG_OK; - smx_factory_initializer_to_use = SIMIX_ctx_raw_factory_init; - /* Check the given arguments */ MSG_global_init(&argc, argv); if (argc < 3) {