]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix close file snafu
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 28 Oct 2015 23:32:16 +0000 (18:32 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 9 Nov 2015 21:13:19 +0000 (15:13 -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 45a7913d3fb76197be27e42ec9ae6d12aefab553..8ca5b0d754706488658b7328a5d29b5f575865fa 100644 (file)
@@ -410,6 +410,45 @@ switch_status_t conference_file_local_play(conference_obj_t *conference, switch_
        return status;
 }
 
+switch_status_t conference_close_open_files(conference_obj_t *conference)
+{
+       int x = 0;
+
+       switch_mutex_lock(conference->mutex);
+       /* Close Unused Handles */
+       if (conference->fnode) {
+               conference_file_node_t *fnode, *cur;
+               switch_memory_pool_t *pool;
+
+               fnode = conference->fnode;
+               while (fnode) {
+                       cur = fnode;
+                       fnode = fnode->next;
+
+                       if (cur->type != NODE_TYPE_SPEECH) {
+                               conference_file_close(conference, cur);
+                       }
+
+                       pool = cur->pool;
+                       switch_core_destroy_memory_pool(&pool);
+                       x++;
+               }
+               conference->fnode = NULL;
+       }
+
+       if (conference->async_fnode) {
+               switch_memory_pool_t *pool;
+               conference_file_close(conference, conference->async_fnode);
+               pool = conference->async_fnode->pool;
+               conference->async_fnode = NULL;
+               switch_core_destroy_memory_pool(&pool);
+               x++;
+       }
+       switch_mutex_unlock(conference->mutex);
+
+       return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
+}
+
 /* For Emacs:
  * Local Variables:
  * mode:c
index 166b07b9b13a804639c80de7accfe561925804e2..7bdf4611bc30b7ef385c0f37ed50a407f5035e13 100644 (file)
@@ -2681,6 +2681,8 @@ void *SWITCH_THREAD_FUNC conference_video_muxing_thread_run(switch_thread_t *thr
                }
        }
 
+       conference_close_open_files(conference);
+
        switch_core_timer_destroy(&canvas->timer);
        conference_video_destroy_canvas(&canvas);
 
index eab3e0ff679ca4da78332c56522880c1f580f935..d4dce634813b8ac8854f6564f44db067633b9ca4 100644 (file)
@@ -860,7 +860,7 @@ void conference_member_add_file_data(conference_member_t *member, int16_t *data,
 void conference_send_notify(conference_obj_t *conference, const char *status, const char *call_id, switch_bool_t final);
 switch_status_t conference_file_close(conference_obj_t *conference, conference_file_node_t *node);
 void *SWITCH_THREAD_FUNC conference_record_thread_run(switch_thread_t *thread, void *obj);
-
+switch_status_t conference_close_open_files(conference_obj_t *conference);
 void conference_al_gen_arc(conference_obj_t *conference, switch_stream_handle_t *stream);
 void conference_al_process(al_handle_t *al, void *data, switch_size_t datalen, int rate);