-
由 Chinmay Garde 提交于
Embedders may use this to specify a thread whose event loop is managed by them instead of the engine. In addition, specifying the same task runner for both the platform and render task runners allows embedders to effectively perform GPU rendering operations on the platform thread. To affect this change, the following non breaking changes to the API have been made: * The `FlutterCustomTaskRunners` struct now has a new field `render_task_runner` for the specification of a custom render task runner. * The `FlutterTaskRunnerDescription` has a new field `identifier`. Embedders must supply a unique identifier for each task runner they specify. In addition, when describing multiple task runners that run their tasks on the same thread, their identifiers must match. * The embedder may need to process tasks during `FlutterEngineRun` and `FlutterEngineShutdown`. However, the embedder doesn't have the Flutter engine handle before `FlutterEngineRun` and is supposed to relinquish handle right before `FlutterEngineShutdown`. Since the embedder needs the Flutter engine handle to service tasks on other threads while these calls are underway, there exist opportunities for deadlock. To work around this scenario, three new calls have been added that allow more deliberate management of the Flutter engine instance. * `FlutterEngineRun` can be replaced with `FlutterEngineInitialize` and `FlutterEngineRunInitialized`. The embedder can obtain a handle to the engine after the first call but the engine will not post any tasks to custom task runners specified by the embedder till the `FlutterEngineRunInitialized` call. Embedders can guard the Flutter engine handle behind a mutex for safe task runner interop. * `FlutterEngineShutdown` can be preceded by the `FlutterEngineDeinitialize` call. After this call the Flutter engine will no longer post tasks onto embedder managed task runners. It is still embedder responsibility to collect the Flutter engine handle via `FlutterEngineShutdown`. * To maintain backwards compatibility with the old APIs, `FlutterEngineRun` is now just a convenience for `FlutterEngineInitialize` and `FlutterEngineRunInitilaized`. `FlutterEngineShutdown` now implicitly calls `FlutterEngineDeinitialize` as well. This allows existing users who don't care are custom task runner interop to keep using the old APIs. * Adds complete test coverage for both old and new paths. Fixes https://github.com/flutter/flutter/issues/42460 Prerequisite for https://github.com/flutter/flutter/issues/17579
bf81971f