| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | // 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 <cassert>#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;                                    \   assert(_check_result == MPI_SUCCESS);                                \   if (_check_result != MPI_SUCCESS)                                    \     boost::throw_exception(boost::mpi::exception(#MPIFunc,   \                                                             _check_result)); \ }} } // end namespace boost::mpi#endif // BOOST_MPI_EXCEPTION_HPP
 |