From 8330303099f16acabc6e626af48df2a4039cde67 Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 25 Apr 2025 14:46:53 +0800 Subject: [PATCH 1/2] fix: add task runner for linux. --- linux/CMakeLists.txt | 1 + linux/task_runner_linux.cc | 30 ++++++++++++++++++++++++++++++ linux/task_runner_linux.h | 26 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 linux/task_runner_linux.cc create mode 100644 linux/task_runner_linux.h diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 9d06ed2d7b..5e968390f2 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -24,6 +24,7 @@ add_library(${PLUGIN_NAME} SHARED "flutter/core_implementations.cc" "flutter/standard_codec.cc" "flutter/plugin_registrar.cc" + "task_runner_linux.cc" ) include_directories( diff --git a/linux/task_runner_linux.cc b/linux/task_runner_linux.cc new file mode 100644 index 0000000000..533fd2a1ac --- /dev/null +++ b/linux/task_runner_linux.cc @@ -0,0 +1,30 @@ +#include "task_runner_linux.h" + +#include + +namespace flutter_webrtc_plugin { + +void TaskRunnerLinux::EnqueueTask(TaskClosure task) { + { + std::lock_guard lock(tasks_mutex_); + tasks_.push(std::move(task)); + } + + GMainContext* context = g_main_context_default(); + if (context) { + g_main_context_invoke( + context, + [](gpointer user_data) { + TaskRunnerLinux* runner = static_cast(user_data); + std::lock_guard lock(runner->tasks_mutex_); + while (!runner->tasks_.empty()) { + TaskClosure task = std::move(runner->tasks_.front()); + runner->tasks_.pop(); + task(); + } + }, + this); + } +} + +} // namespace flutter_webrtc_plugin diff --git a/linux/task_runner_linux.h b/linux/task_runner_linux.h new file mode 100644 index 0000000000..87a68b08c8 --- /dev/null +++ b/linux/task_runner_linux.h @@ -0,0 +1,26 @@ +#ifndef PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_ +#define PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_ + +#include +#include +#include +#include "task_runner.h" + +namespace flutter_webrtc_plugin { + +class TaskRunnerLinux : public TaskRunner { + public: + TaskRunnerLinux() = default; + ~TaskRunnerLinux() override = default; + + // TaskRunner implementation. + void EnqueueTask(TaskClosure task); + + private: + std::mutex tasks_mutex_; + std::queue tasks_; +}; + +} // namespace flutter_webrtc_plugin + +#endif // PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_ \ No newline at end of file From 9f2689023f0f20d71c6fb9726ebf2b8fed826aac Mon Sep 17 00:00:00 2001 From: cloudwebrtc Date: Fri, 25 Apr 2025 15:28:55 +0800 Subject: [PATCH 2/2] update. --- linux/flutter_webrtc_plugin.cc | 7 +++++-- linux/task_runner_linux.cc | 3 ++- linux/task_runner_linux.h | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/linux/flutter_webrtc_plugin.cc b/linux/flutter_webrtc_plugin.cc index 79ce73d0f3..336204d55a 100644 --- a/linux/flutter_webrtc_plugin.cc +++ b/linux/flutter_webrtc_plugin.cc @@ -2,6 +2,7 @@ #include "flutter_common.h" #include "flutter_webrtc.h" +#include "task_runner_linux.h" const char* kChannelName = "FlutterWebRTC.Method"; @@ -37,7 +38,7 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { TextureRegistrar* textures() { return textures_; } - TaskRunner* task_runner() { return nullptr; } + TaskRunner* task_runner() { return task_runner_.get(); } private: // Creates a plugin that communicates on the given channel. @@ -45,7 +46,8 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { std::unique_ptr channel) : channel_(std::move(channel)), messenger_(registrar->messenger()), - textures_(registrar->texture_registrar()) { + textures_(registrar->texture_registrar()), + task_runner_(std::make_unique()) { webrtc_ = std::make_unique(this); } @@ -63,6 +65,7 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin { std::unique_ptr webrtc_; BinaryMessenger* messenger_; TextureRegistrar* textures_; + std::unique_ptr task_runner_; }; } // namespace flutter_webrtc_plugin diff --git a/linux/task_runner_linux.cc b/linux/task_runner_linux.cc index 533fd2a1ac..1c8a3f3240 100644 --- a/linux/task_runner_linux.cc +++ b/linux/task_runner_linux.cc @@ -14,7 +14,7 @@ void TaskRunnerLinux::EnqueueTask(TaskClosure task) { if (context) { g_main_context_invoke( context, - [](gpointer user_data) { + [](gpointer user_data) -> gboolean { TaskRunnerLinux* runner = static_cast(user_data); std::lock_guard lock(runner->tasks_mutex_); while (!runner->tasks_.empty()) { @@ -22,6 +22,7 @@ void TaskRunnerLinux::EnqueueTask(TaskClosure task) { runner->tasks_.pop(); task(); } + return G_SOURCE_REMOVE; }, this); } diff --git a/linux/task_runner_linux.h b/linux/task_runner_linux.h index 87a68b08c8..cff94639f7 100644 --- a/linux/task_runner_linux.h +++ b/linux/task_runner_linux.h @@ -14,7 +14,7 @@ class TaskRunnerLinux : public TaskRunner { ~TaskRunnerLinux() override = default; // TaskRunner implementation. - void EnqueueTask(TaskClosure task); + void EnqueueTask(TaskClosure task) override; private: std::mutex tasks_mutex_;