33// found in the LICENSE file.
44
55#include " flutter/shell/platform/linux/fl_task_runner.h"
6+ #include " flutter/shell/platform/linux/fl_engine_private.h"
67
78static constexpr int kMicrosecondsPerNanosecond = 1000 ;
89static constexpr int kMillisecondsPerMicrosecond = 1000 ;
910
1011struct _FlTaskRunner {
1112 GObject parent_instance;
1213
13- FlTaskExecutor executor;
14- gpointer executor_user_data;
14+ FlEngine* engine;
1515
1616 GMutex mutex;
1717 GCond cond;
@@ -42,13 +42,24 @@ static void fl_task_runner_init(FlTaskRunner* self) {
4242 g_cond_init (&self->cond );
4343}
4444
45+ static void engine_weak_notify_cb (gpointer user_data,
46+ GObject* where_the_object_was) {
47+ FlTaskRunner* self = FL_TASK_RUNNER (user_data);
48+ self->engine = nullptr ;
49+ }
50+
4551void fl_task_runner_dispose (GObject* object) {
4652 FlTaskRunner* self = FL_TASK_RUNNER (object);
4753
4854 // this should never happen because the task runner is retained while blocking
4955 // main thread
5056 g_assert (!self->blocking_main_thread );
5157
58+ if (self->engine != nullptr ) {
59+ g_object_weak_unref (G_OBJECT (self->engine ), engine_weak_notify_cb, self);
60+ self->engine = nullptr ;
61+ }
62+
5263 g_mutex_clear (&self->mutex );
5364 g_cond_clear (&self->cond );
5465
@@ -60,12 +71,11 @@ void fl_task_runner_dispose(GObject* object) {
6071 G_OBJECT_CLASS (fl_task_runner_parent_class)->dispose (object);
6172}
6273
63- FlTaskRunner* fl_task_runner_new (FlTaskExecutor executor,
64- gpointer executor_user_data) {
74+ FlTaskRunner* fl_task_runner_new (FlEngine* engine) {
6575 FlTaskRunner* res =
6676 FL_TASK_RUNNER (g_object_new (fl_task_runner_get_type (), nullptr ));
67- res->executor = executor ;
68- res-> executor_user_data = executor_user_data ;
77+ res->engine = engine ;
78+ g_object_weak_ref ( G_OBJECT (engine), engine_weak_notify_cb, res) ;
6979 return res;
7080}
7181
@@ -91,11 +101,13 @@ static void fl_task_runner_process_expired_tasks_locked(FlTaskRunner* self) {
91101
92102 g_mutex_unlock (&self->mutex );
93103
94- l = expired_tasks;
95- while (l != nullptr && !self->stopped ) {
96- FlTaskRunnerTask* task = static_cast <FlTaskRunnerTask*>(l->data );
97- self->executor (task->task , self->executor_user_data );
98- l = l->next ;
104+ if (self->engine ) {
105+ l = expired_tasks;
106+ while (l != nullptr && !self->stopped ) {
107+ FlTaskRunnerTask* task = static_cast <FlTaskRunnerTask*>(l->data );
108+ fl_engine_execute_task (self->engine , &task->task );
109+ l = l->next ;
110+ }
99111 }
100112
101113 g_list_free_full (expired_tasks, g_free);
0 commit comments