| // Copyright (C) 2005-2006 Douglas Gregor <doug.gregor -at- gmail.com>. |
| |
| // Use, modification and distribution is subject to the Boost Software |
| // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| /** @file exception.hpp |
| * |
| * This header provides exception classes that report MPI errors to |
| * the user and macros that translate MPI error codes into Boost.MPI |
| * exceptions. |
| */ |
| #ifndef BOOST_MPI_EXCEPTION_HPP |
| #define BOOST_MPI_EXCEPTION_HPP |
| |
| #include <boost/mpi/config.hpp> |
| #include <exception> |
| #include <string> |
| #include <boost/config.hpp> |
| #include <boost/throw_exception.hpp> |
| |
| namespace boost { namespace mpi { |
| |
| /** @brief Catch-all exception class for MPI errors. |
| * |
| * Instances of this class will be thrown when an MPI error |
| * occurs. MPI failures that trigger these exceptions may or may not |
| * be recoverable, depending on the underlying MPI |
| * implementation. Consult the documentation for your MPI |
| * implementation to determine the effect of MPI errors. |
| */ |
| class BOOST_MPI_DECL exception : public std::exception |
| { |
| public: |
| /** |
| * Build a new @c exception exception. |
| * |
| * @param routine The MPI routine in which the error |
| * occurred. This should be a pointer to a string constant: it |
| * will not be copied. |
| * |
| * @param result_code The result code returned from the MPI |
| * routine that aborted with an error. |
| */ |
| exception(const char* routine, int result_code); |
| |
| virtual ~exception() throw(); |
| |
| /** |
| * A description of the error that occurred. |
| */ |
| virtual const char * what () const throw () |
| { |
| return this->message.c_str(); |
| } |
| |
| /** Retrieve the name of the MPI routine that reported the error. */ |
| const char* routine() const { return routine_; } |
| |
| /** |
| * @brief Retrieve the result code returned from the MPI routine |
| * that reported the error. |
| */ |
| int result_code() const { return result_code_; } |
| |
| /** |
| * @brief Returns the MPI error class associated with the error that |
| * triggered this exception. |
| */ |
| int error_class() const |
| { |
| int result; |
| MPI_Error_class(result_code_, &result); |
| return result; |
| } |
| |
| protected: |
| /// The MPI routine that triggered the error |
| const char* routine_; |
| |
| /// The failed result code reported by the MPI implementation. |
| int result_code_; |
| |
| /// The formatted error message |
| std::string message; |
| }; |
| |
| /** |
| * Call the MPI routine MPIFunc with arguments Args (surrounded by |
| * parentheses). If the result is not MPI_SUCCESS, use |
| * boost::throw_exception to throw an exception or abort, depending on |
| * BOOST_NO_EXCEPTIONS. |
| */ |
| #define BOOST_MPI_CHECK_RESULT( MPIFunc, Args ) \ |
| { \ |
| int _check_result = MPIFunc Args; \ |
| if (_check_result != MPI_SUCCESS) \ |
| boost::throw_exception(boost::mpi::exception(#MPIFunc, \ |
| _check_result)); \ |
| } |
| |
| } } // end namespace boost::mpi |
| |
| #endif // BOOST_MPI_EXCEPTION_HPP |