X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/073ca319b2651b2606957f289f3871e322a230a4..8c0a8b86fcd472830e5eb55b27f5946b4538aa8a:/src/gras/Msg/msg.c diff --git a/src/gras/Msg/msg.c b/src/gras/Msg/msg.c index 5b02e5cd6e..61a0701e48 100644 --- a/src/gras/Msg/msg.c +++ b/src/gras/Msg/msg.c @@ -8,6 +8,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/ex.h" +#include "xbt/ex_interface.h" #include "gras/Msg/msg_private.h" #include "gras/Virtu/virtu_interface.h" #include "gras/DataDesc/datadesc_interface.h" @@ -292,7 +293,7 @@ gras_msg_wait_ext(double timeout, while (1) { memset(&msg,sizeof(msg),0); - msg.expe = gras_trp_select(timeout - now + start); + msg.expe = gras_trp_select(timeout ? timeout - now + start : 0); gras_msg_recv(msg.expe, &msg); DEBUG0("Got a message from the socket"); @@ -373,7 +374,7 @@ gras_msg_handle(double timeOut) { double untiltimer; - int cpt; + int cpt, ran_ok; s_gras_msg_t msg; @@ -388,7 +389,7 @@ gras_msg_handle(double timeOut) { VERB1("Handling message within the next %.2fs",timeOut); untiltimer = gras_msg_timer_handle(); - DEBUG2("[%.0f] Next timer in %f sec", gras_os_time(), untiltimer); + DEBUG1("Next timer in %f sec", untiltimer); if (untiltimer == 0.0) { /* A timer was already elapsed and handled */ return; @@ -419,7 +420,8 @@ gras_msg_handle(double timeOut) { TRY { /* FIXME: if not the right kind, queue it and recall ourself or goto >:-) */ gras_msg_recv(msg.expe, &msg); - DEBUG0("Received a msg from the socket"); + DEBUG1("Received a msg from the socket kind:%s", + e_gras_msg_kind_names[msg.kind]); } CATCH(e) { RETHROW1("Error caught while receiving a message on select()ed socket %p: %s", @@ -447,7 +449,8 @@ gras_msg_handle(double timeOut) { } else { /* select timeouted, and no timer elapsed. Nothing to do */ - THROW0(timeout_error, 0, "No new message or timer"); + THROW1(timeout_error, 0, "No new message or timer (delay was %f)", + timeOut); } } @@ -471,38 +474,47 @@ gras_msg_handle(double timeOut) { ctx.ID = msg.ID; ctx.msgtype = msg.type; - switch (msg.type->kind) { + switch (msg.kind) { case e_gras_msg_kind_oneway: case e_gras_msg_kind_rpccall: + ran_ok=0; TRY { xbt_dynar_foreach(list->cbs,cpt,cb) { - VERB3("Use the callback #%d (@%p) for incomming msg %s", - cpt+1,cb,msg.type->name); - if ((*cb)(&ctx,msg.payl)) { - /* cb handled the message */ - free(msg.payl); - return; + if (!ran_ok) { + VERB3("Use the callback #%d (@%p) for incomming msg %s", + cpt+1,cb,msg.type->name); + if ((*cb)(&ctx,msg.payl)) { + /* cb handled the message */ + free(msg.payl); + ran_ok = 1; + } } } } CATCH(e) { + free(msg.payl); if (msg.type->kind == e_gras_msg_kind_rpccall) { /* The callback raised an exception, propagate it on the network */ - e.host = (char*)gras_os_myname(); -#ifdef HAVE_EXECINFO_H - e.bt_strings = backtrace_symbols (e.bt, e.used); -#endif - gras_msg_send_ext(msg.expe, e_gras_msg_kind_rpcerror , msg.ID, msg.type, &e); - e.host = NULL; - INFO2("RPC callback raised an exception, which were propagated back to %s:%d", - gras_socket_peer_name(msg.expe), gras_socket_peer_port(msg.expe)); + if (!e.remote) { /* the exception is born on this machine */ + e.host = (char*)gras_os_myname(); + xbt_ex_setup_backtrace(&e); + } + VERB4("Propagate %s exception from '%s' RPC cb back to %s:%d", + (e.remote ? "remote" : "local"), + msg.type->name, + gras_socket_peer_name(msg.expe), + gras_socket_peer_port(msg.expe)); + gras_msg_send_ext(msg.expe, e_gras_msg_kind_rpcerror, + msg.ID, msg.type, &e); xbt_ex_free(e); - return; + ran_ok=1; + } else { + RETHROW0("Callback raised an exception: %s"); } - RETHROW; } + if (!ran_ok) + THROW1(mismatch_error,0, + "Message '%s' refused by all registered callbacks", msg.type->name); /* FIXME: gras_datadesc_free not implemented => leaking the payload */ - THROW1(mismatch_error,0, - "Message '%s' refused by all registered callbacks", msg.type->name); break; @@ -518,7 +530,7 @@ gras_msg_handle(double timeOut) { default: THROW1(unknown_error,0, - "Cannot handle messages of kind %d yet",msg.type->kind); + "Cannot handle messages of kind %d yet",msg.type->kind); } }