From 4ed2ded99f037e413c9008a324c85f8f95611bb5 Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 8 Feb 2011 15:24:18 +0100 Subject: [PATCH 1/1] Check if communications are successfull. --- TODO | 3 --- communicator.cpp | 29 ++++++++++++++++++----------- communicator.h | 4 +++- simgrid_features.h | 8 ++++++++ 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/TODO b/TODO index 640fb9e..6fa956a 100644 --- a/TODO +++ b/TODO @@ -2,9 +2,6 @@ -> c'est stupide d'attendre la fin des calcules s'il y en a beaucoup surtout en bookkeeping... -* check if communications can fail ! - (restart them) - * review receive with timeout. * verify bookkeeping version. diff --git a/communicator.cpp b/communicator.cpp index 1da6def..1bf16cd 100644 --- a/communicator.cpp +++ b/communicator.cpp @@ -137,20 +137,12 @@ void communicator::flush(bool wait) std::copy(sent_comm.begin(), sent_comm.end(), comms); MSG_comm_waitall(comms, sent_comm.size(), -1.0); if (!MSG_WAIT_DESTROYS_COMMS) - std::for_each(sent_comm.begin(), sent_comm.end(), MSG_comm_destroy); + std::for_each(sent_comm.begin(), sent_comm.end(), + comm_check_n_destroy); sent_comm.clear(); } } -bool communicator::comm_test_n_destroy(msg_comm_t comm) -{ - if (MSG_comm_test(comm)) { - MSG_comm_destroy(comm); - return true; - } else - return false; -} - int communicator::receiver_wrapper(int, char* []) { communicator* comm; @@ -168,7 +160,7 @@ int communicator::receiver_wrapper(int, char* []) void communicator::receiver1(msg_comm_t& comm, m_task_t& task, const char* mbox) { - MSG_comm_destroy(comm); + comm_check_n_destroy(comm); if (strcmp(MSG_task_get_name(task), "finalize")) { XBT_DEBUG("received message on %s", mbox); xbt_mutex_acquire(receiver_mutex); @@ -215,6 +207,21 @@ void communicator::receiver() xbt_dynar_free(&comms); } +void communicator::comm_check_n_destroy(msg_comm_t comm) +{ + xbt_assert(MSG_comm_get_status(comm) == MSG_OK); + MSG_comm_destroy(comm); +} + +bool communicator::comm_test_n_destroy(msg_comm_t comm) +{ + if (MSG_comm_test(comm)) { + comm_check_n_destroy(comm); + return true; + } else + return false; +} + // Local variables: // mode: c++ // End: diff --git a/communicator.h b/communicator.h index efd0fb7..091594f 100644 --- a/communicator.h +++ b/communicator.h @@ -71,7 +71,9 @@ private: void receiver1(msg_comm_t& comm, m_task_t& task, const char* mbox); void receiver(); - // Used to test if a communication is over, and to destroy it if it is + // Used to chek if a communication is successfull before destroying it + static void comm_check_n_destroy(msg_comm_t comm); + // If comm is over, call comm_check_n_destroy(comm), and return true static bool comm_test_n_destroy(msg_comm_t comm); }; diff --git a/simgrid_features.h b/simgrid_features.h index 56fcbfb..75a1521 100644 --- a/simgrid_features.h +++ b/simgrid_features.h @@ -6,12 +6,20 @@ * * MSG_WAIT_DESTROYS_COMMS 1 if MSG_wait destroys communications * (has changed after SimGrid 3.5) + * + * MSG_comm_get_status(comm) MSG_OK on SG 3.5 where it does not exist. */ #if !defined(SIMGRID_VERSION) // ========== SimGrid <= 3.5 ============= // #define MSG_WAIT_DESTROYS_COMMS 1 +inline +MSG_error_t MSG_comm_get_status(msg_comm_t /*comm*/) +{ + return MSG_OK; +} + #else // ================================= SimGrid > 3.5 ============== // #define MSG_WAIT_DESTROYS_COMMS 0 -- 2.39.5