- comm = MSG_task_irecv(&task, peer->me);
- status = MSG_comm_wait(comm, -1);
- xbt_assert(status == MSG_OK, __FILE__ ": peer_wait_for_message() failed");
- MSG_comm_destroy(comm);
-
- done = peer_execute_task(peer, task);
- task_message_delete(task);
- task = NULL;
+ if (comm == NULL)
+ comm = MSG_task_irecv(&task, peer->me);
+
+ if (MSG_comm_test(comm)) {
+ status = MSG_comm_get_status(comm);
+ xbt_assert(status == MSG_OK, __FILE__ ": peer_wait_for_message() failed");
+ MSG_comm_destroy(comm);
+ comm = NULL;
+ done = peer_execute_task(peer, task);
+ task_message_delete(task);
+ task = NULL;
+ } else {
+ MSG_process_sleep(0.01);
+ }