Throw exception with more helpful error message when shmctl fails

This commit is contained in:
Patrick Niklaus 2017-01-13 15:56:36 +00:00 committed by Patrick Niklaus
parent 71044e88f3
commit dbd70d4884

View File

@ -111,10 +111,35 @@ class SharedMemory
{ {
auto shmid = shm.get_shmid(); auto shmid = shm.get_shmid();
::shmid_ds xsi_ds; ::shmid_ds xsi_ds;
const auto errorToMessage = [](int error) -> std::string {
switch (error)
{
case EPERM:
return "EPERM";
break;
case EACCES:
return "ACCESS";
break;
case EINVAL:
return "EINVAL";
break;
case EFAULT:
return "EFAULT";
break;
default:
return "Unknown Error " + std::to_string(error);
break;
}
};
do do
{ {
int ret = ::shmctl(shmid, IPC_STAT, &xsi_ds); int ret = ::shmctl(shmid, IPC_STAT, &xsi_ds);
(void)ret; // no unused warning if (ret < 0)
{
throw util::exception("shmctl encountered an error: " + errorToMessage(ret) +
SOURCE_REF);
}
BOOST_ASSERT(ret >= 0); BOOST_ASSERT(ret >= 0);
std::this_thread::sleep_for(std::chrono::microseconds(100)); std::this_thread::sleep_for(std::chrono::microseconds(100));