Skip to content

Commit a73f20d

Browse files
committed
Added mutex around socket close (see #2599)
1 parent 4f23c9c commit a73f20d

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

plugins/janus_audiobridge.c

+9-1
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,7 @@ typedef struct janus_audiobridge_participant {
13701370
/* Plain RTP, in case this is not a WebRTC participant */
13711371
gboolean plainrtp; /* Whether this is a WebRTC participant, or a plain RTP one */
13721372
janus_audiobridge_plainrtp_media plainrtp_media;
1373+
janus_mutex pmutex;
13731374
/* Opus stuff */
13741375
OpusEncoder *encoder; /* Opus encoder instance */
13751376
OpusDecoder *decoder; /* Opus decoder instance */
@@ -1442,7 +1443,9 @@ static void janus_audiobridge_participant_free(const janus_refcount *participant
14421443
#ifdef HAVE_LIBOGG
14431444
janus_audiobridge_file_free(participant->annc);
14441445
#endif
1446+
janus_mutex_lock(&participant->pmutex);
14451447
janus_audiobridge_plainrtp_media_cleanup(&participant->plainrtp_media);
1448+
janus_mutex_unlock(&participant->pmutex);
14461449
g_free(participant);
14471450
}
14481451

@@ -5512,6 +5515,7 @@ static void *janus_audiobridge_handler(void *data) {
55125515
janus_mutex_init(&participant->qmutex);
55135516
participant->arc = NULL;
55145517
janus_audiobridge_plainrtp_media_cleanup(&participant->plainrtp_media);
5518+
janus_mutex_init(&participant->pmutex);
55155519
janus_mutex_init(&participant->rec_mutex);
55165520
}
55175521
participant->session = session;
@@ -5598,7 +5602,6 @@ static void *janus_audiobridge_handler(void *data) {
55985602
}
55995603
participant->reset = FALSE;
56005604
/* If this is a plain RTP participant, create the socket */
5601-
janus_audiobridge_plainrtp_media_cleanup(&participant->plainrtp_media);
56025605
if(rtp != NULL) {
56035606
const char *ip = json_string_value(json_object_get(rtp, "ip"));
56045607
uint16_t port = json_integer_value(json_object_get(rtp, "port"));
@@ -5615,6 +5618,8 @@ static void *janus_audiobridge_handler(void *data) {
56155618
opus_encoder_ctl(participant->encoder, OPUS_SET_INBAND_FEC(participant->fec));
56165619
}
56175620
/* Create the socket */
5621+
janus_mutex_lock(&participant->pmutex);
5622+
janus_audiobridge_plainrtp_media_cleanup(&participant->plainrtp_media);
56185623
if(janus_audiobridge_plainrtp_allocate_port(&participant->plainrtp_media) < 0) {
56195624
JANUS_LOG(LOG_ERR, "[AudioBridge-%p] Couldn't bind to local port\n", session);
56205625
} else if(ip != NULL && port > 0) {
@@ -5647,6 +5652,7 @@ static void *janus_audiobridge_handler(void *data) {
56475652
}
56485653
}
56495654
}
5655+
janus_mutex_unlock(&participant->pmutex);
56505656
}
56515657
/* Finally, start the encoding thread if it hasn't already */
56525658
if(participant->thread == NULL) {
@@ -7492,7 +7498,9 @@ static void *janus_audiobridge_plainrtp_relay_thread(void *data) {
74927498
}
74937499
/* Cleanup the media session */
74947500
participant->plainrtp_media.thread = NULL;
7501+
janus_mutex_lock(&participant->pmutex);
74957502
janus_audiobridge_plainrtp_media_cleanup(&participant->plainrtp_media);
7503+
janus_mutex_unlock(&participant->pmutex);
74967504
/* Done */
74977505
JANUS_LOG(LOG_INFO, "[AudioBridge-%p] Leaving Plain RTP participant thread\n", session);
74987506
janus_refcount_decrease(&participant->ref);

0 commit comments

Comments
 (0)