mirror of
https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git
synced 2024-11-23 12:01:01 +00:00
a45f944edd
The I/O handle was dropped prior to removing it from the reactor, which caused `Poller::delete` to fail due to an invalid file descriptor. This used to happen silently unless the same fd was added again, e.g. by changing states in the pipeline as follow: Null -> Playing -> Null -> Playing. In which case `Poller::add` failed due to an already existing file. This commit makes sure the fd is removed from the reactor prior to dropping the handle. In order to achieve this, a new task is spawned on the `Context` on which the I/O was originally registered, allowing it to access the proper `Reactor`. The I/O can then safely be dropped. Because the I/O handle is moved to the spawned future, this solution requires adding the `Send + 'static` bounds to the I/O handle used within the `Async` wrapper. This appears not too restrictive for existing implementations though. Other attempts were considered, but they would cause deadlocks. This new approach also solves a potential race condition where a fd could be re-registered in a `Reactor` before it was removed.
72 lines
2.1 KiB
TOML
72 lines
2.1 KiB
TOML
[package]
|
|
name = "gst-plugin-threadshare"
|
|
version = "0.9.0"
|
|
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
|
|
license = "LGPL-2.1-or-later"
|
|
description = "Threadshare Plugin"
|
|
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
|
|
edition = "2021"
|
|
rust-version = "1.57"
|
|
|
|
[dependencies]
|
|
async-task = "4.0.3"
|
|
concurrent-queue = "1.2.2"
|
|
futures = { version = "0.3.17", features = ["thread-pool"] }
|
|
libc = "0.2"
|
|
gio = { git = "https://github.com/gtk-rs/gtk-rs-core" }
|
|
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
|
gst-net = { package = "gstreamer-net", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
|
gst-rtp = { package = "gstreamer-rtp", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
|
once_cell = "1"
|
|
pin-project-lite = "0.2.0"
|
|
polling = "2.2.0"
|
|
rand = "0.8"
|
|
slab = "0.4.2"
|
|
socket2 = {features = ["all"], version = "0.4"}
|
|
waker-fn = "1.1"
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
winapi = { version = "0.3.9", features = ["winsock2", "processthreadsapi"] }
|
|
|
|
[dev-dependencies]
|
|
gst-check = { package = "gstreamer-check", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
|
gst-app = { package = "gstreamer-app", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs" }
|
|
|
|
[lib]
|
|
name = "gstthreadshare"
|
|
crate-type = ["cdylib", "rlib"]
|
|
path = "src/lib.rs"
|
|
|
|
[[example]]
|
|
name = "benchmark"
|
|
path = "examples/benchmark.rs"
|
|
|
|
[[example]]
|
|
name = "udpsrc-benchmark-sender"
|
|
path = "examples/udpsrc_benchmark_sender.rs"
|
|
|
|
[[example]]
|
|
name = "tcpclientsrc-benchmark-sender"
|
|
path = "examples/tcpclientsrc_benchmark_sender.rs"
|
|
|
|
[build-dependencies]
|
|
gst-plugin-version-helper = { path="../../version-helper" }
|
|
cc = "1.0.38"
|
|
pkg-config = "0.3.15"
|
|
|
|
[features]
|
|
static = []
|
|
capi = []
|
|
|
|
[package.metadata.capi]
|
|
min_version = "0.8.0"
|
|
|
|
[package.metadata.capi.header]
|
|
enabled = false
|
|
|
|
[package.metadata.capi.library]
|
|
install_subdir = "gstreamer-1.0"
|
|
versioning = false
|
|
|
|
[package.metadata.capi.pkg_config]
|
|
requires_private = "gstreamer-1.0, gstreamer-net-1.0, gstreamer-rtp-1.0, gobject-2.0, glib-2.0, gmodule-2.0"
|