diff --git a/fairmq/plugins/config/Config.cxx b/fairmq/plugins/config/Config.cxx index 987b5752..df681d76 100644 --- a/fairmq/plugins/config/Config.cxx +++ b/fairmq/plugins/config/Config.cxx @@ -71,6 +71,7 @@ Plugin::ProgOptions ConfigPluginProgramOptions() ("shm-zero-segment", po::value()->default_value(false), "Shared memory: zero the shared memory segment memory after initialization.") ("shm-throw-bad-alloc", po::value()->default_value(true), "Throw a fair::mq::MessageBadAlloc if cannot allocate a message (retry if false).") ("shm-monitor", po::value()->default_value(true), "Shared memory: run monitor daemon.") + ("shm-no-cleanup", po::value()->default_value(false), "Shared memory: do not cleanup the memory when last device leaves.") ("ofi-size-hint", po::value()->default_value(0), "EXPERIMENTAL: OFI size hint for the allocator.") ("rate", po::value()->default_value(0.), "Rate for conditional run loop (Hz).") ("session", po::value()->default_value("default"), "Session name.") diff --git a/fairmq/shmem/Manager.h b/fairmq/shmem/Manager.h index 2463a488..a9b10732 100644 --- a/fairmq/shmem/Manager.h +++ b/fairmq/shmem/Manager.h @@ -78,6 +78,7 @@ class Manager , fHeartbeatThread() , fSendHeartbeats(true) , fThrowOnBadAlloc(config ? config->GetProperty("shm-throw-bad-alloc", true) : true) + , fNoCleanup(config ? config->GetProperty("shm-no-cleanup", false) : false) { using namespace boost::interprocess; @@ -608,7 +609,7 @@ class Manager (fDeviceCounter->fCount)--; if (fDeviceCounter->fCount == 0) { - LOG(debug) << "Last segment user, removing segment."; + LOG(debug) << "Last segment user, " << (fNoCleanup ? "skipping removal (--shm-no-cleanup is true)." : "removing segment."); lastRemoved = true; } else { LOG(debug) << "Other segment users present (" << fDeviceCounter->fCount << "), skipping removal."; @@ -617,7 +618,7 @@ class Manager LOG(error) << "Manager could not acquire lock: " << e.what(); } - if (lastRemoved) { + if (lastRemoved && !fNoCleanup) { Monitor::Cleanup(ShmId{fShmId}); } } @@ -657,6 +658,7 @@ class Manager std::condition_variable fHeartbeatsCV; bool fThrowOnBadAlloc; + bool fNoCleanup; }; } // namespace fair::mq::shmem