Adds a shared/exclusive lock around queries and CheckAndReloadFacade.

Without this, it's possible for CheckAndReloadFacade to start working
while a query is still in progress, leading to undefined behaviour.
This commit is contained in:
Daniel Patterson
2016-01-15 00:57:36 -08:00
committed by Patrick Niklaus
parent 80b897d8cf
commit e21eaa4b9e
2 changed files with 73 additions and 42 deletions
+11 -1
View File
@@ -82,8 +82,18 @@ int OSRM::OSRM_impl::RunQuery(const RouteParameters &route_parameters,
return 400;
}
osrm::engine::plugins::BasePlugin::Status return_code;
increase_concurrent_query_count();
auto return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
if (barrier) {
// Get a shared data lock so that other threads won't update
// things while the query is running
boost::shared_lock<boost::shared_mutex> data_lock{
(static_cast<datafacade::SharedDataFacade<contractor::QueryEdge::EdgeData> *>(
query_data_facade))->data_mutex};
return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
} else {
return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
}
decrease_concurrent_query_count();
return static_cast<int>(return_code);
}