diff --git a/Server/DataStructures/SharedDataFacade.h b/Server/DataStructures/SharedDataFacade.h index c972852f2..0309dcba4 100644 --- a/Server/DataStructures/SharedDataFacade.h +++ b/Server/DataStructures/SharedDataFacade.h @@ -57,12 +57,13 @@ private: typedef typename super::RTreeLeaf RTreeLeaf; typedef typename StaticRTree::TreeNode RTreeNode; - SharedDataLayout * data_layout; - char * shared_memory; - SharedDataType * data_type_ptr; + SharedDataLayout * data_layout; + char * shared_memory; + SharedDataTimestamp * data_timestamp_ptr; SharedDataType CURRENT_LAYOUT; SharedDataType CURRENT_DATA; + unsigned CURRENT_TIMESTAMP; unsigned m_check_sum; unsigned m_number_of_nodes; @@ -191,15 +192,16 @@ private: public: SharedDataFacade( ) { - data_type_ptr = (SharedDataType *)SharedMemoryFactory::Get( + data_timestamp_ptr = (SharedDataTimestamp *)SharedMemoryFactory::Get( CURRENT_REGIONS, - 2*sizeof(SharedDataType), + sizeof(SharedDataTimestamp), false, false )->Ptr(); CURRENT_LAYOUT = LAYOUT_NONE; CURRENT_DATA = DATA_NONE; + CURRENT_TIMESTAMP = 0; //load data CheckAndReloadFacade(); @@ -207,15 +209,17 @@ public: void CheckAndReloadFacade() { if( - CURRENT_LAYOUT != data_type_ptr[0] || - CURRENT_DATA != data_type_ptr[1] + CURRENT_LAYOUT != data_timestamp_ptr->layout || + CURRENT_DATA != data_timestamp_ptr->data || + CURRENT_TIMESTAMP != data_timestamp_ptr->timestamp ) { // release the previous shared memory segments SharedMemory::Remove(CURRENT_LAYOUT); SharedMemory::Remove(CURRENT_DATA); - CURRENT_LAYOUT = data_type_ptr[0]; - CURRENT_DATA = data_type_ptr[1]; + CURRENT_LAYOUT = data_timestamp_ptr->layout; + CURRENT_DATA = data_timestamp_ptr->data; + CURRENT_TIMESTAMP = data_timestamp_ptr->timestamp; m_layout_memory.reset( SharedMemoryFactory::Get(CURRENT_LAYOUT) ); @@ -224,7 +228,10 @@ public: ); boost::filesystem::path ram_index_path(data_layout->ram_index_file_name); if( !boost::filesystem::exists(ram_index_path) ) { - throw OSRMException("no leaf index file given in ini file"); + throw OSRMException( + "no leaf index file given. " + "Is any data loaded into shared memory?" + ); } m_large_memory.reset( SharedMemoryFactory::Get(CURRENT_DATA) ); diff --git a/Server/DataStructures/SharedDataType.h b/Server/DataStructures/SharedDataType.h index d64ff1922..11470c57d 100644 --- a/Server/DataStructures/SharedDataType.h +++ b/Server/DataStructures/SharedDataType.h @@ -220,4 +220,10 @@ enum SharedDataType { DATA_NONE }; +struct SharedDataTimestamp { + SharedDataType layout; + SharedDataType data; + unsigned timestamp; +}; + #endif /* SHARED_DATA_TYPE_H_ */ diff --git a/Util/ProgramOptions.h b/Util/ProgramOptions.h index f7de56217..ec88faabf 100644 --- a/Util/ProgramOptions.h +++ b/Util/ProgramOptions.h @@ -230,7 +230,7 @@ inline bool GenerateServerProgramOptions( boost::program_options::notify(option_variables); } - if( !option_variables.count("sharedmemory") ) { + if( !use_shared_memory ) { if( !option_variables.count("hsgrdata") ) { if( !option_variables.count("base") ) { throw OSRMException("hsgrdata (or base) must be specified");