Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2018-03-13 17:02:26 +0300
committerTatiana Yan <tatiana.kondakova@gmail.com>2018-03-14 13:08:01 +0300
commit5232a439705a46f3da6d11c074529cb586bb1a5a (patch)
treeee4d13c0c010f822f61fbe6f5512e44ebfc10ac4 /routing
parent679b83cc72c9988dc4c8e7f8c39442c2cc39b35e (diff)
Getting rid of RoutingSession::GetRoute() which break m_route protection with mutex.
Diffstat (limited to 'routing')
-rw-r--r--routing/routing_session.cpp17
-rw-r--r--routing/routing_session.hpp5
-rw-r--r--routing/routing_tests/routing_session_test.cpp7
3 files changed, 14 insertions, 15 deletions
diff --git a/routing/routing_session.cpp b/routing/routing_session.cpp
index d1ace09a41..f5806c57e2 100644
--- a/routing/routing_session.cpp
+++ b/routing/routing_session.cpp
@@ -528,7 +528,8 @@ void RoutingSession::SetRoutingSettings(RoutingSettings const & routingSettings)
m_routingSettings = routingSettings;
}
-void RoutingSession::SetReadyCallbacks(TReadyCallback const & buildReadyCallback, TReadyCallback const & rebuildReadyCallback)
+void RoutingSession::SetReadyCallbacks(TReadyCallback const & buildReadyCallback,
+ TReadyCallback const & rebuildReadyCallback)
{
m_buildReadyCallback = buildReadyCallback;
// m_rebuildReadyCallback used from multiple threads but it's the only place we write m_rebuildReadyCallback
@@ -619,6 +620,13 @@ double RoutingSession::GetDistanceToCurrentCamM(SpeedCameraRestriction & camera,
return kInvalidSpeedCameraDistance;
}
+void RoutingSession::ProtectedCall(RouteCallback const & callback) const
+{
+ threads::MutexGuard guard(m_routingSessionMutex);
+ CHECK(m_route, ());
+ callback(*m_route);
+}
+
void RoutingSession::EmitCloseRoutingEvent() const
{
threads::MutexGuard guard(m_routingSessionMutex);
@@ -663,13 +671,6 @@ bool RoutingSession::GetRouteAltitudesAndDistancesM(vector<double> & routeSegDis
return true;
}
-shared_ptr<Route> const RoutingSession::GetRoute() const
-{
- threads::MutexGuard guard(m_routingSessionMutex);
- ASSERT(m_route, ());
- return m_route;
-}
-
void RoutingSession::OnTrafficInfoClear()
{
{
diff --git a/routing/routing_session.hpp b/routing/routing_session.hpp
index a6f87aa7bd..2c138633b4 100644
--- a/routing/routing_session.hpp
+++ b/routing/routing_session.hpp
@@ -80,6 +80,7 @@ public:
typedef function<void(Route const &, IRouter::ResultCode)> TReadyCallback;
typedef function<void(float)> TProgressCallback;
typedef function<void(size_t passedCheckpointIdx)> CheckpointCallback;
+ using RouteCallback = function<void(Route const &)>;
RoutingSession();
@@ -114,7 +115,6 @@ public:
inline void SetState(State state) { m_state = state; }
- shared_ptr<Route> const GetRoute() const;
/// \returns true if altitude information along |m_route| is available and
/// false otherwise.
bool HasRouteAltitude() const;
@@ -163,6 +163,8 @@ public:
void EmitCloseRoutingEvent() const;
+ void ProtectedCall(RouteCallback const & callback) const;
+
// RoutingObserver overrides:
void OnTrafficInfoClear() override;
void OnTrafficInfoAdded(traffic::TrafficInfo && info) override;
@@ -220,6 +222,7 @@ private:
/// about camera will be sent at most once.
mutable bool m_speedWarningSignal;
+ /// |m_routingSessionMutex| should be used for access to |m_route| member.
mutable threads::Mutex m_routingSessionMutex;
/// Current position metrics to check for RouteNeedRebuild state.
diff --git a/routing/routing_tests/routing_session_test.cpp b/routing/routing_tests/routing_session_test.cpp
index 8b17ca8f33..441ce42d38 100644
--- a/routing/routing_tests/routing_session_test.cpp
+++ b/routing/routing_tests/routing_session_test.cpp
@@ -102,12 +102,7 @@ UNIT_TEST(TestRouteBuilding)
unique_ptr<DummyRouter> router = make_unique<DummyRouter>(masterRoute, DummyRouter::NoError, counter);
session.SetRouter(move(router), nullptr);
session.SetReadyCallbacks(
- [&timedSignal](Route const &, IRouter::ResultCode)
- {
- timedSignal.Signal();
- },
- nullptr
- );
+ [&timedSignal](Route const &, IRouter::ResultCode) { timedSignal.Signal(); }, nullptr);
session.BuildRoute(Checkpoints(kTestRoute.front(), kTestRoute.back()), 0);
// Manual check of the routeBuilded mutex to avoid spurious results.
auto const time = steady_clock::now() + kRouteBuildingMaxDuration;