From: mquinson Date: Wed, 29 Nov 2006 23:45:49 +0000 (+0000) Subject: In gras_msg_handle, do not discard messages without callback: they are probably messa... X-Git-Tag: v3.3~2417 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9d6799cde35ff2d3c7659889fa4f28721fcd094d?ds=inline In gras_msg_handle, do not discard messages without callback: they are probably messages to be explicitly awaited later. ie, proofs of mis-synchronization in userland since they are sent before being awaited. No big deal usually git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2942 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/ChangeLog b/ChangeLog index d6fec5a1d9..018196ae7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,10 @@ SimGrid (3.1.1) unstable; urgency=low enough so that they can all get received in one shoot. * gras_datadesc_by_name and gras_msgtype_by_name: now raise an exception if not found. Use the *_or_null() variant for the old semantic. + * In gras_msg_handle, do not discard messages without callback. + They are probably messages to be explicitly awaited later (ie, proofs of + mis-synchronization in userland since they are sent before being awaited) + No big deal usually AMOK: * Do really rename the hostmanagement module to peermanagement. [Mt] diff --git a/src/gras/Msg/msg.c b/src/gras/Msg/msg.c index a041dba75b..d8b6dc9b33 100644 --- a/src/gras/Msg/msg.c +++ b/src/gras/Msg/msg.c @@ -35,9 +35,10 @@ static void *gras_msg_procdata_new() { res->name = xbt_strdup("gras_msg"); res->name_len = 0; - res->msg_queue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL); - res->cbl_list = xbt_dynar_new(sizeof(gras_cblist_t *),gras_cbl_free); - res->timers = xbt_dynar_new(sizeof(s_gras_timer_t), NULL); + res->msg_queue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL); + res->msg_waitqueue = xbt_dynar_new(sizeof(s_gras_msg_t), NULL); + res->cbl_list = xbt_dynar_new(sizeof(gras_cblist_t *),gras_cbl_free); + res->timers = xbt_dynar_new(sizeof(s_gras_timer_t), NULL); return (void*)res; } @@ -49,6 +50,7 @@ static void gras_msg_procdata_free(void *data) { gras_msg_procdata_t res = (gras_msg_procdata_t)data; xbt_dynar_free(&( res->msg_queue )); + xbt_dynar_free(&( res->msg_waitqueue )); xbt_dynar_free(&( res->cbl_list )); xbt_dynar_free(&( res->timers )); @@ -317,6 +319,19 @@ gras_msg_wait_ext(double timeout, start = gras_os_time(); VERB1("Waiting for message '%s'",msgt_want?msgt_want->name:"(any)"); + xbt_dynar_foreach(pd->msg_waitqueue,cpt,msg){ + if ( ( !msgt_want || (msg.type->code == msgt_want->code)) + && (!expe_want || (!strcmp( gras_socket_peer_name(msg.expe), + gras_socket_peer_name(expe_want)))) + && (!filter || filter(&msg,filter_ctx))) { + + memcpy(msg_got,&msg,sizeof(s_gras_msg_t)); + xbt_dynar_cursor_rm(pd->msg_waitqueue, &cpt); + VERB0("The waited message was queued"); + return; + } + } + xbt_dynar_foreach(pd->msg_queue,cpt,msg){ if ( ( !msgt_want || (msg.type->code == msgt_want->code)) && (!expe_want || (!strcmp( gras_socket_peer_name(msg.expe), @@ -636,11 +651,11 @@ gras_msg_handle(double timeOut) { } } if (!list) { - INFO3("No callback for the incomming '%s' message (from %s:%d). Discarded.", + INFO3("No callback for message '%s' from %s:%d. Queue it for later gras_msg_wait() use.", msg.type->name, gras_socket_peer_name(msg.expe),gras_socket_peer_port(msg.expe)); - WARN0("FIXME: gras_datadesc_free not implemented => leaking the payload"); - return; + xbt_dynar_push(pd->msg_waitqueue,&msg); + return; /* FIXME: maybe we should call ourselves again until the end of the timer or a proper msg is got */ } ctx.expeditor = msg.expe;