]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10079: [mod_conference] Possible lockup when sending many commands to conference...
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 1 Mar 2017 20:27:41 +0000 (14:27 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 1 Mar 2017 20:27:41 +0000 (14:27 -0600)
src/mod/applications/mod_conference/conference_file.c
src/mod/applications/mod_conference/conference_video.c
src/mod/applications/mod_conference/mod_conference.h

index e64ac1dd86e0276f4bc07ff171805a4f875b3338..0c125cd7a4f1a449d857ba36be3eb21afbb4d415 100644 (file)
@@ -160,11 +160,11 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u
                return SWITCH_STATUS_NOTFOUND;
        }
 
-       switch_mutex_lock(conference->mutex);
+
        switch_mutex_lock(conference->member_mutex);
        count = conference->count;
        switch_mutex_unlock(conference->member_mutex);
-       switch_mutex_unlock(conference->mutex);
+
 
        if (!count) {
                return SWITCH_STATUS_FALSE;
@@ -316,7 +316,8 @@ switch_status_t conference_file_play(conference_obj_t *conference, char *file, u
        fnode->file = switch_core_strdup(fnode->pool, file);
 
        if (!conference->fnode || (async && !conference->async_fnode)) {
-               conference_video_fnode_check(fnode, -1);
+               fnode->new_fnode = 1;
+               //conference_video_fnode_check(fnode, -1);
        }
 
        /* Queue the node */
index 9cc7d6c4ad4fd3a037d4dcb43aa5bcfef9410aeb..faf662e09168169410b1669dd6309ce4dbb475bf 100644 (file)
@@ -3123,7 +3123,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
 
                        switch_mutex_unlock(conference->member_mutex);
                } else {
-
+                       switch_mutex_lock(conference->file_mutex);
                        if (conference->async_fnode && (conference->async_fnode->canvas_id == canvas->canvas_id || conference->async_fnode->canvas_id == -1)) {
                                if (conference->async_fnode->layer_id > -1) {
                                        conference_video_patch_fnode(canvas, conference->async_fnode);
@@ -3139,6 +3139,7 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                                        conference_video_fnode_check(conference->fnode, canvas->canvas_id);
                                }
                        }
+                       switch_mutex_unlock(conference->file_mutex);
 
                        if (!conference->playing_video_file) {
                                for (i = 0; i < canvas->total_layers; i++) {
index 24efb8118687795495a7d997cad18b8a9513ce76..aa20997488e14fd94afb0c8b159719c3ccd7336b 100644 (file)
@@ -387,6 +387,7 @@ typedef struct conference_file_node {
        struct conference_obj *conference;
        char *res_id;
        int loops;
+       int new_fnode;
 } conference_file_node_t;
 
 typedef enum {