Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sdroege/gst-plugin-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/video
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2023-02-22 11:02:45 +0300
committerSebastian Dröge <sebastian@centricular.com>2023-02-22 11:02:45 +0300
commitce1faa602075045eea989b5bb1e36ba5601c869f (patch)
tree508eba082994dca16be07fc397b88ad5aabd487a /video
parentf08b65ece1e593fbc2301b1277aac6bed9b24a7b (diff)
gtk4: Attach channel receiver to the default main context from the main thread
It requires acquiring the main context for thread-safety reasons and that is only possible from the main thread itself. Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/319 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1099>
Diffstat (limited to 'video')
-rw-r--r--video/gtk4/src/sink/imp.rs27
1 files changed, 15 insertions, 12 deletions
diff --git a/video/gtk4/src/sink/imp.rs b/video/gtk4/src/sink/imp.rs
index 34a8cf72..f26a6c07 100644
--- a/video/gtk4/src/sink/imp.rs
+++ b/video/gtk4/src/sink/imp.rs
@@ -508,7 +508,21 @@ impl PaintableSink {
) {
gst::debug!(CAT, imp: self, "Initializing paintable");
- let paintable = utils::invoke_on_main_thread(|| {
+ // The channel for the SinkEvents
+ let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
+ let self_ = self.to_owned();
+
+ let paintable = utils::invoke_on_main_thread(move || {
+ // Attach the receiver from the main thread to make sure it is called
+ // from a place where it can acquire the default main context.
+ receiver.attach(
+ Some(&glib::MainContext::default()),
+ glib::clone!(
+ @weak self_ => @default-return glib::Continue(false),
+ move |action| self_.do_action(action)
+ ),
+ );
+
#[cfg(any(target_os = "macos", feature = "gst_gl"))]
{
let gdk_context = if let GLContext::Initialized { gdk_context, .. } =
@@ -526,17 +540,6 @@ impl PaintableSink {
}
});
- // The channel for the SinkEvents
- let (sender, receiver) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
- let self_ = self.to_owned();
- receiver.attach(
- None,
- glib::clone!(
- @weak self_ => @default-return glib::Continue(false),
- move |action| self_.do_action(action)
- ),
- );
-
**paintable_storage = Some(paintable);
*self.sender.lock().unwrap() = Some(sender);