From 5232a439705a46f3da6d11c074529cb586bb1a5a Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Tue, 13 Mar 2018 17:02:26 +0300 Subject: Getting rid of RoutingSession::GetRoute() which break m_route protection with mutex. --- routing/routing_session.cpp | 17 +++++++++-------- routing/routing_session.hpp | 5 ++++- routing/routing_tests/routing_session_test.cpp | 7 +------ 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'routing') 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 & routeSegDis return true; } -shared_ptr 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 TReadyCallback; typedef function TProgressCallback; typedef function CheckpointCallback; + using RouteCallback = function; RoutingSession(); @@ -114,7 +115,6 @@ public: inline void SetState(State state) { m_state = state; } - shared_ptr 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 router = make_unique(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; -- cgit v1.2.3