osrm-backend/src/engine/engine.cpp

129 lines
3.7 KiB
C++
Raw Normal View History

#include "engine/engine.hpp"
#include "engine/engine_config.hpp"
2016-01-28 10:28:44 -05:00
#include "engine/api/route_parameters.hpp"
#include "engine/status.hpp"
//#include "engine/plugins/distance_table.hpp"
//#include "engine/plugins/hello_world.hpp"
//#include "engine/plugins/nearest.hpp"
//#include "engine/plugins/timestamp.hpp"
//#include "engine/plugins/trip.hpp"
2016-01-02 11:13:44 -05:00
#include "engine/plugins/viaroute.hpp"
2016-01-28 10:28:44 -05:00
//#include "engine/plugins/match.hpp"
//#include "engine/plugins/tile.hpp"
2016-01-02 11:13:44 -05:00
#include "engine/datafacade/datafacade_base.hpp"
#include "engine/datafacade/internal_datafacade.hpp"
#include "engine/datafacade/shared_datafacade.hpp"
#include "storage/shared_barriers.hpp"
2016-01-02 11:13:44 -05:00
#include "util/make_unique.hpp"
#include "util/routed_options.hpp"
#include "util/simple_logger.hpp"
2015-01-27 10:35:19 -05:00
#include <boost/assert.hpp>
#include <boost/interprocess/sync/named_condition.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
2016-02-17 07:52:51 -05:00
#include <boost/thread/lock_types.hpp>
2015-01-27 10:35:19 -05:00
#include <algorithm>
#include <fstream>
#include <utility>
#include <vector>
2016-01-05 10:51:13 -05:00
namespace osrm
{
namespace engine
{
2016-01-28 10:28:44 -05:00
// Abstracted away the query locking into a template function
// Works the same for every plugin.
template<typename ParameterT, typename PluginT>
Status RunQuery(const std::unique_ptr<Engine::EngineLock> &lock,
datafacade::BaseDataFacade &facade,
const ParameterT &parameters,
PluginT &plugin,
util::json::Object &json_result)
{
if (!lock)
{
return plugin.HandleRequest(parameters, json_result);
}
BOOST_ASSERT(lock);
lock->IncreaseQueryCount();
auto& shared_facade = static_cast<datafacade::SharedDataFacade &>(facade);
shared_facade.CheckAndReloadFacade();
// 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{shared_facade.data_mutex};
Status status = plugin.HandleRequest(parameters, json_result);
lock->DecreaseQueryCount();
return status;
}
Engine::Engine(EngineConfig &config)
2015-01-27 10:35:19 -05:00
{
if (config.use_shared_memory)
2015-01-27 10:35:19 -05:00
{
2016-01-28 10:28:44 -05:00
lock = util::make_unique<EngineLock>();
query_data_facade = util::make_unique<datafacade::SharedDataFacade>();
2015-01-27 10:35:19 -05:00
}
else
{
// populate base path
util::populate_base_path(config.server_paths);
2016-01-28 10:28:44 -05:00
query_data_facade = util::make_unique<datafacade::InternalDataFacade>(config.server_paths);
2015-01-27 10:35:19 -05:00
}
2016-01-28 10:28:44 -05:00
route_plugin = util::make_unique<plugins::ViaRoutePlugin>(*query_data_facade, config.max_locations_viaroute);
2015-01-27 10:35:19 -05:00
}
2016-01-28 10:28:44 -05:00
Status Engine::Route(const api::RouteParameters &route_parameters,
util::json::Object &result)
2015-01-27 10:35:19 -05:00
{
2016-01-28 10:28:44 -05:00
return RunQuery(lock, *query_data_facade, route_parameters, *route_plugin, result);
2015-01-27 10:35:19 -05:00
}
// decrease number of concurrent queries
2016-01-28 10:28:44 -05:00
void Engine::EngineLock::DecreaseQueryCount()
2015-01-27 10:35:19 -05:00
{
// lock query
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> query_lock(
2016-01-28 10:28:44 -05:00
barrier.query_mutex);
2015-01-27 10:35:19 -05:00
// decrement query count
2016-01-28 10:28:44 -05:00
--(barrier.number_of_queries);
BOOST_ASSERT_MSG(0 <= barrier.number_of_queries, "invalid number of queries");
2015-01-27 10:35:19 -05:00
// notify all processes that were waiting for this condition
2016-01-28 10:28:44 -05:00
if (0 == barrier.number_of_queries)
2015-01-27 10:35:19 -05:00
{
2016-01-28 10:28:44 -05:00
barrier.no_running_queries_condition.notify_all();
2015-01-27 10:35:19 -05:00
}
}
// increase number of concurrent queries
2016-01-28 10:28:44 -05:00
void Engine::EngineLock::IncreaseQueryCount()
2015-01-27 10:35:19 -05:00
{
// lock update pending
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> pending_lock(
2016-01-28 10:28:44 -05:00
barrier.pending_update_mutex);
2015-01-27 10:35:19 -05:00
// lock query
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> query_lock(
2016-01-28 10:28:44 -05:00
barrier.query_mutex);
2015-01-27 10:35:19 -05:00
// unlock update pending
pending_lock.unlock();
// increment query count
2016-01-28 10:28:44 -05:00
++(barrier.number_of_queries);
2015-01-27 10:35:19 -05:00
}
2016-01-05 10:51:13 -05:00
}
}