summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2010-10-12 18:48:10 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2010-10-12 18:48:10 +0200
commitaa62c60a6c44114f3f6f0900dd2e85f9ac2a81b1 (patch)
tree152e580d1ae69b48bb7d6dd4ccde0bbde29a4257
parent0dbb0f203e23524f323045eb55c5e8dc4f1c124c (diff)
queue: avoid g_cond_signal when we can
Keep track of what cond we are waiting on and only signal when some other thread is waiting.
-rw-r--r--plugins/elements/gstqueue.c16
-rw-r--r--plugins/elements/gstqueue.h2
2 files changed, 14 insertions, 4 deletions
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
index d66dcb5264..6989faf56f 100644
--- a/plugins/elements/gstqueue.c
+++ b/plugins/elements/gstqueue.c
@@ -142,7 +142,9 @@ enum
#define GST_QUEUE_WAIT_DEL_CHECK(q, label) G_STMT_START { \
STATUS (q, q->sinkpad, "wait for DEL"); \
+ q->waiting_del = TRUE; \
g_cond_wait (q->item_del, q->qlock); \
+ q->waiting_del = FALSE; \
if (q->srcresult != GST_FLOW_OK) { \
STATUS (q, q->srcpad, "received DEL wakeup"); \
goto label; \
@@ -152,7 +154,9 @@ enum
#define GST_QUEUE_WAIT_ADD_CHECK(q, label) G_STMT_START { \
STATUS (q, q->srcpad, "wait for ADD"); \
+ q->waiting_add = TRUE; \
g_cond_wait (q->item_add, q->qlock); \
+ q->waiting_add = FALSE; \
if (q->srcresult != GST_FLOW_OK) { \
STATUS (q, q->srcpad, "received ADD wakeup"); \
goto label; \
@@ -161,13 +165,17 @@ enum
} G_STMT_END
#define GST_QUEUE_SIGNAL_DEL(q) G_STMT_START { \
- STATUS (q, q->srcpad, "signal DEL"); \
- g_cond_signal (q->item_del); \
+ if (q->waiting_del) { \
+ STATUS (q, q->srcpad, "signal DEL"); \
+ g_cond_signal (q->item_del); \
+ } \
} G_STMT_END
#define GST_QUEUE_SIGNAL_ADD(q) G_STMT_START { \
- STATUS (q, q->sinkpad, "signal ADD"); \
- g_cond_signal (q->item_add); \
+ if (q->waiting_add) { \
+ STATUS (q, q->sinkpad, "signal ADD"); \
+ g_cond_signal (q->item_add); \
+ } \
} G_STMT_END
#define _do_init(bla) \
diff --git a/plugins/elements/gstqueue.h b/plugins/elements/gstqueue.h
index 72ea814133..c72bcb790c 100644
--- a/plugins/elements/gstqueue.h
+++ b/plugins/elements/gstqueue.h
@@ -108,7 +108,9 @@ struct _GstQueue {
gint leaky;
GMutex *qlock; /* lock for queue (vs object lock) */
+ gboolean waiting_add;
GCond *item_add; /* signals buffers now available for reading */
+ gboolean waiting_del;
GCond *item_del; /* signals space now available for writing */
gboolean head_needs_discont, tail_needs_discont;