/*
* BoostErrors.cpp
*
* Copyright (C) 2009-12 by RStudio, PBC
*
* Unless you have received this program directly from RStudio pursuant
* to the terms of a commercial license agreement with RStudio, then
* this program is licensed to you under the terms of version 3 of the
* GNU Affero General Public License. This program is distributed WITHOUT
* ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
* AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
*
*/
#include
#include
// we define BOOST_USE_WINDOWS_H on mingw64 to work around some
// incompatabilities. however, this prevents the interprocess headers
// from compiling so we undef it in this localized context
#if defined(__GNUC__) && defined(_WIN64)
#undef BOOST_USE_WINDOWS_H
#endif
#include
#include
using namespace boost::system ;
namespace RSTUDIO_BOOST_NAMESPACE {
namespace interprocess {
class interprocess_error_category : public error_category
{
public:
const char* name() const BOOST_NOEXCEPT;
std::string message(int ev) const ;
};
const error_category& interprocess_category()
{
static interprocess_error_category interprocessCategoryConst ;
return interprocessCategoryConst ;
}
const char* interprocess_error_category::name() const BOOST_NOEXCEPT
{
return "interprocess" ;
}
std::string interprocess_error_category::message(int ev) const
{
std::string message ;
switch (ev)
{
case no_error:
message = "No error";
break;
case system_error:
message = "System error";
break;
case other_error:
message = "Library generated error";
break;
case security_error:
message = "Security error";
break;
case read_only_error:
message = "Read only error";
break;
case io_error:
message = "IO error";
break;
case path_error:
message = "Path error";
break;
case not_found_error:
message = "Not found error";
break;
case busy_error:
message = "Busy error" ;
break;
case already_exists_error:
message = "Already exists error";
break;
case not_empty_error:
message = "Not empty error";
break;
case is_directory_error:
message = "Is directory error";
break;
case out_of_space_error:
message = "Out of space error";
break;
case out_of_memory_error:
message = "Out of memory error";
break;
case out_of_resource_error:
message = "Out of resource error" ;
break;
case lock_error:
message = "Lock error" ;
break ;
case sem_error:
message = "Sem error" ;
break ;
case mode_error:
message = "Mode error" ;
break;
case size_error:
message = "Size error" ;
break;
case corrupted_error:
message = "Corrupted error" ;
break ;
default:
message = "Unknown error" ;
break;
}
return message ;
}
boost::system::error_code ec_from_exception(const interprocess_exception& e)
{
if (e.get_error_code() == system_error)
return error_code(e.get_native_error(), system_category()) ;
else
return error_code(e.get_error_code(), interprocess_category()) ;
}
} // namespace interprocess
// thread_error
namespace thread_error {
namespace errc {
enum errc_t {
thread_resource_error = 1
};
} // namespace thread_errc
class thread_error_category : public error_category
{
public:
const char* name() const BOOST_NOEXCEPT;
std::string message(int ev) const ;
};
const error_category& thread_category()
{
static thread_error_category threadCategoryConst ;
return threadCategoryConst ;
}
const char* thread_error_category::name() const BOOST_NOEXCEPT
{
return "thread" ;
}
std::string thread_error_category::message(int ev) const
{
std::string message ;
switch (ev)
{
// only one error code for now
case errc::thread_resource_error:
default:
message = "Thread resource error" ;
break ;
}
return message ;
}
boost::system::error_code ec_from_exception(
const boost::thread_resource_error& e)
{
return error_code(errc::thread_resource_error, thread_category()) ;
}
} // namespace thread_error
} // namespace boost