Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 30088b9

Browse files
committed
Allow running with merged platform and UI threads
1 parent ecabb1a commit 30088b9

File tree

4 files changed

+104
-0
lines changed

4 files changed

+104
-0
lines changed

engine/src/flutter/shell/platform/linux/fl_dart_project.cc

+16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ struct _FlDartProject {
1313
gchar* assets_path;
1414
gchar* icu_data_path;
1515
gchar** dart_entrypoint_args;
16+
17+
FlUIThreadPolicy ui_thread_policy;
1618
};
1719

1820
G_DEFINE_TYPE(FlDartProject, fl_dart_project, G_TYPE_OBJECT)
@@ -114,3 +116,17 @@ G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(
114116
g_clear_pointer(&self->dart_entrypoint_args, g_strfreev);
115117
self->dart_entrypoint_args = g_strdupv(argv);
116118
}
119+
120+
G_MODULE_EXPORT
121+
void fl_dart_project_set_ui_thread_policy(FlDartProject* project,
122+
FlUIThreadPolicy policy) {
123+
g_return_if_fail(FL_IS_DART_PROJECT(project));
124+
project->ui_thread_policy = policy;
125+
}
126+
127+
G_MODULE_EXPORT
128+
FlUIThreadPolicy fl_dart_project_get_ui_thread_policy(FlDartProject* project) {
129+
g_return_val_if_fail(FL_IS_DART_PROJECT(project),
130+
FL_UI_THREAD_POLICY_DEFAULT);
131+
return project->ui_thread_policy;
132+
}

engine/src/flutter/shell/platform/linux/fl_engine.cc

+5
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,11 @@ gboolean fl_engine_start(FlEngine* self, GError** error) {
637637
custom_task_runners.struct_size = sizeof(FlutterCustomTaskRunners);
638638
custom_task_runners.platform_task_runner = &platform_task_runner;
639639

640+
if (fl_dart_project_get_ui_thread_policy(self->project) ==
641+
FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD) {
642+
custom_task_runners.ui_task_runner = &platform_task_runner;
643+
}
644+
640645
g_autoptr(GPtrArray) command_line_args =
641646
g_ptr_array_new_with_free_func(g_free);
642647
g_ptr_array_insert(command_line_args, 0, g_strdup("flutter"));

engine/src/flutter/shell/platform/linux/fl_engine_test.cc

+51
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,57 @@ TEST(FlEngineTest, EngineId) {
439439
EXPECT_EQ(fl_engine_for_id(engine_id), engine);
440440
}
441441

442+
TEST(FlEngineTest, UIIsolateOnPlatformTaskRunner) {
443+
g_autoptr(FlDartProject) project = fl_dart_project_new();
444+
g_autoptr(FlEngine) engine = fl_engine_new(project);
445+
fl_dart_project_set_ui_thread_policy(
446+
project, FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD);
447+
448+
bool same_task_runner = false;
449+
450+
fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
451+
Initialize,
452+
([&same_task_runner](size_t version, const FlutterRendererConfig* config,
453+
const FlutterProjectArgs* args, void* user_data,
454+
FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
455+
same_task_runner = args->custom_task_runners->platform_task_runner ==
456+
args->custom_task_runners->ui_task_runner;
457+
return kSuccess;
458+
}));
459+
fl_engine_get_embedder_api(engine)->RunInitialized =
460+
MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
461+
462+
g_autoptr(GError) error = nullptr;
463+
EXPECT_TRUE(fl_engine_start(engine, &error));
464+
EXPECT_EQ(error, nullptr);
465+
EXPECT_TRUE(same_task_runner);
466+
}
467+
468+
TEST(FlEngineTest, UIIsolateOnSeparateThread) {
469+
g_autoptr(FlDartProject) project = fl_dart_project_new();
470+
g_autoptr(FlEngine) engine = fl_engine_new(project);
471+
fl_dart_project_set_ui_thread_policy(
472+
project, FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD);
473+
474+
bool separate_thread = false;
475+
476+
fl_engine_get_embedder_api(engine)->Initialize = MOCK_ENGINE_PROC(
477+
Initialize,
478+
([&separate_thread](size_t version, const FlutterRendererConfig* config,
479+
const FlutterProjectArgs* args, void* user_data,
480+
FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
481+
separate_thread = args->custom_task_runners->ui_task_runner == nullptr;
482+
return kSuccess;
483+
}));
484+
fl_engine_get_embedder_api(engine)->RunInitialized =
485+
MOCK_ENGINE_PROC(RunInitialized, ([](auto engine) { return kSuccess; }));
486+
487+
g_autoptr(GError) error = nullptr;
488+
EXPECT_TRUE(fl_engine_start(engine, &error));
489+
EXPECT_EQ(error, nullptr);
490+
EXPECT_TRUE(separate_thread);
491+
}
492+
442493
TEST(FlEngineTest, Locales) {
443494
g_autofree gchar* initial_language = g_strdup(g_getenv("LANGUAGE"));
444495
g_setenv("LANGUAGE", "de:en_US", TRUE);

engine/src/flutter/shell/platform/linux/public/flutter_linux/fl_dart_project.h

+32
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,38 @@ void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject* project,
128128
*/
129129
gchar** fl_dart_project_get_dart_entrypoint_arguments(FlDartProject* project);
130130

131+
/**
132+
* FlUIThreadPolicy:
133+
* Configures the thread policy for running the UI isolate.
134+
* @FL_UI_THREAD_POLICY_DEFAULT: Defaut value. Currently will run the UI isolate
135+
* on separate thread, later will change to run on platform thread.
136+
* @FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD: Run the UI isolate on the
137+
* platform thread.
138+
* @FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD: Run the UI isolate on a separate
139+
* thread.
140+
*/
141+
typedef enum {
142+
FL_UI_THREAD_POLICY_DEFAULT,
143+
FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD,
144+
FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD,
145+
} FlUIThreadPolicy;
146+
147+
/**
148+
* fl_dart_project_set_ui_thread_policy:
149+
* @project: an #FlDartProject.
150+
* @policy: the thread policy to use for running the UI isolate.
151+
*/
152+
void fl_dart_project_set_ui_thread_policy(FlDartProject* project,
153+
FlUIThreadPolicy policy);
154+
155+
/**
156+
* fl_dart_project_get_ui_thread_policy:
157+
* @project: an #FlDartProject.
158+
*
159+
* Returns the thread policy used for running the UI isolate.
160+
*/
161+
FlUIThreadPolicy fl_dart_project_get_ui_thread_policy(FlDartProject* project);
162+
131163
G_END_DECLS
132164

133165
#endif // FLUTTER_SHELL_PLATFORM_LINUX_PUBLIC_FLUTTER_LINUX_FL_DART_PROJECT_H_

0 commit comments

Comments
 (0)