37 GList* expired_tasks =
nullptr;
39 gint64 current_time = g_get_monotonic_time();
41 GList* l =
self->pending_tasks;
42 while (l !=
nullptr) {
47 self->pending_tasks = g_list_remove_link(self->pending_tasks, link);
48 expired_tasks = g_list_concat(expired_tasks, link);
54 g_mutex_unlock(&self->mutex);
56 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
57 if (engine !=
nullptr) {
59 while (l !=
nullptr) {
66 g_list_free_full(expired_tasks, g_free);
68 g_mutex_lock(&self->mutex);
76 FlTaskRunner*
self = FL_TASK_RUNNER(data);
78 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
83 self->timeout_source_id = 0;
98 gint64 min_time = G_MAXINT64;
99 GList* l =
self->pending_tasks;
100 while (l !=
nullptr) {
110 if (self->timeout_source_id != 0) {
111 g_source_remove(self->timeout_source_id);
112 self->timeout_source_id = 0;
115 if (min_time != G_MAXINT64) {
116 gint64 remaining = MAX(min_time - g_get_monotonic_time(), 0);
117 self->timeout_source_id =
124 FlTaskRunner*
self = FL_TASK_RUNNER(
object);
126 g_weak_ref_clear(&self->engine);
127 g_mutex_clear(&self->mutex);
128 g_cond_clear(&self->cond);
130 g_list_free_full(self->pending_tasks, g_free);
131 if (self->timeout_source_id != 0) {
132 g_source_remove(self->timeout_source_id);
135 G_OBJECT_CLASS(fl_task_runner_parent_class)->dispose(
object);
143 g_mutex_init(&self->mutex);
144 g_cond_init(&self->cond);
149 FL_TASK_RUNNER(g_object_new(fl_task_runner_get_type(),
nullptr));
150 g_weak_ref_init(&self->engine, G_OBJECT(engine));
156 uint64_t target_time_nanos) {
157 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
161 runner_task->
task = task;
165 self->pending_tasks = g_list_append(self->pending_tasks, runner_task);
169 g_cond_signal(&self->cond);
173 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
176 g_cond_wait_until(&self->cond, &self->mutex,
183 g_cond_signal(&self->cond);
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
g_autoptr(GMutexLocker) locker
void fl_engine_execute_task(FlEngine *self, FlutterTask *task)
void fl_task_runner_wait(FlTaskRunner *self)
void fl_task_runner_stop_wait(FlTaskRunner *self)
void fl_task_runner_dispose(GObject *object)
static void fl_task_runner_process_expired_tasks_locked(FlTaskRunner *self)
void fl_task_runner_post_flutter_task(FlTaskRunner *self, FlutterTask task, uint64_t target_time_nanos)
struct _FlTaskRunnerTask FlTaskRunnerTask
static gint64 fl_task_runner_next_task_expiration_time_locked(FlTaskRunner *self)
static constexpr int kMillisecondsPerMicrosecond
static void fl_task_runner_class_init(FlTaskRunnerClass *klass)
static void fl_task_runner_tasks_did_change_locked(FlTaskRunner *self)
static gboolean fl_task_runner_on_expired_timeout(gpointer data)
static constexpr int kMicrosecondsPerNanosecond
FlTaskRunner * fl_task_runner_new(FlEngine *engine)
static void fl_task_runner_init(FlTaskRunner *self)