Revert "[engine] move asset mapping copy to background thread (#39918)" (#40147)
Revert "[engine] move asset mapping copy to background thread"
diff --git a/fml/concurrent_message_loop.cc b/fml/concurrent_message_loop.cc
index f553654..681b983 100644
--- a/fml/concurrent_message_loop.cc
+++ b/fml/concurrent_message_loop.cc
@@ -170,14 +170,4 @@
task();
}
-bool ConcurrentMessageLoop::RunsTasksOnCurrentThread() {
- std::scoped_lock lock(tasks_mutex_);
- for (const auto& worker_thread_id : worker_thread_ids_) {
- if (worker_thread_id == std::this_thread::get_id()) {
- return true;
- }
- }
- return false;
-}
-
} // namespace fml
diff --git a/fml/concurrent_message_loop.h b/fml/concurrent_message_loop.h
index ab8534b..c043705 100644
--- a/fml/concurrent_message_loop.h
+++ b/fml/concurrent_message_loop.h
@@ -34,8 +34,6 @@
void PostTaskToAllWorkers(const fml::closure& task);
- bool RunsTasksOnCurrentThread();
-
private:
friend ConcurrentTaskRunner;
diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart
index ee2d173..30cc3d3 100644
--- a/lib/ui/painting.dart
+++ b/lib/ui/painting.dart
@@ -6294,12 +6294,7 @@
final ImmutableBuffer instance = ImmutableBuffer._(0);
return _futurize((_Callback<int> callback) {
return instance._initFromAsset(encodedKey, callback);
- }).then((int length) {
- if (length == -1) {
- throw Exception('Asset not found');
- }
- return instance.._length = length;
- });
+ }).then((int length) => instance.._length = length);
}
/// Create a buffer from the file with [path].
diff --git a/lib/ui/painting/immutable_buffer.cc b/lib/ui/painting/immutable_buffer.cc
index 0595eb8..0d86b07 100644
--- a/lib/ui/painting/immutable_buffer.cc
+++ b/lib/ui/painting/immutable_buffer.cc
@@ -43,7 +43,7 @@
return Dart_Null();
}
-Dart_Handle ImmutableBuffer::initFromAsset(Dart_Handle raw_buffer_handle,
+Dart_Handle ImmutableBuffer::initFromAsset(Dart_Handle buffer_handle,
Dart_Handle asset_name_handle,
Dart_Handle callback_handle) {
UIDartState::ThrowIfUIOperationsProhibited();
@@ -62,55 +62,21 @@
std::string asset_name = std::string{reinterpret_cast<const char*>(chars),
static_cast<size_t>(asset_length)};
- auto* dart_state = UIDartState::Current();
- auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
- auto buffer_callback =
- std::make_unique<tonic::DartPersistentValue>(dart_state, callback_handle);
- auto buffer_handle = std::make_unique<tonic::DartPersistentValue>(
- dart_state, raw_buffer_handle);
- auto asset_manager = UIDartState::Current()
- ->platform_configuration()
- ->client()
- ->GetAssetManager();
+ std::shared_ptr<AssetManager> asset_manager = UIDartState::Current()
+ ->platform_configuration()
+ ->client()
+ ->GetAssetManager();
+ std::unique_ptr<fml::Mapping> data = asset_manager->GetAsMapping(asset_name);
+ if (data == nullptr) {
+ return tonic::ToDart("Asset not found");
+ }
- auto ui_task = fml::MakeCopyable(
- [buffer_callback = std::move(buffer_callback),
- buffer_handle = std::move(buffer_handle)](const sk_sp<SkData>& sk_data,
- size_t buffer_size) mutable {
- auto dart_state = buffer_callback->dart_state().lock();
- if (!dart_state) {
- return;
- }
- tonic::DartState::Scope scope(dart_state);
- if (!sk_data) {
- // -1 is used as a sentinel that the file could not be opened.
- tonic::DartInvoke(buffer_callback->Get(), {tonic::ToDart(-1)});
- return;
- }
- auto buffer = fml::MakeRefCounted<ImmutableBuffer>(sk_data);
- buffer->AssociateWithDartWrapper(buffer_handle->Get());
- tonic::DartInvoke(buffer_callback->Get(), {tonic::ToDart(buffer_size)});
- });
-
- dart_state->GetConcurrentTaskRunner()->PostTask(
- [asset_name = std::move(asset_name),
- asset_manager = std::move(asset_manager),
- ui_task_runner = std::move(ui_task_runner), ui_task] {
- std::unique_ptr<fml::Mapping> mapping =
- asset_manager->GetAsMapping(asset_name);
-
- sk_sp<SkData> sk_data;
- size_t buffer_size = 0;
- if (mapping != nullptr) {
- buffer_size = mapping->GetSize();
- const void* bytes = static_cast<const void*>(mapping->GetMapping());
- sk_data = MakeSkDataWithCopy(bytes, buffer_size);
- }
- ui_task_runner->PostTask(
- [sk_data = std::move(sk_data), ui_task = ui_task, buffer_size]() {
- ui_task(sk_data, buffer_size);
- });
- });
+ auto size = data->GetSize();
+ const void* bytes = static_cast<const void*>(data->GetMapping());
+ auto sk_data = MakeSkDataWithCopy(bytes, size);
+ auto buffer = fml::MakeRefCounted<ImmutableBuffer>(sk_data);
+ buffer->AssociateWithDartWrapper(buffer_handle);
+ tonic::DartInvoke(callback_handle, {tonic::ToDart(size)});
return Dart_Null();
}
diff --git a/shell/common/fixtures/shell_test.dart b/shell/common/fixtures/shell_test.dart
index b88289a..605e3d9 100644
--- a/shell/common/fixtures/shell_test.dart
+++ b/shell/common/fixtures/shell_test.dart
@@ -470,11 +470,3 @@
}
notifyNativeBool(true);
}
-
-@pragma('vm:entry-point')
-Future<void> testThatAssetLoadingHappensOnWorkerThread() async {
- try {
- await ImmutableBuffer.fromAsset('DoesNotExist');
- } catch (err) { /* Do nothing */ }
- notifyNative();
-}
diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc
index 36c8646..449822c 100644
--- a/shell/common/shell_unittests.cc
+++ b/shell/common/shell_unittests.cc
@@ -19,7 +19,6 @@
#include "flutter/flow/layers/layer_raster_cache_item.h"
#include "flutter/flow/layers/platform_view_layer.h"
#include "flutter/flow/layers/transform_layer.h"
-#include "flutter/fml/backtrace.h"
#include "flutter/fml/command_line.h"
#include "flutter/fml/dart/dart_converter.h"
#include "flutter/fml/make_copyable.h"
@@ -195,42 +194,6 @@
AssetResolver::AssetResolverType type_;
};
-class ThreadCheckingAssetResolver : public AssetResolver {
- public:
- explicit ThreadCheckingAssetResolver(
- std::shared_ptr<fml::ConcurrentMessageLoop> concurrent_loop)
- : concurrent_loop_(std::move(concurrent_loop)) {}
-
- // |AssetResolver|
- bool IsValid() const override { return true; }
-
- // |AssetResolver|
- bool IsValidAfterAssetManagerChange() const override { return true; }
-
- // |AssetResolver|
- AssetResolverType GetType() const {
- return AssetResolverType::kApkAssetProvider;
- }
-
- // |AssetResolver|
- std::unique_ptr<fml::Mapping> GetAsMapping(
- const std::string& asset_name) const override {
- if (asset_name == "FontManifest.json") {
- // This file is loaded directly by the engine.
- return nullptr;
- }
- mapping_requests.push_back(asset_name);
- EXPECT_TRUE(concurrent_loop_->RunsTasksOnCurrentThread())
- << fml::BacktraceHere();
- return nullptr;
- }
-
- mutable std::vector<std::string> mapping_requests;
-
- private:
- std::shared_ptr<fml::ConcurrentMessageLoop> concurrent_loop_;
-};
-
static bool ValidateShell(Shell* shell) {
if (!shell) {
return false;
@@ -3842,39 +3805,6 @@
ASSERT_FALSE(DartVMRef::IsInstanceRunning());
}
-TEST_F(ShellTest, ImmutableBufferLoadsAssetOnBackgroundThread) {
- Settings settings = CreateSettingsForFixture();
- auto task_runner = CreateNewThread();
- TaskRunners task_runners("test", task_runner, task_runner, task_runner,
- task_runner);
- std::unique_ptr<Shell> shell = CreateShell(settings, task_runners);
-
- fml::CountDownLatch latch(1);
- AddNativeCallback("NotifyNative",
- CREATE_NATIVE_ENTRY([&](auto args) { latch.CountDown(); }));
-
- // Create the surface needed by rasterizer
- PlatformViewNotifyCreated(shell.get());
-
- auto configuration = RunConfiguration::InferFromSettings(settings);
- configuration.SetEntrypoint("testThatAssetLoadingHappensOnWorkerThread");
- auto asset_manager = configuration.GetAssetManager();
- auto test_resolver = std::make_unique<ThreadCheckingAssetResolver>(
- shell->GetDartVM()->GetConcurrentMessageLoop());
- auto leaked_resolver = test_resolver.get();
- asset_manager->PushBack(std::move(test_resolver));
-
- RunEngine(shell.get(), std::move(configuration));
- PumpOneFrame(shell.get());
-
- latch.Wait();
-
- EXPECT_EQ(leaked_resolver->mapping_requests[0], "DoesNotExist");
-
- PlatformViewNotifyDestroyed(shell.get());
- DestroyShell(std::move(shell), task_runners);
-}
-
TEST_F(ShellTest, PictureToImageSync) {
#if !SHELL_ENABLE_GL
// This test uses the GL backend.