Replace shmctl with waiting on all on-Linux platforms

This commit is contained in:
Patrick Niklaus 2017-01-13 21:33:32 +00:00 committed by Patrick Niklaus
parent dbd70d4884
commit 70e899378d

View File

@ -107,6 +107,7 @@ class SharedMemory
return Remove(key); return Remove(key);
} }
#ifdef __linux__
void WaitForDetach() void WaitForDetach()
{ {
auto shmid = shm.get_shmid(); auto shmid = shm.get_shmid();
@ -134,10 +135,12 @@ class SharedMemory
do do
{ {
// On OSX this returns EINVAL for whatever reason, hence we need to disable it
int ret = ::shmctl(shmid, IPC_STAT, &xsi_ds); int ret = ::shmctl(shmid, IPC_STAT, &xsi_ds);
if (ret < 0) if (ret < 0)
{ {
throw util::exception("shmctl encountered an error: " + errorToMessage(ret) + auto error_code = errno;
throw util::exception("shmctl encountered an error: " + errorToMessage(error_code) +
SOURCE_REF); SOURCE_REF);
} }
BOOST_ASSERT(ret >= 0); BOOST_ASSERT(ret >= 0);
@ -145,6 +148,15 @@ class SharedMemory
std::this_thread::sleep_for(std::chrono::microseconds(100)); std::this_thread::sleep_for(std::chrono::microseconds(100));
} while (xsi_ds.shm_nattch > 1); } while (xsi_ds.shm_nattch > 1);
} }
#else
void WaitForDetach()
{
util::Log(logWARNING)
<< "Shared memory support for non-Linux systems does not wait for clients to "
"dettach. Going to sleep for 50ms.";
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
#endif
private: private:
static bool RegionExists(const boost::interprocess::xsi_key &key) static bool RegionExists(const boost::interprocess::xsi_key &key)