diff --git a/base/deferred_task.cpp b/base/deferred_task.cpp index fac03e9ace..709f1f3560 100644 --- a/base/deferred_task.cpp +++ b/base/deferred_task.cpp @@ -48,21 +48,21 @@ DeferredTask::DeferredTask(TTask const & task, milliseconds ms) : m_started(fals DeferredTask::~DeferredTask() { - CheckContext(); + ASSERT_THREAD_CHECKER(m_threadChecker, ()); m_thread.Cancel(); } bool DeferredTask::WasStarted() const { - CheckContext(); + ASSERT_THREAD_CHECKER(m_threadChecker, ()); return m_started; } void DeferredTask::Cancel() { - CheckContext(); + ASSERT_THREAD_CHECKER(m_threadChecker, ()); threads::IRoutine * routine = m_thread.GetRoutine(); CHECK(routine, ()); @@ -71,14 +71,7 @@ void DeferredTask::Cancel() void DeferredTask::WaitForCompletion() { - CheckContext(); + ASSERT_THREAD_CHECKER(m_threadChecker, ()); m_thread.Join(); } - -void DeferredTask::CheckContext() const -{ -#ifdef USE_THREAD_CHECKER - CHECK(m_threadChecker.CalledOnOriginalThread(), ()); -#endif -} diff --git a/base/deferred_task.hpp b/base/deferred_task.hpp index d47cbf58d2..80d28cd1b5 100644 --- a/base/deferred_task.hpp +++ b/base/deferred_task.hpp @@ -3,6 +3,7 @@ #include "base/condition.hpp" #include "base/macros.hpp" #include "base/thread.hpp" +#include "base/thread_checker.hpp" #include "std/chrono.hpp" #include "std/condition_variable.hpp" @@ -10,17 +11,6 @@ #include "std/unique_ptr.hpp" -#if defined(DEBUG) && !defined(OMIM_OS_ANDROID) -// This checker is not valid on Android. -// UI thread (NV thread) can change it's handle value during app lifecycle. -#define USE_THREAD_CHECKER -#endif - -#ifdef USE_THREAD_CHECKER -#include "base/thread_checker.hpp" -#endif - - // This class is used to call a function after waiting for a specified // amount of time. The function is called in a separate thread. This // class is not thread safe. @@ -65,10 +55,7 @@ private: atomic m_started; threads::Thread m_thread; -#ifdef USE_THREAD_CHECKER - ThreadChecker m_threadChecker; -#endif - void CheckContext() const; + DECLARE_THREAD_CHECKER(m_threadChecker); DISALLOW_COPY_AND_MOVE(DeferredTask); }; diff --git a/base/thread_checker.hpp b/base/thread_checker.hpp index f46c3c9fa3..0381c68254 100644 --- a/base/thread_checker.hpp +++ b/base/thread_checker.hpp @@ -1,5 +1,6 @@ #pragma once +#include "base/assert.hpp" #include "base/macros.hpp" #include "std/thread.hpp" @@ -21,3 +22,13 @@ private: DISALLOW_COPY_AND_MOVE(ThreadChecker); }; + +// ThreadChecker checker is not valid on Android. +// UI thread (NV thread) can change it's handle value during app lifecycle. +#if defined(DEBUG) && !defined(OMIM_OS_ANDROID) + #define DECLARE_THREAD_CHECKER(threadCheckerName) ThreadChecker threadCheckerName + #define ASSERT_THREAD_CHECKER(threadCheckerName, msg) ASSERT(threadCheckerName.CalledOnOriginalThread(), msg) +#else + #define DECLARE_THREAD_CHECKER(threadCheckerName) + #define ASSERT_THREAD_CHECKER(threadCheckerName, msg) +#endif diff --git a/map/framework.cpp b/map/framework.cpp index 707f884189..caedf287ef 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2120,6 +2120,8 @@ void Framework::UpdateSavedDataVersion() void Framework::BuildRoute(m2::PointD const & destination, uint32_t timeoutSec) { + ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute")); + shared_ptr const & state = GetLocationState(); if (!state->IsModeHasPosition()) { @@ -2135,6 +2137,8 @@ void Framework::BuildRoute(m2::PointD const & destination, uint32_t timeoutSec) auto readyCallback = [this](Route const & route, IRouter::ResultCode code) { + ASSERT_THREAD_CHECKER(m_threadChecker, ("BuildRoute_ReadyCallback")); + vector absentCountries; vector absentRoutingIndexes; if (code == IRouter::NoError) @@ -2170,6 +2174,8 @@ void Framework::BuildRoute(m2::PointD const & destination, uint32_t timeoutSec) void Framework::SetRouter(RouterType type) { + ASSERT_THREAD_CHECKER(m_threadChecker, ("SetRouter")); + if (m_currentRouterType == type) return; SetRouterImpl(type); @@ -2213,6 +2219,8 @@ void Framework::SetRouterImpl(RouterType type) void Framework::RemoveRoute() { + ASSERT_THREAD_CHECKER(m_threadChecker, ("RemoveRoute")); + m_bmManager.UserMarksClear(UserMarkContainer::DEBUG_MARK); m_bmManager.ResetRouteTrack(); @@ -2220,6 +2228,8 @@ void Framework::RemoveRoute() void Framework::CloseRouting() { + ASSERT_THREAD_CHECKER(m_threadChecker, ("CloseRouting")); + GetLocationState()->StopRoutingMode(); m_routingSession.Reset(); RemoveRoute(); @@ -2228,6 +2238,8 @@ void Framework::CloseRouting() void Framework::InsertRoute(Route const & route) { + ASSERT_THREAD_CHECKER(m_threadChecker, ("InsertRoute")); + if (route.GetPoly().GetSize() < 2) { LOG(LWARNING, ("Invalid track - only", route.GetPoly().GetSize(), "point(s).")); diff --git a/map/framework.hpp b/map/framework.hpp index a42fb82ad0..e67f8b8e76 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -48,6 +48,7 @@ #include "base/macros.hpp" #include "base/strings_bundle.hpp" +#include "base/thread_checker.hpp" #include "std/vector.hpp" #include "std/shared_ptr.hpp" @@ -609,4 +610,6 @@ public: private: bool m_isFullScreenMode = false; //@} + + DECLARE_THREAD_CHECKER(m_threadChecker); };