From 3d691a3aece5c7359af6ebe25912ffc108b5a9fc Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Tue, 27 May 2014 18:14:43 +0200 Subject: [PATCH] implements #947, free osrm-datastore's shared memory --- Util/DataStoreOptions.h | 11 +++++++--- datastore.cpp | 45 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/Util/DataStoreOptions.h b/Util/DataStoreOptions.h index 0a45d105b..7a76bfb6a 100644 --- a/Util/DataStoreOptions.h +++ b/Util/DataStoreOptions.h @@ -43,12 +43,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include // generate boost::program_options object for the routing part -inline bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerPaths &paths) +inline bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerPaths &paths, bool & springclean) { // declare a group of options that will be allowed only on command line boost::program_options::options_description generic_options("Options"); - generic_options.add_options()("version,v", "Show version")("help,h", "Show this help message")( - "config,c", + generic_options.add_options()("version,v", "Show version")("help,h", "Show this help message") + ("springclean,s", "Remove all regions in shared memory")("config,c", boost::program_options::value(&paths["config"]) ->default_value("server.ini"), "Path to a configuration file"); @@ -122,6 +122,11 @@ inline bool GenerateDataStoreOptions(const int argc, const char *argv[], ServerP return false; } + if (option_variables.count("springclean")) + { + springclean = true; + return true; + } boost::program_options::notify(option_variables); const bool parameter_present = (paths.find("hsgrdata") != paths.end() && diff --git a/datastore.cpp b/datastore.cpp index 41e9fa780..a32276da6 100644 --- a/datastore.cpp +++ b/datastore.cpp @@ -89,10 +89,53 @@ int main(const int argc, const char *argv[]) SimpleLogger().Write(logDEBUG) << "Checking input parameters"; ServerPaths server_paths; - if (!GenerateDataStoreOptions(argc, argv, server_paths)) + bool springclean = false; + if (!GenerateDataStoreOptions(argc, argv, server_paths, springclean)) { return 0; } + if (springclean) + { + SimpleLogger().Write() << "spring-cleaning all shared memory regions"; + // find all existing shmem regions and remove them. + if (SharedMemory::RegionExists(DATA_1)) + { + if (!SharedMemory::Remove(DATA_1)) + { + SimpleLogger().Write(logWARNING) << "could not delete DATA_1"; + } + } + if (SharedMemory::RegionExists(LAYOUT_1)) + { + if (!SharedMemory::Remove(LAYOUT_1)) + { + SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_1"; + } + } + if (SharedMemory::RegionExists(DATA_2)) + { + if (!SharedMemory::Remove(DATA_2)) + { + SimpleLogger().Write(logWARNING) << "could not delete DATA_2"; + } + } + if (SharedMemory::RegionExists(LAYOUT_2)) + { + if (!SharedMemory::Remove(LAYOUT_2)) + { + SimpleLogger().Write(logWARNING) << "could not delete LAYOUT_2"; + } + } + if (SharedMemory::RegionExists(CURRENT_REGIONS)) + { + if (!SharedMemory::Remove(CURRENT_REGIONS)) + { + SimpleLogger().Write(logWARNING) << "could not delete CURRENT_REGIONS"; + } + } + return 0; + } + if (server_paths.find("hsgrdata") == server_paths.end()) { throw OSRMException("no hsgr file found");