mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
fix memory leaks and unlock a mutex earlier
Original commit message from CVS: fix memory leaks and unlock a mutex earlier This is a 0.6 branch candidate, btw
This commit is contained in:
parent
d5caf284b3
commit
e2c19765d9
2 changed files with 20 additions and 10 deletions
|
@ -359,10 +359,9 @@ restart:
|
||||||
GST_ELEMENT_NAME(GST_ELEMENT(queue)),
|
GST_ELEMENT_NAME(GST_ELEMENT(queue)),
|
||||||
GST_EVENT_TYPE(GST_EVENT(buf)));
|
GST_EVENT_TYPE(GST_EVENT(buf)));
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on upstream end");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on upstream end");
|
||||||
gst_buffer_unref(buf);
|
|
||||||
/* now we have to clean up and exit right away */
|
/* now we have to clean up and exit right away */
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
return;
|
goto out_unref;
|
||||||
}
|
}
|
||||||
/* otherwise we have to push a buffer off the other end */
|
/* otherwise we have to push a buffer off the other end */
|
||||||
else {
|
else {
|
||||||
|
@ -395,12 +394,12 @@ restart:
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!");
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
if (gst_scheduler_interrupt (gst_pad_get_scheduler (queue->sinkpad), GST_ELEMENT (queue)))
|
if (gst_scheduler_interrupt (gst_pad_get_scheduler (queue->sinkpad), GST_ELEMENT (queue)))
|
||||||
return;
|
goto out_unref;
|
||||||
/* if we got here bacause we were unlocked after a flush, we don't need
|
/* if we got here bacause we were unlocked after a flush, we don't need
|
||||||
* to add the buffer to the queue again */
|
* to add the buffer to the queue again */
|
||||||
if (queue->flush) {
|
if (queue->flush) {
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush");
|
||||||
return;
|
goto out_unref;
|
||||||
}
|
}
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt");
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -409,9 +408,10 @@ restart:
|
||||||
/* this means the other end is shut down */
|
/* this means the other end is shut down */
|
||||||
/* try to signal to resolve the error */
|
/* try to signal to resolve the error */
|
||||||
if (!queue->may_deadlock) {
|
if (!queue->may_deadlock) {
|
||||||
gst_data_unref (GST_DATA (buf));
|
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
|
gst_data_unref (GST_DATA (buf));
|
||||||
gst_element_error (GST_ELEMENT (queue), "deadlock found, source pad elements are shut down");
|
gst_element_error (GST_ELEMENT (queue), "deadlock found, source pad elements are shut down");
|
||||||
|
/* we don't want to goto out_unref here, since we want to clean up before calling gst_element_error */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -455,6 +455,11 @@ restart:
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "signalling not_empty");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "signalling not_empty");
|
||||||
g_cond_signal (queue->not_empty);
|
g_cond_signal (queue->not_empty);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_unref:
|
||||||
|
gst_data_unref (GST_DATA (buf));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
|
|
|
@ -359,10 +359,9 @@ restart:
|
||||||
GST_ELEMENT_NAME(GST_ELEMENT(queue)),
|
GST_ELEMENT_NAME(GST_ELEMENT(queue)),
|
||||||
GST_EVENT_TYPE(GST_EVENT(buf)));
|
GST_EVENT_TYPE(GST_EVENT(buf)));
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on upstream end");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "queue is full, leaking buffer on upstream end");
|
||||||
gst_buffer_unref(buf);
|
|
||||||
/* now we have to clean up and exit right away */
|
/* now we have to clean up and exit right away */
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
return;
|
goto out_unref;
|
||||||
}
|
}
|
||||||
/* otherwise we have to push a buffer off the other end */
|
/* otherwise we have to push a buffer off the other end */
|
||||||
else {
|
else {
|
||||||
|
@ -395,12 +394,12 @@ restart:
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "interrupted!!");
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
if (gst_scheduler_interrupt (gst_pad_get_scheduler (queue->sinkpad), GST_ELEMENT (queue)))
|
if (gst_scheduler_interrupt (gst_pad_get_scheduler (queue->sinkpad), GST_ELEMENT (queue)))
|
||||||
return;
|
goto out_unref;
|
||||||
/* if we got here bacause we were unlocked after a flush, we don't need
|
/* if we got here bacause we were unlocked after a flush, we don't need
|
||||||
* to add the buffer to the queue again */
|
* to add the buffer to the queue again */
|
||||||
if (queue->flush) {
|
if (queue->flush) {
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "not adding pending buffer after flush");
|
||||||
return;
|
goto out_unref;
|
||||||
}
|
}
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "adding pending buffer after interrupt");
|
||||||
goto restart;
|
goto restart;
|
||||||
|
@ -409,9 +408,10 @@ restart:
|
||||||
/* this means the other end is shut down */
|
/* this means the other end is shut down */
|
||||||
/* try to signal to resolve the error */
|
/* try to signal to resolve the error */
|
||||||
if (!queue->may_deadlock) {
|
if (!queue->may_deadlock) {
|
||||||
gst_data_unref (GST_DATA (buf));
|
|
||||||
g_mutex_unlock (queue->qlock);
|
g_mutex_unlock (queue->qlock);
|
||||||
|
gst_data_unref (GST_DATA (buf));
|
||||||
gst_element_error (GST_ELEMENT (queue), "deadlock found, source pad elements are shut down");
|
gst_element_error (GST_ELEMENT (queue), "deadlock found, source pad elements are shut down");
|
||||||
|
/* we don't want to goto out_unref here, since we want to clean up before calling gst_element_error */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -455,6 +455,11 @@ restart:
|
||||||
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "signalling not_empty");
|
GST_DEBUG_ELEMENT (GST_CAT_DATAFLOW, queue, "signalling not_empty");
|
||||||
g_cond_signal (queue->not_empty);
|
g_cond_signal (queue->not_empty);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_unref:
|
||||||
|
gst_data_unref (GST_DATA (buf));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstBuffer *
|
static GstBuffer *
|
||||||
|
|
Loading…
Reference in a new issue