From: Havard Graff Date: Fri, 29 Nov 2019 13:23:49 +0000 (+0100) Subject: rtpsession: add locking for clear-pt-map X-Git-Tag: 1.19.3~509^2~811 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f997859913091dce1a90224d8c854abd2f22f9e8;p=platform%2Fupstream%2Fgstreamer.git rtpsession: add locking for clear-pt-map ...or it will segfault from time to time... --- diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c index c50f4d4..ce5694d 100644 --- a/gst/rtpmanager/gstrtpsession.c +++ b/gst/rtpmanager/gstrtpsession.c @@ -1314,7 +1314,9 @@ return_true (gpointer key, gpointer value, gpointer user_data) static void gst_rtp_session_clear_pt_map (GstRtpSession * rtpsession) { + GST_RTP_SESSION_LOCK (rtpsession); g_hash_table_foreach_remove (rtpsession->priv->ptmap, return_true, NULL); + GST_RTP_SESSION_UNLOCK (rtpsession); } /* called when the session manager has an RTP packet ready to be pushed */ diff --git a/tests/check/elements/rtpsession.c b/tests/check/elements/rtpsession.c index 28874b6..42f6509 100644 --- a/tests/check/elements/rtpsession.c +++ b/tests/check/elements/rtpsession.c @@ -92,6 +92,8 @@ typedef struct GObject *internal_session; GstTestClock *testclock; GstCaps *caps; + + gboolean running; } SessionHarness; static GstCaps * @@ -2212,6 +2214,46 @@ GST_START_TEST (test_request_late_nack) GST_END_TEST; +static gpointer +_push_caps_events (gpointer user_data) +{ + SessionHarness *h = user_data; + gint payload = 0; + while (h->running) { + + GstCaps *caps = gst_caps_new_simple ("application/x-rtp", + "payload", G_TYPE_INT, payload, + NULL); + gst_harness_set_src_caps (h->recv_rtp_h, caps); + g_thread_yield (); + payload++; + } + + return NULL; +} + +GST_START_TEST (test_clear_pt_map_stress) +{ + SessionHarness *h = session_harness_new (); + GThread *thread; + guint i; + + h->running = TRUE; + thread = g_thread_new (NULL, _push_caps_events, h); + + for (i = 0; i < 1000; i++) { + g_signal_emit_by_name (h->session, "clear-pt-map"); + g_thread_yield (); + } + + h->running = FALSE; + g_thread_join (thread); + + session_harness_free (h); +} + +GST_END_TEST; + static Suite * rtpsession_suite (void) { @@ -2247,6 +2289,8 @@ rtpsession_suite (void) tcase_add_test (tc_chain, test_on_sending_nacks); tcase_add_test (tc_chain, test_disable_probation); tcase_add_test (tc_chain, test_request_late_nack); + tcase_add_test (tc_chain, test_clear_pt_map_stress); + return s; }