mirror of
https://github.com/flutter-webrtc/flutter-webrtc
synced 2025-07-15 21:56:21 +00:00
fix: add task runner for linux. (#1821)
* fix: add task runner for linux. * update.
This commit is contained in:
@ -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(
|
||||
|
@ -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<MethodChannel> channel)
|
||||
: channel_(std::move(channel)),
|
||||
messenger_(registrar->messenger()),
|
||||
textures_(registrar->texture_registrar()) {
|
||||
textures_(registrar->texture_registrar()),
|
||||
task_runner_(std::make_unique<TaskRunnerLinux>()) {
|
||||
webrtc_ = std::make_unique<FlutterWebRTC>(this);
|
||||
}
|
||||
|
||||
@ -63,6 +65,7 @@ class FlutterWebRTCPluginImpl : public FlutterWebRTCPlugin {
|
||||
std::unique_ptr<FlutterWebRTC> webrtc_;
|
||||
BinaryMessenger* messenger_;
|
||||
TextureRegistrar* textures_;
|
||||
std::unique_ptr<TaskRunner> task_runner_;
|
||||
};
|
||||
|
||||
} // namespace flutter_webrtc_plugin
|
||||
|
31
linux/task_runner_linux.cc
Normal file
31
linux/task_runner_linux.cc
Normal file
@ -0,0 +1,31 @@
|
||||
#include "task_runner_linux.h"
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
namespace flutter_webrtc_plugin {
|
||||
|
||||
void TaskRunnerLinux::EnqueueTask(TaskClosure task) {
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(tasks_mutex_);
|
||||
tasks_.push(std::move(task));
|
||||
}
|
||||
|
||||
GMainContext* context = g_main_context_default();
|
||||
if (context) {
|
||||
g_main_context_invoke(
|
||||
context,
|
||||
[](gpointer user_data) -> gboolean {
|
||||
TaskRunnerLinux* runner = static_cast<TaskRunnerLinux*>(user_data);
|
||||
std::lock_guard<std::mutex> lock(runner->tasks_mutex_);
|
||||
while (!runner->tasks_.empty()) {
|
||||
TaskClosure task = std::move(runner->tasks_.front());
|
||||
runner->tasks_.pop();
|
||||
task();
|
||||
}
|
||||
return G_SOURCE_REMOVE;
|
||||
},
|
||||
this);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace flutter_webrtc_plugin
|
26
linux/task_runner_linux.h
Normal file
26
linux/task_runner_linux.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_
|
||||
#define PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_
|
||||
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <queue>
|
||||
#include "task_runner.h"
|
||||
|
||||
namespace flutter_webrtc_plugin {
|
||||
|
||||
class TaskRunnerLinux : public TaskRunner {
|
||||
public:
|
||||
TaskRunnerLinux() = default;
|
||||
~TaskRunnerLinux() override = default;
|
||||
|
||||
// TaskRunner implementation.
|
||||
void EnqueueTask(TaskClosure task) override;
|
||||
|
||||
private:
|
||||
std::mutex tasks_mutex_;
|
||||
std::queue<TaskClosure> tasks_;
|
||||
};
|
||||
|
||||
} // namespace flutter_webrtc_plugin
|
||||
|
||||
#endif // PACKAGES_FLUTTER_WEBRTC_LINUX_TASK_RUNNER_LINUX_H_
|
Reference in New Issue
Block a user