From 886a695daab54642243608852919ac8e56682479 Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Fri, 31 Aug 2007 23:44:13 +0000 Subject: [MOVED FROM GST-P-FARSIGHT] Fixes the deadlock when pausing the dtmfsrc and rtpdtmfsrc. Had to push something on the async queue to release the blocking async_queue_pop(). Thanks to Olivier for the solution. 20070831234413-4f0f6-793cf35fc43636e7275258cc7063fc068f5efa0a.gz --- gst/dtmf/gstdtmfsrc.c | 14 ++++++++++++++ gst/dtmf/gstdtmfsrc.h | 3 ++- gst/dtmf/gstrtpdtmfsrc.c | 17 +++++++++++++---- gst/dtmf/gstrtpdtmfsrc.h | 3 ++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gst/dtmf/gstdtmfsrc.c b/gst/dtmf/gstdtmfsrc.c index 1dd123f4..0c137753 100644 --- a/gst/dtmf/gstdtmfsrc.c +++ b/gst/dtmf/gstdtmfsrc.c @@ -554,6 +554,16 @@ gst_dtmf_src_stop (GstDTMFSrc *dtmfsrc) dtmfsrc->clock_id = NULL; } + + + g_async_queue_lock (dtmfsrc->event_queue); + event = g_malloc (sizeof(GstRTPDTMFSrcEvent)); + event->event_type = RTP_DTMF_EVENT_TYPE_PAUSE_TASK; + g_async_queue_push_unlocked (dtmfsrc->event_queue, event); + g_async_queue_unlock (dtmfsrc->event_queue); + + event = NULL; + if (!gst_pad_pause_task (dtmfsrc->srcpad)) { GST_ERROR_OBJECT (dtmfsrc, "Failed to pause task on src pad"); return; @@ -768,6 +778,10 @@ gst_dtmf_src_push_next_tone_packet (GstDTMFSrc *dtmfsrc) event->packet_count = 0; dtmfsrc->last_event = event; + } else if (event->event_type == RTP_DTMF_EVENT_TYPE_PAUSE_TASK) { + g_free (event); + g_async_queue_unref (dtmfsrc->event_queue); + return; } } else if (dtmfsrc->last_event->packet_count * dtmfsrc->interval >= MIN_DUTY_CYCLE) { diff --git a/gst/dtmf/gstdtmfsrc.h b/gst/dtmf/gstdtmfsrc.h index 5a942702..15a16758 100644 --- a/gst/dtmf/gstdtmfsrc.h +++ b/gst/dtmf/gstdtmfsrc.h @@ -52,7 +52,8 @@ typedef struct _GstDTMFSrcClass GstDTMFSrcClass; enum _GstDTMFEventType { DTMF_EVENT_TYPE_START, - DTMF_EVENT_TYPE_STOP + DTMF_EVENT_TYPE_STOP, + DTMF_EVENT_TYPE_PAUSE_TASK }; typedef enum _GstDTMFEventType GstDTMFEventType; diff --git a/gst/dtmf/gstrtpdtmfsrc.c b/gst/dtmf/gstrtpdtmfsrc.c index c2a6d1f2..ff3f05b4 100644 --- a/gst/dtmf/gstrtpdtmfsrc.c +++ b/gst/dtmf/gstrtpdtmfsrc.c @@ -612,11 +612,20 @@ gst_rtp_dtmf_src_stop (GstRTPDTMFSrc *dtmfsrc) dtmfsrc->clock_id = NULL; } + g_async_queue_lock (dtmfsrc->event_queue); + event = g_malloc (sizeof(GstRTPDTMFSrcEvent)); + event->event_type = RTP_DTMF_EVENT_TYPE_PAUSE_TASK; + g_async_queue_push_unlocked (dtmfsrc->event_queue, event); + g_async_queue_unlock (dtmfsrc->event_queue); + + event = NULL; + if (!gst_pad_pause_task (dtmfsrc->srcpad)) { GST_ERROR_OBJECT (dtmfsrc, "Failed to pause task on src pad"); return; } + if (dtmfsrc->last_event) { /* Don't forget to release the stream lock */ gst_rtp_dtmf_src_set_stream_lock (dtmfsrc, FALSE); @@ -632,10 +641,6 @@ gst_rtp_dtmf_src_stop (GstRTPDTMFSrc *dtmfsrc) event = g_async_queue_try_pop (dtmfsrc->event_queue); } - if (dtmfsrc->last_event) { - g_free (dtmfsrc->last_event); - dtmfsrc->last_event = NULL; - } } @@ -813,6 +818,10 @@ gst_rtp_dtmf_src_push_next_rtp_packet (GstRTPDTMFSrc *dtmfsrc) event->sent_packets = 0; dtmfsrc->last_event = event; + } else if (event->event_type == RTP_DTMF_EVENT_TYPE_PAUSE_TASK) { + g_free (event); + g_async_queue_unref (dtmfsrc->event_queue); + return; } } else if (dtmfsrc->last_event->sent_packets * dtmfsrc->interval >= MIN_PULSE_DURATION){ diff --git a/gst/dtmf/gstrtpdtmfsrc.h b/gst/dtmf/gstrtpdtmfsrc.h index c5e2b11b..66225bac 100644 --- a/gst/dtmf/gstrtpdtmfsrc.h +++ b/gst/dtmf/gstrtpdtmfsrc.h @@ -61,7 +61,8 @@ typedef struct _GstRTPDTMFSrcClass GstRTPDTMFSrcClass; enum _GstRTPDTMFEventType { RTP_DTMF_EVENT_TYPE_START, - RTP_DTMF_EVENT_TYPE_STOP + RTP_DTMF_EVENT_TYPE_STOP, + RTP_DTMF_EVENT_TYPE_PAUSE_TASK }; typedef enum _GstRTPDTMFEventType GstRTPDTMFEventType; -- cgit v1.2.1