From 4add9ead08799577a37c465b8cb1266676b6c41e Mon Sep 17 00:00:00 2001 From: Tim Sylvester Date: Thu, 15 Aug 2024 07:10:08 -0700 Subject: [PATCH] Scheduling optimizations and tracing (#2722) --- .../MapLibreAndroid/src/cpp/map_renderer.cpp | 7 ++++-- src/mbgl/actor/mailbox.cpp | 25 +++++++++++++------ src/mbgl/gl/buffer_allocator.cpp | 3 +++ src/mbgl/renderer/image_manager.cpp | 15 +++++------ src/mbgl/tile/geometry_tile.cpp | 3 +++ src/mbgl/util/thread_pool.cpp | 19 +++++++++----- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp index 80009ffe5..e71a4700c 100644 --- a/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/map_renderer.cpp @@ -1,9 +1,10 @@ #include "map_renderer.hpp" -#include #include -#include +#include +#include #include +#include #include @@ -63,6 +64,7 @@ ActorRef MapRenderer::actor() const { } void MapRenderer::schedule(std::function&& scheduled) { + MLN_TRACE_FUNC() try { // Create a runnable android::UniqueEnv _env = android::AttachEnv(); @@ -76,6 +78,7 @@ void MapRenderer::schedule(std::function&& scheduled) { static auto queueEvent = javaClass.GetMethod)>(*_env, "queueEvent"); auto weakReference = javaPeer.get(*_env); if (weakReference) { + MLN_TRACE_ZONE(java) weakReference.Call(*_env, queueEvent, peer); } diff --git a/src/mbgl/actor/mailbox.cpp b/src/mbgl/actor/mailbox.cpp index ef54c6bb7..85a9e1da9 100644 --- a/src/mbgl/actor/mailbox.cpp +++ b/src/mbgl/actor/mailbox.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -75,6 +76,7 @@ bool Mailbox::isOpen() const { } void Mailbox::push(std::unique_ptr message) { + MLN_TRACE_FUNC() auto idleState = State::Idle; while (!state.compare_exchange_strong(idleState, State::Processing)) { if (state == State::Abandoned) { @@ -88,6 +90,7 @@ void Mailbox::push(std::unique_ptr message) { } }}; + MLN_TRACE_ZONE(push lock) std::lock_guard pushingLock(pushingMutex); if (closed) { @@ -95,12 +98,20 @@ void Mailbox::push(std::unique_ptr message) { return; } - std::lock_guard queueLock(queueMutex); - bool wasEmpty = queue.empty(); - queue.push(std::move(message)); - auto guard = weakScheduler.lock(); - if (wasEmpty && weakScheduler) { - weakScheduler->schedule(schedulerTag, makeClosure(shared_from_this())); + bool wasEmpty = false; + { + MLN_TRACE_ZONE(queue lock) + std::lock_guard queueLock(queueMutex); + wasEmpty = queue.empty(); + queue.push(std::move(message)); + } + + if (wasEmpty) { + auto guard = weakScheduler.lock(); + if (weakScheduler) { + MLN_TRACE_ZONE(schedule) + weakScheduler->schedule(schedulerTag, makeClosure(shared_from_this())); + } } } @@ -125,7 +136,7 @@ void Mailbox::receive() { } std::unique_ptr message; - bool wasEmpty; + bool wasEmpty = false; { std::lock_guard queueLock(queueMutex); diff --git a/src/mbgl/gl/buffer_allocator.cpp b/src/mbgl/gl/buffer_allocator.cpp index ae0d2caeb..bd02788bd 100644 --- a/src/mbgl/gl/buffer_allocator.cpp +++ b/src/mbgl/gl/buffer_allocator.cpp @@ -2,6 +2,8 @@ #include #include #include +#include + #include namespace mbgl { @@ -298,6 +300,7 @@ public: // Look for buffers that either have zero living references or equal or under FragmentationThresh // references. In the latter case, attempt to relocate these allocations to more utilized buffers. void defragment(const std::shared_ptr& fence) override { + MLN_TRACE_FUNC() if (buffers.size() == 0) { return; } diff --git a/src/mbgl/renderer/image_manager.cpp b/src/mbgl/renderer/image_manager.cpp index 3029999ee..a7b0d9e94 100644 --- a/src/mbgl/renderer/image_manager.cpp +++ b/src/mbgl/renderer/image_manager.cpp @@ -198,12 +198,11 @@ void ImageManager::reduceMemoryUseIfCacheSizeExceedsLimit() { } std::set ImageManager::getAvailableImages() const { - std::set copy; - { - std::lock_guard readWriteLock(rwLock); - copy = availableImages; - } - return copy; + MLN_TRACE_FUNC() + std::lock_guard readWriteLock(rwLock); + + MLN_TRACE_ZONE(copy) + return availableImages; } void ImageManager::clear() { @@ -309,9 +308,7 @@ void ImageManager::notify(ImageRequestor& requestor, const ImageRequestPair& pai } void ImageManager::dumpDebugLogs() const { - std::ostringstream ss; - ss << "ImageManager::loaded: " << loaded; - Log::Info(Event::General, ss.str()); + Log::Info(Event::General, "ImageManager::loaded: " + std::string(loaded ? "1" : "0")); } ImageRequestor::ImageRequestor(std::shared_ptr imageManager_) diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index c482ff351..b3205f629 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -30,6 +30,7 @@ namespace mbgl { LayerRenderData* GeometryTile::LayoutResult::getLayerRenderData(const style::Layer::Impl& layerImpl) { MLN_TRACE_FUNC() + MLN_ZONE_STR(layerImpl.id) auto it = layerRenderData.find(layerImpl.id); if (it == layerRenderData.end()) { @@ -258,6 +259,8 @@ void GeometryTile::setLayers(const std::vector>& laye impls.reserve(layers.size()); for (const auto& layer : layers) { + MLN_TRACE_ZONE(layer) + MLN_ZONE_STR(layer->baseImpl->id) // Skip irrelevant layers. const auto& layerImpl = *layer->baseImpl; assert(layerImpl.getTypeInfo()->source != LayerTypeInfo::Source::NotRequired); diff --git a/src/mbgl/util/thread_pool.cpp b/src/mbgl/util/thread_pool.cpp index a2e4cc09d..a2f70cfd1 100644 --- a/src/mbgl/util/thread_pool.cpp +++ b/src/mbgl/util/thread_pool.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -109,22 +110,28 @@ void ThreadedSchedulerBase::schedule(std::function&& fn) { } void ThreadedSchedulerBase::schedule(const util::SimpleIdentity tag, std::function&& fn) { + MLN_TRACE_FUNC() assert(fn); if (!fn) return; std::shared_ptr q; { + MLN_TRACE_ZONE(queue) std::lock_guard lock(taggedQueueLock); - auto it = taggedQueue.find(tag); - if (it == taggedQueue.end()) { - q = std::make_shared(); - taggedQueue.insert({tag, q}); - } else { - q = it->second; + + // find or insert + auto result = taggedQueue.insert(std::make_pair(tag, std::shared_ptr{})); + if (result.second) { + // new entry inserted + result.first->second = std::make_shared(); } + q = result.first->second; + + MLN_ZONE_VALUE(taggedQueue.size()) } { + MLN_TRACE_ZONE(push) std::lock_guard lock(q->lock); q->queue.push(std::move(fn)); taskCount++;