X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8787f75c9d14a09fa99c40380a579b2b8372b40a..e759b094e418c94354a054dd0b52034d5cbe3e85:/src/smpi/smpi_receiver.c diff --git a/src/smpi/smpi_receiver.c b/src/smpi/smpi_receiver.c index edfb213e3d..9f4771edaa 100644 --- a/src/smpi/smpi_receiver.c +++ b/src/smpi/smpi_receiver.c @@ -20,6 +20,8 @@ int smpi_receiver(int argc, char **argv) xbt_fifo_item_t request_item; xbt_fifo_item_t message_item; + e_surf_action_state_t state; + self = SIMIX_process_self(); // make sure root is done before own initialization @@ -66,9 +68,13 @@ int smpi_receiver(int argc, char **argv) NULL != message_item; message_item = xbt_fifo_get_next_item(message_item)) { message = xbt_fifo_get_item_content(message_item); - if (request->comm == message->comm && - (MPI_ANY_SOURCE == request->src || request->src == message->src) && - (MPI_ANY_TAG == request->tag || request->tag == message->tag)) { + state = SIMIX_action_get_state(message->action); + if ( + request->comm == message->comm && + (MPI_ANY_SOURCE == request->src || request->src == message->src) && + (MPI_ANY_TAG == request->tag || request->tag == message->tag) && + (state != SURF_ACTION_READY && state != SURF_ACTION_RUNNING) + ) { xbt_fifo_remove_item(request_queue, request_item); xbt_fifo_remove_item(message_queue, message_item); goto stopsearch; @@ -83,6 +89,8 @@ stopsearch: SIMIX_process_suspend(self); } else { + // FIXME: check action status for bad messages + SIMIX_mutex_lock(request->mutex); memcpy(request->buf, message->buf, request->datatype->size * request->count); request->src = message->src;