1 //////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
4 // Software License, Version 1.0. (See accompanying file
5 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/interprocess for documentation.
8 //
9 //////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef BOOST_INTERPROCESS_EXCEPTIONS_HPP
12 #define BOOST_INTERPROCESS_EXCEPTIONS_HPP
13 
14 #ifndef BOOST_CONFIG_HPP
15 #  include <boost/config.hpp>
16 #endif
17 #
18 #if defined(BOOST_HAS_PRAGMA_ONCE)
19 #  pragma once
20 #endif
21 
22 #include <boost/interprocess/detail/config_begin.hpp>
23 #include <boost/interprocess/detail/workaround.hpp>
24 #include <boost/interprocess/errors.hpp>
25 #include <stdexcept>
26 
27 //!\file
28 //!Describes exceptions thrown by interprocess classes
29 
30 namespace boost {
31 
32 namespace interprocess {
33 
34 //!This class is the base class of all exceptions
35 //!thrown by boost::interprocess
36 class BOOST_SYMBOL_VISIBLE interprocess_exception : public std::exception
37 {
38    public:
interprocess_exception(const char * err)39    interprocess_exception(const char *err)
40       :  m_err(other_error)
41    {
42       try   {  m_str = err; }
43       catch (...) {}
44    }
45 
interprocess_exception(const error_info & err_info,const char * str=0)46    interprocess_exception(const error_info &err_info, const char *str = 0)
47       :  m_err(err_info)
48    {
49       try{
50          if(m_err.get_native_error() != 0){
51             fill_system_message(m_err.get_native_error(), m_str);
52          }
53          else if(str){
54             m_str = str;
55          }
56          else{
57             m_str = "boost::interprocess_exception::library_error";
58          }
59       }
60       catch(...){}
61    }
62 
~interprocess_exception()63    virtual ~interprocess_exception() BOOST_NOEXCEPT_OR_NOTHROW {}
64 
what() const65    virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
66    {  return m_str.c_str();  }
67 
get_native_error() const68    native_error_t get_native_error()const { return m_err.get_native_error(); }
69 
70    // Note: a value of other_error implies a library (rather than system) error
get_error_code() const71    error_code_t   get_error_code()  const { return m_err.get_error_code(); }
72 
73    #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
74    private:
75    error_info        m_err;
76    std::string       m_str;
77    #endif   //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
78 };
79 
80 //!This is the exception thrown by shared interprocess_mutex family when a deadlock situation
81 //!is detected or when using a interprocess_condition the interprocess_mutex is not locked
82 class BOOST_SYMBOL_VISIBLE lock_exception : public interprocess_exception
83 {
84    public:
lock_exception()85    lock_exception()
86       :  interprocess_exception(lock_error)
87    {}
88 
what() const89    virtual const char* what() const BOOST_NOEXCEPT_OR_NOTHROW
90    {  return "boost::interprocess::lock_exception";  }
91 };
92 
93 
94 //!This exception is thrown when a memory request can't be
95 //!fulfilled.
96 class BOOST_SYMBOL_VISIBLE bad_alloc : public interprocess_exception
97 {
98  public:
bad_alloc()99    bad_alloc() : interprocess_exception("::boost::interprocess::bad_alloc"){}
what() const100    virtual const char* what() const BOOST_NOEXCEPT_OR_NOTHROW
101       {  return "boost::interprocess::bad_alloc";  }
102 };
103 
104 }  // namespace interprocess {
105 
106 }  // namespace boost
107 
108 #include <boost/interprocess/detail/config_end.hpp>
109 
110 #endif // BOOST_INTERPROCESS_EXCEPTIONS_HPP
111