Flutter Linux Embedder
fl_task_runner.h File Reference
#include <glib-object.h>
#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"

Go to the source code of this file.

Functions

G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (FlTaskRunner, fl_task_runner, FL, TASK_RUNNER, GObject)
 
FlTaskRunner * fl_task_runner_new (FlEngine *engine)
 
void fl_task_runner_post_flutter_task (FlTaskRunner *task_runner, FlutterTask task, uint64_t target_time_nanos)
 
void fl_task_runner_post_callback (FlTaskRunner *task_runner, void(*callback)(gpointer data), gpointer data)
 
void fl_task_runner_block_main_thread (FlTaskRunner *task_runner)
 
void fl_task_runner_release_main_thread (FlTaskRunner *self)
 

Function Documentation

◆ fl_task_runner_block_main_thread()

void fl_task_runner_block_main_thread ( FlTaskRunner *  task_runner)

fl_task_runner_block_main_thread: @task_runner: an #FlTaskRunner.

Blocks main thread until fl_task_runner_release_main_thread is called. While main thread is blocked tasks posted to #FlTaskRunner are executed as usual. Must be invoked on main thread.

Definition at line 203 of file fl_task_runner.cc.

203  {
204  g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
205  (void)locker; // unused variable
206 
207  g_return_if_fail(self->blocking_main_thread == FALSE);
208 
209  g_object_ref(self);
210 
211  self->blocking_main_thread = true;
212  while (self->blocking_main_thread) {
213  g_cond_wait_until(&self->cond, &self->mutex,
216  }
217 
218  // Tasks might have changed in the meanwhile, reschedule timeout
220 
221  g_object_unref(self);
222 }
static void fl_task_runner_process_expired_tasks_locked(FlTaskRunner *self)
static gint64 fl_task_runner_next_task_expiration_time_locked(FlTaskRunner *self)
static void fl_task_runner_tasks_did_change_locked(FlTaskRunner *self)

References fl_task_runner_next_task_expiration_time_locked(), fl_task_runner_process_expired_tasks_locked(), and fl_task_runner_tasks_did_change_locked().

Referenced by fl_compositor_opengl_wait_for_frame().

◆ fl_task_runner_new()

FlTaskRunner* fl_task_runner_new ( FlEngine *  engine)

fl_task_runner_new: @engine: the #FlEngine owning the task runner.

Creates new task runner instance.

Returns: an #FlTaskRunner.

Definition at line 167 of file fl_task_runner.cc.

167  {
168  FlTaskRunner* self =
169  FL_TASK_RUNNER(g_object_new(fl_task_runner_get_type(), nullptr));
170  g_weak_ref_init(&self->engine, G_OBJECT(engine));
171  return self;
172 }

Referenced by fl_engine_init().

◆ fl_task_runner_post_callback()

void fl_task_runner_post_callback ( FlTaskRunner *  task_runner,
void(*)(gpointer data)  callback,
gpointer  data 
)

fl_task_runner_post_callback: @task_runner: an #FlTaskRunner. @callback: callback to be scheduled @data: data to be passed to the callback

Schedules arbitrary callback to be executed on main thread. The callback will be executed in next run loop turn. This function is thread safe and may be called from any thread.

Definition at line 189 of file fl_task_runner.cc.

191  {
192  g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
193  (void)locker; // unused variable
194 
195  FlTaskRunnerTask* runner_task = g_new0(FlTaskRunnerTask, 1);
196  runner_task->callback = callback;
197  runner_task->callback_data = data;
198 
199  self->pending_tasks = g_list_append(self->pending_tasks, runner_task);
201 }
void(* callback)(gpointer data)

References _FlTaskRunnerTask::callback, _FlTaskRunnerTask::callback_data, and fl_task_runner_tasks_did_change_locked().

Referenced by fl_compositor_opengl_present_layers().

◆ fl_task_runner_post_flutter_task()

void fl_task_runner_post_flutter_task ( FlTaskRunner *  task_runner,
FlutterTask  task,
uint64_t  target_time_nanos 
)

fl_task_runner_post_flutter_task: @task_runner: an #FlTaskRunner. @task: Flutter task being scheduled @target_time_nanos: absolute time in nanoseconds

Posts a Flutter task to be executed on main thread. This function is thread safe and may be called from any thread.

Definition at line 174 of file fl_task_runner.cc.

176  {
177  g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
178  (void)locker; // unused variable
179 
180  FlTaskRunnerTask* runner_task = g_new0(FlTaskRunnerTask, 1);
181  runner_task->task = task;
182  runner_task->task_time_micros =
183  target_time_nanos / kMicrosecondsPerNanosecond;
184 
185  self->pending_tasks = g_list_append(self->pending_tasks, runner_task);
187 }
static constexpr int kMicrosecondsPerNanosecond

References fl_task_runner_tasks_did_change_locked(), kMicrosecondsPerNanosecond, _FlTaskRunnerTask::task, and _FlTaskRunnerTask::task_time_micros.

Referenced by fl_engine_post_task().

◆ fl_task_runner_release_main_thread()

void fl_task_runner_release_main_thread ( FlTaskRunner *  self)

fl_task_runner_release_main_thread: @task_runner: an #FlTaskRunner.

Unblocks main thread. This will resume normal processing of main loop. Can be invoked from any thread.

Definition at line 224 of file fl_task_runner.cc.

224  {
225  g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->mutex);
226  (void)locker; // unused variable
227 
228  g_return_if_fail(self->blocking_main_thread == TRUE);
229 
230  self->blocking_main_thread = FALSE;
231  g_cond_signal(&self->cond);
232 }

References TRUE.

Referenced by fl_compositor_opengl_unblock_main_thread().

◆ G_DECLARE_FINAL_TYPE()

G_BEGIN_DECLS G_DECLARE_FINAL_TYPE ( FlTaskRunner  ,
fl_task_runner  ,
FL  ,
TASK_RUNNER  ,
GObject   
)