]> 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)
committerMike Jerris <mike@jerris.com>
Tue, 7 Mar 2017 19:48:34 +0000 (13:48 -0600)
Conflicts:
src/mod/applications/mod_conference/conference_video.c

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 351cd1f539ba4d0fa832177694c221a8a63e6aca..28e63d40bf5af2de3d0dfe4b99b3f3cb77bfc04a 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 02ba0d02bc1b7a8d7bde570bb227e81836889827..ee930c1253faa6e73ff26716b3c048d1341e6ac9 100644 (file)
@@ -3000,7 +3000,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);
@@ -3016,6 +3016,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 3a8a6a4986cc00197ffc31d9d23205fb0df48a2a..2d3e56e7a6118868ba961e3285c30dfd57486e76 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 {