From 00ad11eb0454eb51dc71a363b6b07589c804c9ce Mon Sep 17 00:00:00 2001 From: Adrian Cojocaru Date: Mon, 13 Oct 2025 23:57:13 +0300 Subject: [PATCH] Add query annotation timeout (#3874) --- .../src/cpp/android_renderer_frontend.cpp | 20 +++++++++++++++---- .../src/cpp/android_renderer_frontend.hpp | 4 ++-- .../src/cpp/native_map_view.cpp | 4 ++-- .../src/cpp/native_map_view.hpp | 2 ++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 764fac17d..32d22c85d 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -188,14 +188,26 @@ std::vector AndroidRendererFrontend::queryRenderedFeatures(const Screen return mapRenderer.actor().ask(fn, point, options).get(); } -AnnotationIDs AndroidRendererFrontend::queryPointAnnotations(const ScreenBox& box) const { +AnnotationIDs AndroidRendererFrontend::queryPointAnnotations(const ScreenBox& box, + const std::chrono::milliseconds& timeout) const { // Waits for the result from the orchestration thread and returns - return mapRenderer.actor().ask(&Renderer::queryPointAnnotations, box).get(); + auto future = mapRenderer.actor().ask(&Renderer::queryPointAnnotations, box); + if (future.wait_for(timeout) != std::future_status::ready) { + return {}; + } + + return future.get(); } -AnnotationIDs AndroidRendererFrontend::queryShapeAnnotations(const ScreenBox& box) const { +AnnotationIDs AndroidRendererFrontend::queryShapeAnnotations(const ScreenBox& box, + const std::chrono::milliseconds& timeout) const { // Waits for the result from the orchestration thread and returns - return mapRenderer.actor().ask(&Renderer::queryShapeAnnotations, box).get(); + auto future = mapRenderer.actor().ask(&Renderer::queryShapeAnnotations, box); + if (future.wait_for(timeout) != std::future_status::ready) { + return {}; + } + + return future.get(); } FeatureExtensionValue AndroidRendererFrontend::queryFeatureExtensions( diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp index 60c273815..37e5af7a3 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp @@ -52,8 +52,8 @@ public: std::vector queryRenderedFeatures(const ScreenCoordinate&, const RenderedQueryOptions&) const; std::vector queryRenderedFeatures(const ScreenBox&, const RenderedQueryOptions&) const; std::vector querySourceFeatures(const std::string& sourceID, const SourceQueryOptions&) const; - AnnotationIDs queryPointAnnotations(const ScreenBox& box) const; - AnnotationIDs queryShapeAnnotations(const ScreenBox& box) const; + AnnotationIDs queryPointAnnotations(const ScreenBox& box, const std::chrono::milliseconds& timeout) const; + AnnotationIDs queryShapeAnnotations(const ScreenBox& box, const std::chrono::milliseconds& timeout) const; // Feature extension query FeatureExtensionValue queryFeatureExtensions(const std::string& sourceID, diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 2b50c349c..bda6b12eb 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -944,7 +944,7 @@ jni::Local> NativeMapView::queryPointAnnotations(JNIEnv& env, }; // Assume only points for now - mbgl::AnnotationIDs ids = rendererFrontend->queryPointAnnotations(box); + mbgl::AnnotationIDs ids = rendererFrontend->queryPointAnnotations(box, annotationRequestTimeout); // Convert result std::vector longIds(ids.begin(), ids.end()); @@ -964,7 +964,7 @@ jni::Local> NativeMapView::queryShapeAnnotations(JNIEnv& env, {RectF::getRight(env, rect), RectF::getBottom(env, rect)}, }; - mbgl::AnnotationIDs ids = rendererFrontend->queryShapeAnnotations(box); + mbgl::AnnotationIDs ids = rendererFrontend->queryShapeAnnotations(box, annotationRequestTimeout); // Convert result std::vector longIds(ids.begin(), ids.end()); diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index f9a0c7a3e..2497925cb 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -362,6 +362,8 @@ private: int width = 64; int height = 64; + static constexpr auto annotationRequestTimeout = std::chrono::milliseconds(200); + // Ensure these are initialised last std::unique_ptr map; };