From ebbdd625ceecf12f4f9386aec821795365b13104 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 9 Nov 2017 15:42:23 +0300 Subject: Review fixes --- android/jni/com/mapswithme/maps/Framework.cpp | 1 - android/jni/com/mapswithme/maps/SearchEngine.cpp | 6 +- .../maps/bookmarks/data/BookmarkManager.cpp | 11 ++-- android/jni/com/mapswithme/platform/Platform.cpp | 7 --- android/jni/com/mapswithme/platform/Platform.hpp | 2 - android/src/com/mapswithme/maps/MwmActivity.java | 8 +-- .../maps/bookmarks/data/BookmarkManager.java | 24 ++++---- base/worker_thread.hpp | 4 +- editor/user_stats.cpp | 4 +- iphone/Maps/Core/Framework/Framework.cpp | 6 +- iphone/Maps/Core/Framework/MWMFrameworkListener.mm | 7 --- map/benchmark_tools.cpp | 2 +- map/bookmark.cpp | 15 +++-- map/bookmark.hpp | 14 ++--- map/bookmark_manager.cpp | 50 ++++++++-------- map/bookmark_manager.hpp | 4 +- map/framework.cpp | 17 +++--- map/local_ads_manager.cpp | 6 +- map/routing_manager.cpp | 2 +- map/routing_manager.hpp | 12 +--- map/search_mark.cpp | 2 +- map/traffic_manager.cpp | 6 +- partners_api/booking_api.cpp | 6 +- partners_api/cian_api.cpp | 2 +- partners_api/locals_api.cpp | 4 +- partners_api/uber_api.cpp | 4 +- partners_api/viator_api.cpp | 2 +- partners_api/yandex_api.cpp | 2 +- platform/platform.hpp | 66 ++++++++++++++-------- platform/platform_android.cpp | 23 -------- platform/platform_ios.mm | 19 ------- platform/platform_mac.mm | 22 -------- platform/platform_qt.cpp | 5 -- platform/platform_tizen.cpp | 6 -- platform/platform_win.cpp | 6 -- platform/safe_callback.hpp | 2 +- qt/search_panel.cpp | 3 +- .../search_quality/assessment_tool/main_model.cpp | 4 +- storage/diff_scheme/diff_manager.cpp | 2 +- storage/downloading_policy.cpp | 2 +- storage/storage.cpp | 2 +- 41 files changed, 156 insertions(+), 236 deletions(-) diff --git a/android/jni/com/mapswithme/maps/Framework.cpp b/android/jni/com/mapswithme/maps/Framework.cpp index 6a2ff91add..c4975bf104 100644 --- a/android/jni/com/mapswithme/maps/Framework.cpp +++ b/android/jni/com/mapswithme/maps/Framework.cpp @@ -159,7 +159,6 @@ bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi ASSERT(!m_guiPositions.empty(), ("GUI elements must be set-up before engine is created")); p.m_widgetsInitInfo = m_guiPositions; - m_work.LoadBookmarks(); m_work.SetMyPositionModeListener(bind(&Framework::MyPositionModeChanged, this, _1, _2)); m_work.CreateDrapeEngine(make_ref(m_contextFactory), move(p)); diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index 0efbc23558..10a624a698 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -493,7 +493,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeCancelInteractiveSearch(JNIEnv * env, jclass clazz) { - GetPlatform().RunOnGuiThread([]() + GetPlatform().RunTask(Platform::Thread::Gui, []() { g_framework->NativeFramework()->CancelSearch(search::Mode::Viewport); }); @@ -502,7 +502,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeCancelEverywhereSearch(JNIEnv * env, jclass clazz) { - GetPlatform().RunOnGuiThread([]() + GetPlatform().RunTask(Platform::Thread::Gui, []() { g_framework->NativeFramework()->CancelSearch(search::Mode::Everywhere); }); @@ -511,7 +511,7 @@ extern "C" JNIEXPORT void JNICALL Java_com_mapswithme_maps_search_SearchEngine_nativeCancelAllSearches(JNIEnv * env, jclass clazz) { - GetPlatform().RunOnGuiThread([]() + GetPlatform().RunTask(Platform::Thread::Gui, []() { g_framework->NativeFramework()->CancelAllSearches(); }); diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp index 97c7b714fc..018f9dfbcd 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp @@ -19,7 +19,7 @@ jclass g_bookmarkManagerClass; jfieldID g_bookmarkManagerInstanceField; jmethodID g_onBookmarksLoadingStartedMethod; jmethodID g_onBookmarksLoadingFinishedMethod; -jmethodID g_onBookmarksLoadingFileMethod; +jmethodID g_onBookmarksFileLoadedMethod; void PrepareClassRefs(JNIEnv * env) { @@ -37,15 +37,14 @@ void PrepareClassRefs(JNIEnv * env) jni::GetMethodID(env, bookmarkManagerInstance, "onBookmarksLoadingStarted", "()V"); g_onBookmarksLoadingFinishedMethod = jni::GetMethodID(env, bookmarkManagerInstance, "onBookmarksLoadingFinished", "()V"); - g_onBookmarksLoadingFileMethod = - jni::GetMethodID(env, bookmarkManagerInstance, "onBookmarksLoadingFile", + g_onBookmarksFileLoadedMethod = + jni::GetMethodID(env, bookmarkManagerInstance, "onBookmarksFileLoaded", "(ZLjava/lang/String;Z)V"); } void OnAsyncLoadingStarted(JNIEnv * env) { ASSERT(g_bookmarkManagerClass != nullptr, ()); - LOG(LINFO, ("!!!!!!")); jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, g_bookmarkManagerInstanceField); env->CallVoidMethod(bookmarkManagerInstance, g_onBookmarksLoadingStartedMethod); @@ -67,7 +66,7 @@ void OnAsyncLoadingFileSuccess(JNIEnv * env, std::string const & fileName, bool jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, g_bookmarkManagerInstanceField); jni::TScopedLocalRef jFileName(env, jni::ToJavaString(env, fileName)); - env->CallVoidMethod(bookmarkManagerInstance, g_onBookmarksLoadingFileMethod, + env->CallVoidMethod(bookmarkManagerInstance, g_onBookmarksFileLoadedMethod, true /* success */, jFileName.get(), isTemporaryFile); jni::HandleJavaException(env); } @@ -78,7 +77,7 @@ void OnAsyncLoadingFileError(JNIEnv * env, std::string const & fileName, bool is jobject bookmarkManagerInstance = env->GetStaticObjectField(g_bookmarkManagerClass, g_bookmarkManagerInstanceField); jni::TScopedLocalRef jFileName(env, jni::ToJavaString(env, fileName)); - env->CallVoidMethod(bookmarkManagerInstance, g_onBookmarksLoadingFileMethod, + env->CallVoidMethod(bookmarkManagerInstance, g_onBookmarksFileLoadedMethod, false /* success */, jFileName.get(), isTemporaryFile); jni::HandleJavaException(env); } diff --git a/android/jni/com/mapswithme/platform/Platform.cpp b/android/jni/com/mapswithme/platform/Platform.cpp index 8fab7b2260..1b63887c7c 100644 --- a/android/jni/com/mapswithme/platform/Platform.cpp +++ b/android/jni/com/mapswithme/platform/Platform.cpp @@ -147,13 +147,6 @@ Platform::~Platform() env->DeleteGlobalRef(m_functorProcessObject); } -void Platform::ProcessFunctor(jlong functionPointer) -{ - TFunctor * fn = reinterpret_cast(functionPointer); - (*fn)(); - delete fn; -} - void Platform::OnExternalStorageStatusChanged(bool isAvailable) { } diff --git a/android/jni/com/mapswithme/platform/Platform.hpp b/android/jni/com/mapswithme/platform/Platform.hpp index 5c9cf05427..3d8cad3cf9 100644 --- a/android/jni/com/mapswithme/platform/Platform.hpp +++ b/android/jni/com/mapswithme/platform/Platform.hpp @@ -26,8 +26,6 @@ public: ~Platform() override; - void ProcessFunctor(jlong functionPointer); - void OnExternalStorageStatusChanged(bool isAvailable); /// get storage path without ending "/MapsWithMe/" diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 7681d49ed6..85a540699a 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -505,8 +505,6 @@ public class MwmActivity extends BaseMwmFragmentActivity Statistics.INSTANCE.trackConnectionState(); - BookmarkManager.INSTANCE.addListener(this); - mSearchController = new FloatingSearchToolbarController(this); mSearchController.setVisibilityListener(this); SearchEngine.INSTANCE.addListener(this); @@ -924,8 +922,6 @@ public class MwmActivity extends BaseMwmFragmentActivity BottomSheetHelper.free(); SearchEngine.INSTANCE.removeListener(this); - BookmarkManager.INSTANCE.removeListener(this); - super.onDestroy(); } @@ -1182,6 +1178,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onStart(); Framework.nativeSetMapObjectListener(this); + BookmarkManager.INSTANCE.addListener(this); RoutingController.get().attach(this); if (MapFragment.nativeIsEngineCreated()) LocationHelper.INSTANCE.attach(this); @@ -1197,6 +1194,7 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onStop(); Framework.nativeRemoveMapObjectListener(); + BookmarkManager.INSTANCE.removeListener(this); LocationHelper.INSTANCE.detach(!isFinishing()); RoutingController.get().detach(); TrafficManager.INSTANCE.detachAll(); @@ -2219,7 +2217,7 @@ public class MwmActivity extends BaseMwmFragmentActivity } @Override - public void onBookmarksLoadingFile(boolean success) + public void onBookmarksFileLoaded(boolean success) { Utils.toastShortcut(MwmActivity.this, success ? R.string.load_kmz_successful : R.string.load_kmz_failed); diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index f4a2fa3d5c..8550b08e32 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -12,16 +12,15 @@ import com.mapswithme.maps.R; import com.mapswithme.util.statistics.Statistics; @MainThread -public class BookmarkManager +public enum BookmarkManager { - public static final BookmarkManager INSTANCE = new BookmarkManager(); + INSTANCE; public static final List ICONS = new ArrayList<>(); + @NonNull private List mListeners = new ArrayList<>(); - private BookmarkManager() {} - static { ICONS.add(new Icon("placemark-red", "placemark-red", R.drawable.ic_bookmark_marker_red_off, R.drawable.ic_bookmark_marker_red_on)); @@ -82,12 +81,12 @@ public class BookmarkManager return bookmark; } - public void addListener(BookmarksLoadingListener listener) + public void addListener(@NonNull BookmarksLoadingListener listener) { mListeners.add(listener); } - public void removeListener(BookmarksLoadingListener listener) + public void removeListener(@NonNull BookmarksLoadingListener listener) { mListeners.remove(listener); } @@ -110,9 +109,11 @@ public class BookmarkManager // Called from JNI. @MainThread - public void onBookmarksLoadingFile(boolean success, String fileName, boolean isTemporaryFile) + public void onBookmarksFileLoaded(boolean success, @NonNull String fileName, + boolean isTemporaryFile) { - // Android could create temporary file with bookmarks in some cases. Here we can delete it. + // Android could create temporary file with bookmarks in some cases (KML/KMZ file is a blob + // in the intent, so we have to create a temporary file on the disk). Here we can delete it. if (isTemporaryFile) { File tmpFile = new File(fileName); @@ -120,7 +121,7 @@ public class BookmarkManager } for (BookmarksLoadingListener listener : mListeners) - listener.onBookmarksLoadingFile(success); + listener.onBookmarksFileLoaded(success); } public static native void nativeLoadBookmarks(); @@ -151,7 +152,7 @@ public class BookmarkManager public static native String nativeGenerateUniqueFileName(String baseName); - public static native void nativeLoadKmzFile(String path, boolean isTemporaryFile); + public static native void nativeLoadKmzFile(@NonNull String path, boolean isTemporaryFile); public static native String nativeFormatNewBookmarkName(); @@ -161,7 +162,6 @@ public class BookmarkManager { void onBookmarksLoadingStarted(); void onBookmarksLoadingFinished(); - - void onBookmarksLoadingFile(boolean success); + void onBookmarksFileLoaded(boolean success); } } diff --git a/base/worker_thread.hpp b/base/worker_thread.hpp index 9b14b9f162..a0197e2158 100644 --- a/base/worker_thread.hpp +++ b/base/worker_thread.hpp @@ -15,8 +15,8 @@ namespace base { // This class represents a simple worker thread with a queue of tasks. // -// *NOTE* This class IS thread-safe, but it must be destroyed on the -// same thread it was created. +// *NOTE* This class IS NOT thread-safe, it must be destroyed on the +// same thread it was created, but Push* methods are thread-safe. class WorkerThread : public TaskLoop { public: diff --git a/editor/user_stats.cpp b/editor/user_stats.cpp index 3a71ea9884..2362085dba 100644 --- a/editor/user_stats.cpp +++ b/editor/user_stats.cpp @@ -140,13 +140,13 @@ void UserStatsLoader::Update(string const & userName, UpdatePolicy const policy, if (nothingToUpdate) { - GetPlatform().RunOnGuiThread(fn); + GetPlatform().RunTask(Platform::Thread::Gui, fn); return; } threads::SimpleThread([this, userName, fn] { if (Update(userName)) - GetPlatform().RunOnGuiThread(fn); + GetPlatform().RunTask(Platform::Thread::Gui, fn); }).detach(); } diff --git a/iphone/Maps/Core/Framework/Framework.cpp b/iphone/Maps/Core/Framework/Framework.cpp index 606a5a0786..d29dde02cf 100644 --- a/iphone/Maps/Core/Framework/Framework.cpp +++ b/iphone/Maps/Core/Framework/Framework.cpp @@ -3,11 +3,11 @@ #include "base/assert.hpp" static Framework * g_framework = 0; -bool wasDeleted = false; +bool g_wasDeleted = false; Framework & GetFramework() { - CHECK(!wasDeleted, ()); + CHECK(!g_wasDeleted, ()); if (g_framework == 0) g_framework = new Framework(); return *g_framework; @@ -15,7 +15,7 @@ Framework & GetFramework() void DeleteFramework() { - wasDeleted = true; + g_wasDeleted = true; delete g_framework; g_framework = nullptr; } diff --git a/iphone/Maps/Core/Framework/MWMFrameworkListener.mm b/iphone/Maps/Core/Framework/MWMFrameworkListener.mm index 4db0e18b26..b3c459028f 100644 --- a/iphone/Maps/Core/Framework/MWMFrameworkListener.mm +++ b/iphone/Maps/Core/Framework/MWMFrameworkListener.mm @@ -95,13 +95,6 @@ void loopWrappers(Observers * observers, TLoopBlock block) using namespace routing; using namespace storage; Observers * observers = self.routeBuildingObservers; - // TODO(ldragunov,rokuz): Thise two routing callbacks are the only framework callbacks which does - // not guarantee - // that they are called on a main UI thread context. Discuss it with Lev. - // Simplest solution is to insert RunOnGuiThread() call in the core where callbacks are called. - // This will help to avoid unnecessary parameters copying and will make all our framework - // callbacks - // consistent: every notification to UI will run on a main UI thread. auto & rm = GetFramework().GetRoutingManager(); rm.SetRouteBuildingListener( [observers](IRouter::ResultCode code, TCountriesVec const & absentCountries) { diff --git a/map/benchmark_tools.cpp b/map/benchmark_tools.cpp index e0bc586cfe..8a8dbcb590 100644 --- a/map/benchmark_tools.cpp +++ b/map/benchmark_tools.cpp @@ -62,7 +62,7 @@ void RunScenario(Framework * framework, std::shared_ptr handle) auto const drapeStatistic = df::DrapeMeasurer::Instance().GetDrapeStatistic(); handle->m_drapeStatistic.push_back(make_pair(name, drapeStatistic)); #endif - GetPlatform().RunOnGuiThread([framework, handle]() + GetPlatform().RunTask(Platform::Thread::Gui, [framework, handle]() { handle->m_currentScenario++; RunScenario(framework, handle); diff --git a/map/bookmark.cpp b/map/bookmark.cpp index 86de538f8a..7926923192 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -28,11 +28,11 @@ #include Bookmark::Bookmark(m2::PointD const & ptOrg, UserMarkContainer * container) - : TBase(ptOrg, container) + : Base(ptOrg, container) {} Bookmark::Bookmark(BookmarkData const & data, m2::PointD const & ptOrg, UserMarkContainer * container) - : TBase(ptOrg, container) + : Base(ptOrg, container) , m_data(data) {} @@ -136,7 +136,7 @@ Track const * BookmarkCategory::GetTrack(size_t index) const } BookmarkCategory::BookmarkCategory(std::string const & name) - : TBase(0.0 /* bookmarkDepth */, UserMark::Type::BOOKMARK) + : Base(0.0 /* bookmarkDepth */, UserMark::Type::BOOKMARK) , m_name(name) {} @@ -168,7 +168,14 @@ void BookmarkCategory::DeleteTrack(size_t index) m_tracks.erase(next(m_tracks.begin(), index)); } -void BookmarkCategory::AcceptTracks(std::vector> && tracks) +std::vector> BookmarkCategory::StealTracks() +{ + std::vector> tracks; + std::swap(m_tracks, tracks); + return std::move(tracks); +} + +void BookmarkCategory::AppendTracks(std::vector> && tracks) { std::move(tracks.begin(), tracks.end(), std::back_inserter(m_tracks)); } diff --git a/map/bookmark.hpp b/map/bookmark.hpp index 4d0c996cba..540274b611 100644 --- a/map/bookmark.hpp +++ b/map/bookmark.hpp @@ -1,5 +1,6 @@ #pragma once +#include "map/track.hpp" #include "map/user_mark.hpp" #include "map/user_mark_container.hpp" @@ -22,8 +23,6 @@ namespace anim class Task; } -class Track; - class BookmarkData { public: @@ -71,7 +70,7 @@ private: class Bookmark : public UserMark { - using TBase = UserMark; + using Base = UserMark; public: Bookmark(m2::PointD const & ptOrg, UserMarkContainer * container); @@ -110,8 +109,7 @@ private: class BookmarkCategory : public UserMarkContainer { - using TBase = UserMarkContainer; - + using Base = UserMarkContainer; public: explicit BookmarkCategory(std::string const & name); ~BookmarkCategory() override; @@ -128,8 +126,8 @@ public: inline size_t GetTracksCount() const { return m_tracks.size(); } void DeleteTrack(size_t index); - std::vector> && MoveTracks() { return std::move(m_tracks); } - void AcceptTracks(std::vector> && tracks); + std::vector> StealTracks(); + void AppendTracks(std::vector> && tracks); void SetName(std::string const & name) { m_name = name; } std::string const & GetName() const { return m_name; } @@ -161,7 +159,7 @@ private: std::vector> m_tracks; std::string m_name; - /// Stores file name from which category was loaded + // Stores file name from which bookmarks were loaded. std::string m_file; }; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index c6fa7fdd5e..6a28daaf26 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -40,7 +40,7 @@ using RouteUserMarkContainer = SpecifiedUserMarkContainer; using StaticUserMarkContainer = SpecifiedUserMarkContainer; -// It returns extension with a dot in lower case +// Returns extension with a dot in a lower case. std::string const GetFileExt(std::string const & filePath) { std::string ext = my::GetFileExtension(filePath); @@ -137,8 +137,8 @@ void BookmarkManager::LoadBookmarks() { ClearCategories(); - StartAsyncLoading(); - GetPlatform().RunOnFileThread([this]() + NotifyAboutStartAsyncLoading(); + GetPlatform().RunTask(Platform::Thread::File, [this]() { std::string const dir = GetPlatform().SettingsDir(); Platform::FilesList files; @@ -154,7 +154,7 @@ void BookmarkManager::LoadBookmarks() if (cat != nullptr) collection->emplace_back(std::move(cat)); } - FinishAsyncLoading(std::move(collection)); + NotifyAboutFinishAsyncLoading(std::move(collection)); }); LoadState(); @@ -162,8 +162,8 @@ void BookmarkManager::LoadBookmarks() void BookmarkManager::LoadBookmark(std::string const & filePath, bool isTemporaryFile) { - StartAsyncLoading(); - GetPlatform().RunOnFileThread([this, filePath, isTemporaryFile]() + NotifyAboutStartAsyncLoading(); + GetPlatform().RunTask(Platform::Thread::File, [this, filePath, isTemporaryFile]() { auto collection = std::make_shared(); auto const fileSavePath = GetKMLPath(filePath); @@ -186,16 +186,16 @@ void BookmarkManager::LoadBookmark(std::string const & filePath, bool isTemporar NotifyAboutFile(categoryExists, filePath, isTemporaryFile); } - FinishAsyncLoading(std::move(collection)); + NotifyAboutFinishAsyncLoading(std::move(collection)); }); } -void BookmarkManager::StartAsyncLoading() +void BookmarkManager::NotifyAboutStartAsyncLoading() { if (m_needTeardown) return; - GetPlatform().RunOnGuiThread([this]() + GetPlatform().RunTask(Platform::Thread::Gui, [this]() { m_asyncLoadingCounter++; if (m_asyncLoadingCallbacks.m_onStarted != nullptr) @@ -203,12 +203,12 @@ void BookmarkManager::StartAsyncLoading() }); } -void BookmarkManager::FinishAsyncLoading(std::shared_ptr && collection) +void BookmarkManager::NotifyAboutFinishAsyncLoading(std::shared_ptr && collection) { if (m_needTeardown) return; - GetPlatform().RunOnGuiThread([this, collection]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, collection]() { if (!collection->empty()) MergeCategories(std::move(*collection)); @@ -225,7 +225,7 @@ void BookmarkManager::NotifyAboutFile(bool success, std::string const & filePath if (m_needTeardown) return; - GetPlatform().RunOnGuiThread([this, success, filePath, isTemporaryFile]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, success, filePath, isTemporaryFile]() { if (success) { @@ -256,7 +256,7 @@ boost::optional BookmarkManager::GetKMLPath(std::string const & fil { ZipFileReader::FileListT files; ZipFileReader::FilesList(filePath, files); - string kmlFileName; + std::string kmlFileName; for (size_t i = 0; i < files.size(); ++i) { if (GetFileExt(files[i].first) == BOOKMARKS_FILE_EXTENSION) @@ -508,20 +508,20 @@ void BookmarkManager::MergeCategories(CategoriesCollection && newCategories) { return c->GetName() == categoryName; }); - if (it != newCategories.end()) - { - // Copy bookmarks and tracks to the existing category. - for (size_t i = 0; i < (*it)->GetUserMarkCount(); ++i) - { - auto srcBookmark = static_cast((*it)->GetUserMark(i)); - auto bookmark = static_cast(category->CreateUserMark(srcBookmark->GetPivot())); - bookmark->SetData(srcBookmark->GetData()); - } - category->AcceptTracks((*it)->MoveTracks()); - category->SaveToKMLFile(); + if (it == newCategories.end()) + continue; - newCategories.erase(it); + // Copy bookmarks and tracks to the existing category. + for (size_t i = 0; i < (*it)->GetUserMarkCount(); ++i) + { + auto srcBookmark = static_cast((*it)->GetUserMark(i)); + auto bookmark = static_cast(category->CreateUserMark(srcBookmark->GetPivot())); + bookmark->SetData(srcBookmark->GetData()); } + category->AppendTracks((*it)->StealTracks()); + category->SaveToKMLFile(); + + newCategories.erase(it); } std::move(newCategories.begin(), newCategories.end(), std::back_inserter(m_categories)); diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index e21ea9ee64..08a8b5b149 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -100,8 +100,8 @@ private: void SaveState() const; void LoadState(); void MergeCategories(CategoriesCollection && newCategories); - void StartAsyncLoading(); - void FinishAsyncLoading(std::shared_ptr && collection); + void NotifyAboutStartAsyncLoading(); + void NotifyAboutFinishAsyncLoading(std::shared_ptr && collection); boost::optional GetKMLPath(std::string const & filePath); void NotifyAboutFile(bool success, std::string const & filePath, bool isTemporaryFile); diff --git a/map/framework.cpp b/map/framework.cpp index 4d9af61108..0b65d90e5a 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -607,7 +607,7 @@ void Framework::OnMapDeregistered(platform::LocalCountryFile const & localFile) if (m_storage.GetThreadChecker().CalledOnOriginalThread()) action(); else - GetPlatform().RunOnGuiThread(action); + GetPlatform().RunTask(Platform::Thread::Gui, action); auto const mwmId = m_model.GetIndex().GetMwmIdByCountryFile(localFile.GetCountryFile()); m_trafficManager.OnMwmDeregistered(mwmId); @@ -1220,7 +1220,7 @@ void Framework::OnUpdateCurrentCountry(m2::PointF const & pt, int zoomLevel) m_lastReportedCountry = newCountryId; - GetPlatform().RunOnGuiThread([this, newCountryId]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, newCountryId]() { if (m_currentCountryChanged != nullptr) m_currentCountryChanged(newCountryId); @@ -1639,7 +1639,7 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, auto myPositionModeChangedFn = [this](location::EMyPositionMode mode, bool routingActive) { - GetPlatform().RunOnGuiThread([this, mode, routingActive]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, mode, routingActive]() { // Deactivate selection (and hide place page) if we return to routing in F&R mode. if (routingActive && mode == location::FollowAndRotate) @@ -1701,16 +1701,16 @@ void Framework::CreateDrapeEngine(ref_ptr contextFactory, m_drapeEngine = make_unique_dp(move(p)); m_drapeEngine->SetModelViewListener([this](ScreenBase const & screen) { - GetPlatform().RunOnGuiThread([this, screen](){ OnViewportChanged(screen); }); + GetPlatform().RunTask(Platform::Thread::Gui, [this, screen](){ OnViewportChanged(screen); }); }); m_drapeEngine->SetTapEventInfoListener([this](df::TapInfo const & tapInfo) { - GetPlatform().RunOnGuiThread([this, tapInfo]() { + GetPlatform().RunTask(Platform::Thread::Gui, [this, tapInfo]() { OnTapEvent({tapInfo, TapEvent::Source::User}); }); }); m_drapeEngine->SetUserPositionListener([this](m2::PointD const & position, bool hasPosition) { - GetPlatform().RunOnGuiThread([this, position, hasPosition](){ + GetPlatform().RunTask(Platform::Thread::Gui, [this, position, hasPosition](){ OnUserPositionChanged(position, hasPosition); }); }); @@ -3058,7 +3058,10 @@ ads::Engine const & Framework::GetAdsEngine() const return *m_adsEngine; } -void Framework::RunUITask(function fn) { GetPlatform().RunOnGuiThread(move(fn)); } +void Framework::RunUITask(function fn) +{ + GetPlatform().RunTask(Platform::Thread::Gui, move(fn)); +} void Framework::SetSearchDisplacementModeEnabled(bool enabled) { diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index f16fa133ee..e6d3cf5ad0 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -142,7 +142,7 @@ void CreateLocalAdsMarks(BookmarkManager * bmManager, CampaignData const & campa return; // Here we copy campaign data, because we can create user marks only from UI thread. - GetPlatform().RunOnGuiThread([bmManager, campaignData]() + GetPlatform().RunTask(Platform::Thread::Gui, [bmManager, campaignData]() { UserMarkNotificationGuard guard(*bmManager, UserMark::Type::LOCAL_ADS); for (auto const & data : campaignData) @@ -161,7 +161,7 @@ void DeleteLocalAdsMarks(BookmarkManager * bmManager, MwmSet::MwmId const & mwmI if (bmManager == nullptr) return; - GetPlatform().RunOnGuiThread([bmManager, mwmId]() + GetPlatform().RunTask(Platform::Thread::Gui, [bmManager, mwmId]() { UserMarkNotificationGuard guard(*bmManager, UserMark::Type::LOCAL_ADS); for (size_t i = 0; i < guard.m_controller.GetUserMarkCount();) @@ -182,7 +182,7 @@ void DeleteAllLocalAdsMarks(BookmarkManager * bmManager) if (bmManager == nullptr) return; - GetPlatform().RunOnGuiThread([bmManager]() + GetPlatform().RunTask(Platform::Thread::Gui, [bmManager]() { UserMarkNotificationGuard guard(*bmManager, UserMark::Type::LOCAL_ADS); guard.m_controller.Clear(); diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index b60f768298..0a81c1a7f7 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -263,7 +263,7 @@ RoutingManager::RoutingManager(Callbacks && callbacks, Delegate & delegate) m_routingSession.SetCheckpointCallback([this](size_t passedCheckpointIdx) { - GetPlatform().RunOnGuiThread([this, passedCheckpointIdx]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, passedCheckpointIdx]() { size_t const pointsCount = GetRoutePointsCount(); diff --git a/map/routing_manager.hpp b/map/routing_manager.hpp index bd501817f8..1751226ae7 100644 --- a/map/routing_manager.hpp +++ b/map/routing_manager.hpp @@ -116,17 +116,7 @@ public: // This method was added because we do not want to break the behaviour that is familiar to our // users. bool DisableFollowMode(); - /// @TODO(AlexZ): Warning! These two routing callbacks are the only callbacks which are not called - /// in the main thread context. - /// UI code should take it into an account. This is a result of current implementation, that can - /// be improved: - /// Drape core calls some RunOnGuiThread with "this" pointers, and it causes crashes on Android, - /// when Drape engine is destroyed - /// while switching between activities. Current workaround cleans all callbacks when destroying - /// Drape engine - /// (@see MwmApplication.clearFunctorsOnUiThread on Android). Better soulution can be fair copying - /// of all needed information into - /// lambdas/functors before calling RunOnGuiThread. + void SetRouteBuildingListener(RouteBuildingCallback const & buildingCallback) { m_routingCallback = buildingCallback; diff --git a/map/search_mark.cpp b/map/search_mark.cpp index c4fe9f5155..eb0c6b71cb 100644 --- a/map/search_mark.cpp +++ b/map/search_mark.cpp @@ -78,7 +78,7 @@ void SearchMarks::SetDrapeEngine(ref_ptr engine) m_drapeEngine.SafeCall(&df::DrapeEngine::RequestSymbolsSize, kSymbols, [this](std::vector const & sizes) { - GetPlatform().RunOnGuiThread([this, sizes](){ m_searchMarksSizes = sizes; }); + GetPlatform().RunTask(Platform::Thread::Gui, [this, sizes](){ m_searchMarksSizes = sizes; }); }); } diff --git a/map/traffic_manager.cpp b/map/traffic_manager.cpp index 7a67d36b88..c118ce2477 100644 --- a/map/traffic_manager.cpp +++ b/map/traffic_manager.cpp @@ -80,7 +80,7 @@ void TrafficManager::Teardown() void TrafficManager::SetStateListener(TrafficStateChangedFn const & onStateChangedFn) { - GetPlatform().RunOnGuiThread([this, onStateChangedFn]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, onStateChangedFn]() { m_onStateChangedFn = onStateChangedFn; }); @@ -440,7 +440,7 @@ void TrafficManager::ClearCache(MwmSet::MwmId const & mwmId) m_drapeEngine.SafeCall(&df::DrapeEngine::ClearTrafficCache, mwmId); - GetPlatform().RunOnGuiThread([this, mwmId]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, mwmId]() { m_observer.OnTrafficInfoRemoved(mwmId); }); @@ -527,7 +527,7 @@ void TrafficManager::ChangeState(TrafficState newState) "$TrafficChangeState", alohalytics::TStringMap({{"state", DebugPrint(m_state.load())}})); - GetPlatform().RunOnGuiThread([this, newState]() + GetPlatform().RunTask(Platform::Thread::Gui, [this, newState]() { if (m_onStateChangedFn != nullptr) m_onStateChangedFn(newState); diff --git a/partners_api/booking_api.cpp b/partners_api/booking_api.cpp index 20b498d43f..cd734cc8e6 100644 --- a/partners_api/booking_api.cpp +++ b/partners_api/booking_api.cpp @@ -322,7 +322,7 @@ string Api::GetSearchUrl(string const & city, string const & name) const void Api::GetMinPrice(string const & hotelId, string const & currency, GetMinPriceCallback const & fn) const { - GetPlatform().RunOnNetworkThread([hotelId, currency, fn]() + GetPlatform().RunTask(Platform::Thread::Network, [hotelId, currency, fn]() { string minPrice; string priceCurrency; @@ -350,7 +350,7 @@ void Api::GetMinPrice(string const & hotelId, string const & currency, void Api::GetHotelInfo(string const & hotelId, string const & lang, GetHotelInfoCallback const & fn) const { - GetPlatform().RunOnNetworkThread([hotelId, lang, fn]() + GetPlatform().RunTask(Platform::Thread::Network, [hotelId, lang, fn]() { HotelInfo info; info.m_hotelId = hotelId; @@ -379,7 +379,7 @@ void Api::GetHotelInfo(string const & hotelId, string const & lang, void Api::GetHotelAvailability(AvailabilityParams const & params, GetHotelAvailabilityCallback const & fn) const { - GetPlatform().RunOnNetworkThread([params, fn]() + GetPlatform().RunTask(Platform::Thread::Network, [params, fn]() { std::vector result; string httpResult; diff --git a/partners_api/cian_api.cpp b/partners_api/cian_api.cpp index 9d6ffd6409..53e29e99ee 100644 --- a/partners_api/cian_api.cpp +++ b/partners_api/cian_api.cpp @@ -138,7 +138,7 @@ uint64_t Api::GetRentNearby(ms::LatLon const & latlon, RentNearbyCallback const auto const mercatorRect = MercatorBounds::MetresToXY(latlon.lat, latlon.lon, kSearchRadius); auto const rect = MercatorBounds::ToLatLonRect(mercatorRect); - GetPlatform().RunOnNetworkThread([reqId, rect, onSuccess, onError, baseUrl]() { + GetPlatform().RunTask(Platform::Thread::Network, [reqId, rect, onSuccess, onError, baseUrl]() { std::vector result; auto const rawResult = RawApi::GetRentNearby(rect, baseUrl); diff --git a/partners_api/locals_api.cpp b/partners_api/locals_api.cpp index 72f304335f..e36fc73f68 100644 --- a/partners_api/locals_api.cpp +++ b/partners_api/locals_api.cpp @@ -95,8 +95,8 @@ uint64_t Api::GetLocals(double lat, double lon, std::string const & lang, LocalsErrorCallback const & errorFn) { uint64_t id = ++m_requestId; - GetPlatform().RunOnNetworkThread([id, lat, lon, lang, - resultsOnPage, pageNumber, successFn, errorFn]() + GetPlatform().RunTask(Platform::Thread::Network, + [id, lat, lon, lang, resultsOnPage, pageNumber, successFn, errorFn]() { std::string result; if (!RawApi::Get(lat, lon, lang, resultsOnPage, pageNumber, result)) diff --git a/partners_api/uber_api.cpp b/partners_api/uber_api.cpp index ed2cd67393..b0d1f0a006 100644 --- a/partners_api/uber_api.cpp +++ b/partners_api/uber_api.cpp @@ -252,7 +252,7 @@ void Api::GetAvailableProducts(ms::LatLon const & from, ms::LatLon const & to, maker->Reset(reqId); - GetPlatform().RunOnNetworkThread([maker, from, reqId, baseUrl, successFn, errorFn]() + GetPlatform().RunTask(Platform::Thread::Network, [maker, from, reqId, baseUrl, successFn, errorFn]() { string result; if (!RawApi::GetEstimatedTime(from, result, baseUrl)) @@ -262,7 +262,7 @@ void Api::GetAvailableProducts(ms::LatLon const & from, ms::LatLon const & to, maker->MakeProducts(reqId, successFn, errorFn); }); - GetPlatform().RunOnNetworkThread([maker, from, to, reqId, baseUrl, successFn, errorFn]() + GetPlatform().RunTask(Platform::Thread::Network, [maker, from, to, reqId, baseUrl, successFn, errorFn]() { string result; if (!RawApi::GetEstimatedPrice(from, to, result, baseUrl)) diff --git a/partners_api/viator_api.cpp b/partners_api/viator_api.cpp index ac8662971b..8b2ba349db 100644 --- a/partners_api/viator_api.cpp +++ b/partners_api/viator_api.cpp @@ -200,7 +200,7 @@ void Api::GetTop5Products(std::string const & destId, std::string const & curren std::string curr = kSupportedCurrencies.find(currency) == kSupportedCurrencies.cend() ? "USD" : currency; - GetPlatform().RunOnNetworkThread([destId, curr, fn]() + GetPlatform().RunTask(Platform::Thread::Network, [destId, curr, fn]() { string result; if (!RawApi::GetTopProducts(destId, curr, 5, result)) diff --git a/partners_api/yandex_api.cpp b/partners_api/yandex_api.cpp index 5c00ba260c..4f337c00a7 100644 --- a/partners_api/yandex_api.cpp +++ b/partners_api/yandex_api.cpp @@ -85,7 +85,7 @@ void Api::GetAvailableProducts(ms::LatLon const & from, ms::LatLon const & to, auto const baseUrl = m_baseUrl; - GetPlatform().RunOnNetworkThread([from, to, baseUrl, successFn, errorFn]() + GetPlatform().RunTask(Platform::Thread::Network, [from, to, baseUrl, successFn, errorFn]() { std::string result; if (!RawApi::GetTaxiInfo(from, to, result, baseUrl)) diff --git a/platform/platform.hpp b/platform/platform.hpp index 28afc9958b..ee5a73f24a 100644 --- a/platform/platform.hpp +++ b/platform/platform.hpp @@ -68,6 +68,13 @@ public: Unplugged }; + enum class Thread : uint8_t + { + File, + Network, + Gui + }; + using TFilesWithType = vector>; protected: @@ -208,28 +215,6 @@ public: TStorageStatus GetWritableStorageStatus(uint64_t neededSize) const; uint64_t GetWritableStorageSpace() const; - /// @name Functions for concurrent tasks. - //@{ - void RunOnGuiThread(base::TaskLoop::Task && task); - void RunOnGuiThread(base::TaskLoop::Task const & task); - - template - void RunOnNetworkThread(Task && task) { m_networkThread.Push(forward(task)); } - - template - void RunOnFileThread(Task && task) { m_fileThread.Push(forward(task)); } - - enum Priority - { - EPriorityBackground, - EPriorityLow, - EPriorityDefault, - EPriorityHigh - }; - using TFunctor = function; - void RunAsync(TFunctor const & fn, Priority p = EPriorityDefault); - //@} - // Please note, that number of active cores can vary at runtime. // DO NOT assume for the same return value between calls. unsigned CpuCores() const; @@ -270,12 +255,49 @@ public: MarketingService & GetMarketingService() { return m_marketingService; } platform::SecureStorage & GetSecureStorage() { return m_secureStorage; } + template + void RunTask(Thread thread, Task && task) + { + switch (thread) + { + case Thread::File: + m_fileThread.Push(forward(task)); + break; + case Thread::Network: + m_networkThread.Push(forward(task)); + break; + case Thread::Gui: + RunOnGuiThread(forward(task)); + break; + } + } + + template + void RunTask(Thread thread, Task const & task) + { + switch (thread) + { + case Thread::File: + m_fileThread.Push(task); + break; + case Thread::Network: + m_networkThread.Push(task); + break; + case Thread::Gui: + RunOnGuiThread(task); + break; + } + } + void ShutdownThreads(); // Use this method for testing purposes only. void SetGuiThread(unique_ptr guiThread); private: + void RunOnGuiThread(base::TaskLoop::Task && task); + void RunOnGuiThread(base::TaskLoop::Task const & task); + void GetSystemFontNames(FilesList & res) const; }; diff --git a/platform/platform_android.cpp b/platform/platform_android.cpp index 84c799e376..dc19c31d78 100644 --- a/platform/platform_android.cpp +++ b/platform/platform_android.cpp @@ -265,26 +265,3 @@ void Platform::SetupMeasurementSystem() const /// @see implementation of methods below in android/jni/com/.../Platform.cpp // void RunOnGuiThread(base::TaskLoop::Task && task); // void RunOnGuiThread(base::TaskLoop::Task const & task); - -namespace -{ -class FunctorWrapper : public threads::IRoutine -{ - Platform::TFunctor m_fn; - -public: - FunctorWrapper(Platform::TFunctor const & fn) : m_fn(fn) {} - - void Do() override { m_fn(); } -}; -} - -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - UNUSED_VALUE(p); - - // We don't need to store thread handler in POSIX, just create and - // run. Unfortunately we can't use std::async() here since it - // doesn't attach to JVM threads. - threads::Thread().Create(make_unique(fn)); -} diff --git a/platform/platform_ios.mm b/platform/platform_ios.mm index 1ce7f8764d..944a69faf5 100644 --- a/platform/platform_ios.mm +++ b/platform/platform_ios.mm @@ -120,12 +120,6 @@ int Platform::VideoMemoryLimit() const { return 8 * 1024 * 1024; } int Platform::PreCachingDepth() const { return 2; } string Platform::UniqueClientId() const { return [Alohalytics installationId].UTF8String; } -static void PerformImpl(void * obj) -{ - Platform::TFunctor * f = reinterpret_cast(obj); - (*f)(); - delete f; -} string Platform::GetMemoryInfo() const { @@ -159,19 +153,6 @@ void Platform::RunOnGuiThread(base::TaskLoop::Task const & task) m_guiThread->Push(task); } -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - int priority = DISPATCH_QUEUE_PRIORITY_DEFAULT; - switch (p) - { - case EPriorityBackground: priority = DISPATCH_QUEUE_PRIORITY_BACKGROUND; break; - case EPriorityDefault: priority = DISPATCH_QUEUE_PRIORITY_DEFAULT; break; - case EPriorityHigh: priority = DISPATCH_QUEUE_PRIORITY_HIGH; break; - case EPriorityLow: priority = DISPATCH_QUEUE_PRIORITY_LOW; break; - } - dispatch_async_f(dispatch_get_global_queue(priority, 0), new TFunctor(fn), &PerformImpl); -} - Platform::EConnectionType Platform::ConnectionStatus() { struct sockaddr_in zero; diff --git a/platform/platform_mac.mm b/platform/platform_mac.mm index fe638c4c56..dd82a46a02 100644 --- a/platform/platform_mac.mm +++ b/platform/platform_mac.mm @@ -113,13 +113,6 @@ Platform::Platform() string Platform::UniqueClientId() const { return [Alohalytics installationId].UTF8String; } -static void PerformImpl(void * obj) -{ - Platform::TFunctor * f = reinterpret_cast(obj); - (*f)(); - delete f; -} - void Platform::RunOnGuiThread(base::TaskLoop::Task && task) { ASSERT(m_guiThread, ()); @@ -132,21 +125,6 @@ void Platform::RunOnGuiThread(base::TaskLoop::Task const & task) m_guiThread->Push(task); } -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - int priority = DISPATCH_QUEUE_PRIORITY_DEFAULT; - switch (p) - { - case EPriorityDefault: priority = DISPATCH_QUEUE_PRIORITY_DEFAULT; break; - case EPriorityHigh: priority = DISPATCH_QUEUE_PRIORITY_HIGH; break; - case EPriorityLow: priority = DISPATCH_QUEUE_PRIORITY_LOW; break; - // It seems like this option is not supported in Snow Leopard. - //case EPriorityBackground: priority = DISPATCH_QUEUE_PRIORITY_BACKGROUND; break; - default: priority = INT16_MIN; - } - dispatch_async_f(dispatch_get_global_queue(priority, 0), new TFunctor(fn), &PerformImpl); -} - Platform::EConnectionType Platform::ConnectionStatus() { struct sockaddr_in zero; diff --git a/platform/platform_qt.cpp b/platform/platform_qt.cpp index 3e4348cf68..b84e5b97d6 100644 --- a/platform/platform_qt.cpp +++ b/platform/platform_qt.cpp @@ -95,11 +95,6 @@ void Platform::RunOnGuiThread(base::TaskLoop::Task const & task) ASSERT(m_guiThread, ()); m_guiThread->Push(task); } - -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - async(fn); -} #endif // defined(OMIM_OS_LINUX) extern Platform & GetPlatform() diff --git a/platform/platform_tizen.cpp b/platform/platform_tizen.cpp index 1d9e7d5b1c..f05ea6dbe6 100644 --- a/platform/platform_tizen.cpp +++ b/platform/platform_tizen.cpp @@ -61,12 +61,6 @@ void Platform::RunOnGuiThread(TFunctor const & fn) fn(); } -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - /// @todo - fn(); -} - ModelReader * Platform::GetReader(string const & file, string const & searchScope) const { return new FileReader(ReadPathForFile(file, searchScope), diff --git a/platform/platform_win.cpp b/platform/platform_win.cpp index 03eae8d4e2..97841fd875 100644 --- a/platform/platform_win.cpp +++ b/platform/platform_win.cpp @@ -132,12 +132,6 @@ void Platform::RunOnGuiThread(TFunctor const & fn) fn(); } -void Platform::RunAsync(TFunctor const & fn, Priority p) -{ - /// @todo - fn(); -} - Platform::EConnectionType Platform::ConnectionStatus() { // @TODO Add implementation diff --git a/platform/safe_callback.hpp b/platform/safe_callback.hpp index 313e095fc5..2f4f4254dd 100644 --- a/platform/safe_callback.hpp +++ b/platform/safe_callback.hpp @@ -32,7 +32,7 @@ public: void operator()(Args... args) const { - GetPlatform().RunOnGuiThread(std::bind(m_fn, std::move(args)...)); + GetPlatform().RunTask(Platform::Thread::Gui, std::bind(m_fn, std::move(args)...)); } private: diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp index d3633cadc7..053629ff2f 100644 --- a/qt/search_panel.cpp +++ b/qt/search_panel.cpp @@ -262,7 +262,8 @@ void SearchPanel::OnSearchTextChanged(QString const & str) auto const timestamp = ++m_timestamp; m_params.m_onResults = [this, timestamp](search::Results const & results, vector const & /* isLocalAdsCustomer */) { - GetPlatform().RunOnGuiThread(bind(&SearchPanel::OnSearchResults, this, timestamp, results)); + GetPlatform().RunTask(Platform::Thread::Gui, bind(&SearchPanel::OnSearchResults, this, + timestamp, results)); }; if (m_pDrawWidget->Search(m_params)) diff --git a/search/search_quality/assessment_tool/main_model.cpp b/search/search_quality/assessment_tool/main_model.cpp index a4f3b30aa7..4650bd4e82 100644 --- a/search/search_quality/assessment_tool/main_model.cpp +++ b/search/search_quality/assessment_tool/main_model.cpp @@ -165,8 +165,8 @@ void MainModel::OnSampleSelected(int index) } } - GetPlatform().RunOnGuiThread(bind(&MainModel::OnResults, this, timestamp, index, results, - relevances, goldenMatching, actualMatching)); + GetPlatform().RunTask(Platform::Thread::Gui, bind(&MainModel::OnResults, this, timestamp, index, results, + relevances, goldenMatching, actualMatching)); }; m_queryHandle = engine.Search(params); diff --git a/storage/diff_scheme/diff_manager.cpp b/storage/diff_scheme/diff_manager.cpp index d6dfcb63df..159acd1e10 100644 --- a/storage/diff_scheme/diff_manager.cpp +++ b/storage/diff_scheme/diff_manager.cpp @@ -41,7 +41,7 @@ void Manager::Load(LocalMapsInfo && info) auto & observers = m_observers; auto status = m_status; - GetPlatform().RunOnGuiThread([observers, status]() mutable { + GetPlatform().RunTask(Platform::Thread::Gui, [observers, status]() mutable { observers.ForEach(&Observer::OnDiffStatusReceived, status); }); }); diff --git a/storage/downloading_policy.cpp b/storage/downloading_policy.cpp index 758f152af8..533e56490a 100644 --- a/storage/downloading_policy.cpp +++ b/storage/downloading_policy.cpp @@ -32,7 +32,7 @@ void StorageDownloadingPolicy::ScheduleRetry(storage::TCountriesSet const & fail --m_autoRetryCounter; func(failedCountries); }; - m_autoRetryWorker.RestartWith([action]{ GetPlatform().RunOnGuiThread(action); }); + m_autoRetryWorker.RestartWith([action]{ GetPlatform().RunTask(Platform::Thread::Gui, action); }); } else { diff --git a/storage/storage.cpp b/storage/storage.cpp index 585812a74b..2455e2d38f 100644 --- a/storage/storage.cpp +++ b/storage/storage.cpp @@ -1422,7 +1422,7 @@ void Storage::ApplyDiff(TCountryId const & countryId, function