diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 3b2fc327b3..e5249da357 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -345,12 +345,15 @@ SWITCH_DECLARE(void) switch_core_service_session(switch_core_session *session, s \param endpoint_name the name of the module to use for the new session \param caller_profile the originator's caller profile \param new_session a NULL pointer to aim at the newly created session + \param pool optional existing memory pool to donate to the session (WILL BE KEPT) \return SWITCH_STATUS_SUCCESS if the session was created + \note if the pool arguement is not null the pool will be adopted by the session and your pointer will be nulled */ SWITCH_DECLARE(switch_status) switch_core_session_outgoing_channel(switch_core_session *session, - char *endpoint_name, - switch_caller_profile *caller_profile, - switch_core_session **new_session); + char *endpoint_name, + switch_caller_profile *caller_profile, + switch_core_session **new_session, + switch_memory_pool **pool); /*! \brief Answer the channel of a given session diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h index 1bad60b166..a8ea0d1819 100644 --- a/src/include/switch_module_interfaces.h +++ b/src/include/switch_module_interfaces.h @@ -150,7 +150,7 @@ struct switch_io_event_hooks { /*! \brief A table of i/o routines that an endpoint interface can implement */ struct switch_io_routines { /*! creates an outgoing session from given session, caller profile */ - switch_status (*outgoing_channel)(switch_core_session *, switch_caller_profile *, switch_core_session **); + switch_status (*outgoing_channel)(switch_core_session *, switch_caller_profile *, switch_core_session **, switch_memory_pool *); /*! answers the given session's channel */ switch_status (*answer_channel)(switch_core_session *); /*! read a frame from a session */ diff --git a/src/mod/applications/mod_bridgecall/mod_bridgecall.c b/src/mod/applications/mod_bridgecall/mod_bridgecall.c index 3f064020bf..49de324f27 100644 --- a/src/mod/applications/mod_bridgecall/mod_bridgecall.c +++ b/src/mod/applications/mod_bridgecall/mod_bridgecall.c @@ -63,7 +63,7 @@ static void audio_bridge_function(switch_core_session *session, char *data) - if (switch_core_session_outgoing_channel(session, chan_type, caller_profile, &peer_session) != + if (switch_core_session_outgoing_channel(session, chan_type, caller_profile, &peer_session, NULL) != SWITCH_STATUS_SUCCESS) { switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Cannot Create Outgoing Channel!\n"); switch_channel_hangup(caller_channel); diff --git a/src/mod/endpoints/mod_exosip/mod_exosip.c b/src/mod/endpoints/mod_exosip/mod_exosip.c index 23d6c30b63..d301b24d59 100644 --- a/src/mod/endpoints/mod_exosip/mod_exosip.c +++ b/src/mod/endpoints/mod_exosip/mod_exosip.c @@ -156,7 +156,7 @@ static switch_status exosip_on_hangup(switch_core_session *session); static switch_status exosip_on_loopback(switch_core_session *session); static switch_status exosip_on_transmit(switch_core_session *session); static switch_status exosip_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session); + switch_core_session **new_session, switch_memory_pool *pool); static switch_status exosip_read_frame(switch_core_session *session, switch_frame **frame, int timeout, switch_io_flag flags, int stream_id); static switch_status exosip_write_frame(switch_core_session *session, switch_frame *frame, int timeout, @@ -878,9 +878,9 @@ static const switch_loadable_module_interface exosip_module_interface = { }; static switch_status exosip_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session) + switch_core_session **new_session, switch_memory_pool *pool) { - if ((*new_session = switch_core_session_request(&exosip_endpoint_interface, NULL)) != 0) { + if ((*new_session = switch_core_session_request(&exosip_endpoint_interface, pool)) != 0) { struct private_object *tech_pvt; switch_channel *channel; diff --git a/src/mod/endpoints/mod_iax/mod_iax.c b/src/mod/endpoints/mod_iax/mod_iax.c index 5168df50a7..d8f7cd83b0 100644 --- a/src/mod/endpoints/mod_iax/mod_iax.c +++ b/src/mod/endpoints/mod_iax/mod_iax.c @@ -393,7 +393,7 @@ static switch_status channel_on_ring(switch_core_session *session); static switch_status channel_on_loopback(switch_core_session *session); static switch_status channel_on_transmit(switch_core_session *session); static switch_status channel_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session); + switch_core_session **new_session, switch_memory_pool *pool); static switch_status channel_read_frame(switch_core_session *session, switch_frame **frame, int timeout, switch_io_flag flags, int stream_id); static switch_status channel_write_frame(switch_core_session *session, switch_frame *frame, int timeout, @@ -709,9 +709,9 @@ static const switch_loadable_module_interface channel_module_interface = { that allocate memory or you will have 1 channel with memory allocated from another channel's pool! */ static switch_status channel_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session) + switch_core_session **new_session, switch_memory_pool *pool) { - if ((*new_session = switch_core_session_request(&channel_endpoint_interface, NULL)) != 0) { + if ((*new_session = switch_core_session_request(&channel_endpoint_interface, pool)) != 0) { struct private_object *tech_pvt; switch_channel *channel; switch_caller_profile *caller_profile; diff --git a/src/mod/endpoints/mod_portaudio/mod_portaudio.c b/src/mod/endpoints/mod_portaudio/mod_portaudio.c index 48f251691a..24e539ff8c 100644 --- a/src/mod/endpoints/mod_portaudio/mod_portaudio.c +++ b/src/mod/endpoints/mod_portaudio/mod_portaudio.c @@ -105,7 +105,7 @@ SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_dialplan, globals.dialplan) static switch_status channel_on_transmit(switch_core_session *session); static switch_status channel_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session); + switch_core_session **new_session, switch_memory_pool *pool); static switch_status channel_read_frame(switch_core_session *session, switch_frame **frame, int timeout, switch_io_flag flags, int stream_id); static switch_status channel_write_frame(switch_core_session *session, switch_frame *frame, int timeout, @@ -476,9 +476,9 @@ static const switch_loadable_module_interface channel_module_interface = { that allocate memory or you will have 1 channel with memory allocated from another channel's pool! */ static switch_status channel_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session) + switch_core_session **new_session, switch_memory_pool *pool) { - if ((*new_session = switch_core_session_request(&channel_endpoint_interface, NULL)) != 0) { + if ((*new_session = switch_core_session_request(&channel_endpoint_interface, pool)) != 0) { struct private_object *tech_pvt; switch_channel *channel; switch_caller_profile *caller_profile; diff --git a/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c b/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c index 281dd54422..9d68075c62 100644 --- a/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c +++ b/src/mod/endpoints/mod_wanpipe/mod_wanpipe.c @@ -193,7 +193,7 @@ static switch_status wanpipe_on_hangup(switch_core_session *session); static switch_status wanpipe_on_loopback(switch_core_session *session); static switch_status wanpipe_on_transmit(switch_core_session *session); static switch_status wanpipe_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session); + switch_core_session **new_session, switch_memory_pool *pool); static switch_status wanpipe_read_frame(switch_core_session *session, switch_frame **frame, int timeout, switch_io_flag flags, int stream_id); static switch_status wanpipe_write_frame(switch_core_session *session, switch_frame *frame, int timeout, @@ -356,7 +356,7 @@ static switch_status wanpipe_on_transmit(switch_core_session *session) } static switch_status wanpipe_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session) + switch_core_session **new_session, switch_memory_pool *pool) { if (!globals.configured_spans) { switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Error No Spans Configured.\n"); @@ -364,7 +364,7 @@ static switch_status wanpipe_outgoing_channel(switch_core_session *session, swit } - if ((*new_session = switch_core_session_request(&wanpipe_endpoint_interface, NULL))) { + if ((*new_session = switch_core_session_request(&wanpipe_endpoint_interface, pool))) { struct private_object *tech_pvt; switch_channel *channel; diff --git a/src/mod/endpoints/mod_woomera/mod_woomera.c b/src/mod/endpoints/mod_woomera/mod_woomera.c index a605c2286d..bf26a21c2c 100644 --- a/src/mod/endpoints/mod_woomera/mod_woomera.c +++ b/src/mod/endpoints/mod_woomera/mod_woomera.c @@ -169,7 +169,7 @@ static switch_status woomerachan_on_ring(switch_core_session *session); static switch_status woomerachan_on_loopback(switch_core_session *session); static switch_status woomerachan_on_transmit(switch_core_session *session); static switch_status woomerachan_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session); + switch_core_session **new_session, switch_memory_pool *pool); static switch_status woomerachan_read_frame(switch_core_session *session, switch_frame **frame, int timeout, switch_io_flag flags, int stream_id); static switch_status woomerachan_write_frame(switch_core_session *session, switch_frame *frame, int timeout, @@ -466,9 +466,9 @@ static const switch_loadable_module_interface woomerachan_module_interface = { that allocate memory or you will have 1 channel with memory allocated from another channel's pool! */ static switch_status woomerachan_outgoing_channel(switch_core_session *session, switch_caller_profile *outbound_profile, - switch_core_session **new_session) + switch_core_session **new_session, switch_memory_pool *pool) { - if ((*new_session = switch_core_session_request(&woomerachan_endpoint_interface, NULL)) != 0) { + if ((*new_session = switch_core_session_request(&woomerachan_endpoint_interface, pool)) != 0) { struct private_object *tech_pvt; switch_channel *channel; diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index 1e9ce2fc23..cab5289f78 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -106,7 +106,6 @@ struct js_session { switch_core_session *session; JSContext *cx; JSObject *obj; - switch_memory_pool *pool; unsigned int flags; }; @@ -922,16 +921,13 @@ static JSBool session_construct(JSContext *cx, JSObject *obj, uintN argc, jsval } caller_profile = switch_caller_profile_new(pool, dialplan, cid_name, cid_num, network_addr, ani, ani2, dest); - if (switch_core_session_outgoing_channel(session, channel_type, caller_profile, &peer_session) == SWITCH_STATUS_SUCCESS) { + if (switch_core_session_outgoing_channel(session, channel_type, caller_profile, &peer_session, &pool) == SWITCH_STATUS_SUCCESS) { jss = switch_core_session_alloc(peer_session, sizeof(*jss)); jss->session = peer_session; jss->flags = 0; jss->cx = cx; jss->obj = obj; JS_SetPrivate(cx, obj, jss); - if (need_pool) { - jss->pool = pool; - } switch_core_session_thread_launch(peer_session); switch_set_flag(jss, S_HUP); @@ -943,7 +939,7 @@ static JSBool session_construct(JSContext *cx, JSObject *obj, uintN argc, jsval switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Missing Args\n"); } - if (need_pool) { + if (pool) { switch_core_destroy_memory_pool(&pool); } return JS_FALSE; @@ -955,10 +951,6 @@ static void session_destroy(JSContext *cx, JSObject *obj) if (cx && obj) { if ((jss = JS_GetPrivate(cx, obj))) { - if (jss->pool) { - switch_core_destroy_memory_pool(&jss->pool); - } - if (switch_test_flag(jss, S_HUP)) { switch_channel *channel; diff --git a/src/switch_core.c b/src/switch_core.c index 7a15a8dc7e..9ded65f2f1 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -779,7 +779,8 @@ SWITCH_DECLARE(int) switch_core_session_get_stream_count(switch_core_session *se SWITCH_DECLARE(switch_status) switch_core_session_outgoing_channel(switch_core_session *session, char *endpoint_name, switch_caller_profile *caller_profile, - switch_core_session **new_session) + switch_core_session **new_session, + switch_memory_pool **pool) { struct switch_io_event_hook_outgoing_channel *ptr; switch_status status = SWITCH_STATUS_FALSE; @@ -793,7 +794,9 @@ SWITCH_DECLARE(switch_status) switch_core_session_outgoing_channel(switch_core_s if (endpoint_interface->io_routines->outgoing_channel) { if ((status = endpoint_interface->io_routines->outgoing_channel(session, caller_profile, - new_session)) == SWITCH_STATUS_SUCCESS) { + new_session, *pool)) == SWITCH_STATUS_SUCCESS) { + /* session has adopted this pool we cant touch it now */ + *pool = NULL; if (session) { for (ptr = session->event_hooks.outgoing_channel; ptr; ptr = ptr->next) { if ((status = ptr->outgoing_channel(session, caller_profile, *new_session)) != SWITCH_STATUS_SUCCESS) {