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() throw(){} 64 what() const65 virtual const char * what() const throw() 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 throw() 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 throw() 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