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

gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2018-05-17 11:59:04 +0300
committerSebastian Dröge <sebastian@centricular.com>2018-11-05 14:36:47 +0300
commitc5d901609f5c345343673547f0cede664c5bd46f (patch)
treea963d3d072cb225aaa34959b308069b60e0ef444
parent7ac9534322bc6535d6144ce990113173c07e3b2f (diff)
threadshare: Try pushing pending items immediately if we did not schedule a future for it yet
It might not be necessary to first go through a future, we might directly be able to push them now.
-rw-r--r--gst-plugin-threadshare/src/proxy.rs33
-rw-r--r--gst-plugin-threadshare/src/queue.rs24
2 files changed, 46 insertions, 11 deletions
diff --git a/gst-plugin-threadshare/src/proxy.rs b/gst-plugin-threadshare/src/proxy.rs
index dfc7776f1..b2eb089f3 100644
--- a/gst-plugin-threadshare/src/proxy.rs
+++ b/gst-plugin-threadshare/src/proxy.rs
@@ -377,14 +377,33 @@ impl ProxySink {
let mut queue = queue.0.lock().unwrap();
- let item = if queue.pending_queue.is_none() {
- // The source might not have started yet
- match queue.queue {
- Some(ref queue) => queue.push(item),
- None => Err(item),
+ let item = {
+ let SharedQueueInner {
+ ref mut pending_queue,
+ ref queue,
+ ..
+ } = *queue;
+
+ match (pending_queue, queue) {
+ (None, Some(ref queue)) => queue.push(item),
+ (Some((_, false, ref mut items)), Some(ref queue)) => {
+ let mut failed_item = None;
+ while let Some(item) = items.pop_front() {
+ if let Err(item) = queue.push(item) {
+ failed_item = Some(item);
+ }
+ }
+
+ if let Some(failed_item) = failed_item {
+ items.push_front(failed_item);
+
+ Err(item)
+ } else {
+ queue.push(item)
+ }
+ }
+ _ => Err(item),
}
- } else {
- Err(item)
};
if let Err(item) = item {
diff --git a/gst-plugin-threadshare/src/queue.rs b/gst-plugin-threadshare/src/queue.rs
index b297dcb42..cccec911c 100644
--- a/gst-plugin-threadshare/src/queue.rs
+++ b/gst-plugin-threadshare/src/queue.rs
@@ -286,11 +286,27 @@ impl Queue {
Some(ref queue) => queue,
};
- let item = if pending_queue.is_none() {
- queue.push(item)
- } else {
- Err(item)
+ let item = match pending_queue {
+ None => queue.push(item),
+ Some((_, false, ref mut items)) => {
+ let mut failed_item = None;
+ while let Some(item) = items.pop_front() {
+ if let Err(item) = queue.push(item) {
+ failed_item = Some(item);
+ }
+ }
+
+ if let Some(failed_item) = failed_item {
+ items.push_front(failed_item);
+
+ Err(item)
+ } else {
+ queue.push(item)
+ }
+ }
+ _ => Err(item),
};
+
if let Err(item) = item {
if pending_queue
.as_ref()