Skip to content

Commit dda5b9d

Browse files
sauwmingtrengginas
authored andcommitted
Fixed deadlock between stream and ICE (#3801)
1 parent 7cda346 commit dda5b9d

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

pjmedia/src/pjmedia/stream.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,10 +1087,11 @@ static pj_status_t send_rtcp(pjmedia_stream *stream,
10871087
pj_status_t status;
10881088

10891089
/* We need to prevent data race since there is only a single instance
1090-
* of rtcp packet buffer. Let's just use the JB mutex for this instead
1091-
* of creating a separate lock.
1090+
* of rtcp packet buffer. And to avoid deadlock with media transport,
1091+
* we use the transport's group lock.
10921092
*/
1093-
pj_mutex_lock(stream->jb_mutex);
1093+
if (stream->transport->grp_lock)
1094+
pj_grp_lock_acquire(stream->transport->grp_lock);
10941095

10951096
/* Build RTCP RR/SR packet */
10961097
pjmedia_rtcp_build_rtcp(&stream->rtcp, &sr_rr_pkt, &len);
@@ -1211,7 +1212,8 @@ static pj_status_t send_rtcp(pjmedia_stream *stream,
12111212
}
12121213
}
12131214

1214-
pj_mutex_unlock(stream->jb_mutex);
1215+
if (stream->transport->grp_lock)
1216+
pj_grp_lock_release(stream->transport->grp_lock);
12151217

12161218
return status;
12171219
}
@@ -3068,7 +3070,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_destroy( pjmedia_stream *stream )
30683070
PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);
30693071

30703072
/* Send RTCP BYE (also SDES & XR) */
3071-
if (stream->transport && stream->jb_mutex && !stream->rtcp_sdes_bye_disabled) {
3073+
if (stream->transport && !stream->rtcp_sdes_bye_disabled) {
30723074
#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
30733075
send_rtcp(stream, PJ_TRUE, PJ_TRUE, stream->rtcp.xr_enabled, PJ_FALSE);
30743076
#else

pjmedia/src/pjmedia/vid_stream.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,12 @@ static pj_status_t send_rtcp(pjmedia_vid_stream *stream,
584584
int len, max_len;
585585
pj_status_t status;
586586

587-
pj_grp_lock_acquire( stream->grp_lock );
587+
588+
/* To avoid deadlock with media transport, we use the transport's
589+
* group lock.
590+
*/
591+
if (stream->transport->grp_lock)
592+
pj_grp_lock_acquire( stream->transport->grp_lock );
588593

589594
/* Build RTCP RR/SR packet */
590595
pjmedia_rtcp_build_rtcp(&stream->rtcp, &sr_rr_pkt, &len);
@@ -667,7 +672,8 @@ static pj_status_t send_rtcp(pjmedia_vid_stream *stream,
667672
}
668673
}
669674

670-
pj_grp_lock_release( stream->grp_lock );
675+
if (stream->transport->grp_lock)
676+
pj_grp_lock_release( stream->transport->grp_lock );
671677

672678
return status;
673679
}
@@ -2191,7 +2197,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_destroy( pjmedia_vid_stream *stream )
21912197
pjmedia_event_unsubscribe(NULL, &stream_event_cb, stream, &stream->rtcp);
21922198

21932199
/* Send RTCP BYE (also SDES) */
2194-
if (stream->transport && stream->grp_lock && !stream->rtcp_sdes_bye_disabled) {
2200+
if (stream->transport && !stream->rtcp_sdes_bye_disabled) {
21952201
send_rtcp(stream, PJ_TRUE, PJ_TRUE, PJ_FALSE, PJ_FALSE);
21962202
}
21972203

0 commit comments

Comments
 (0)