diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2018-03-13 17:02:26 +0300 |
---|---|---|
committer | Tatiana Yan <tatiana.kondakova@gmail.com> | 2018-03-14 13:08:01 +0300 |
commit | 5232a439705a46f3da6d11c074529cb586bb1a5a (patch) | |
tree | ee4d13c0c010f822f61fbe6f5512e44ebfc10ac4 /routing | |
parent | 679b83cc72c9988dc4c8e7f8c39442c2cc39b35e (diff) |
Getting rid of RoutingSession::GetRoute() which break m_route protection with mutex.
Diffstat (limited to 'routing')
-rw-r--r-- | routing/routing_session.cpp | 17 | ||||
-rw-r--r-- | routing/routing_session.hpp | 5 | ||||
-rw-r--r-- | routing/routing_tests/routing_session_test.cpp | 7 |
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; |