Blame view

3rdparty/boost_1_81_0/boost/mpi/exception.hpp 3.16 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  // 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