Skip to content

Commit 63d338d

Browse files
committed
Detect unread MPI messages
1 parent 32d76a7 commit 63d338d

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

tasks/mpi/runner.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,34 @@
33
#include <boost/mpi/communicator.hpp>
44
#include <boost/mpi/environment.hpp>
55

6+
class UnreadMessagesDetector : public ::testing::EmptyTestEventListener {
7+
public:
8+
UnreadMessagesDetector(boost::mpi::communicator world) : world_(std::move(world)) {}
9+
10+
void OnTestEnd(const ::testing::TestInfo& test_info) override {
11+
world_.barrier();
12+
if (const auto status = world_.iprobe(boost::mpi::any_source, boost::mpi::any_tag)) {
13+
fprintf(stderr,
14+
"[ PROCESS %d ] [ FAILED ] %s.%s: MPI message queue has an unread message from %d with tag %d\n",
15+
world_.rank(), test_info.test_suite_name(), test_info.name(), status->source(), status->tag());
16+
exit(2);
17+
}
18+
world_.barrier();
19+
}
20+
21+
private:
22+
boost::mpi::communicator world_;
23+
};
24+
625
int main(int argc, char** argv) {
726
boost::mpi::environment env(argc, argv);
827
boost::mpi::communicator world;
28+
929
::testing::InitGoogleTest(&argc, argv);
10-
::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
30+
auto& listeners = ::testing::UnitTest::GetInstance()->listeners();
1131
if (world.rank() != 0) {
1232
delete listeners.Release(listeners.default_result_printer());
1333
}
34+
listeners.Append(new UnreadMessagesDetector(world));
1435
return RUN_ALL_TESTS();
1536
}

0 commit comments

Comments
 (0)