105 lines
3.1 KiB
C++
105 lines
3.1 KiB
C++
|
// 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
|