forked from Mirrors/freeswitch
[mod_sofia] Fix memory leaks caused by improper profile destroy. Add a unit-test.
This commit is contained in:
parent
dcb75a79e3
commit
3065cb9168
|
@ -3180,7 +3180,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
if (!sofia_glue_init_sql(profile)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database [%s]!\n", profile->name);
|
||||
sofia_profile_start_failure(profile, profile->name);
|
||||
sofia_glue_del_profile(profile);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
@ -3332,7 +3331,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
}
|
||||
|
||||
sofia_profile_start_failure(profile, profile->name);
|
||||
sofia_glue_del_profile(profile);
|
||||
goto end;
|
||||
}
|
||||
|
||||
|
@ -3500,6 +3498,20 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
}
|
||||
}
|
||||
|
||||
/* Do gateway cleanups */
|
||||
sofia_glue_del_every_gateway(profile);
|
||||
sofia_reg_check_gateway(profile, switch_epoch_time_now(NULL));
|
||||
sofia_sub_check_gateway(profile, switch_epoch_time_now(NULL));
|
||||
sofia_glue_fire_events(profile);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for worker thread\n");
|
||||
|
||||
if (worker_thread) {
|
||||
switch_thread_join(&st, worker_thread);
|
||||
}
|
||||
else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: Sofia worker thead failed to start\n");
|
||||
}
|
||||
|
||||
sofia_reg_unregister(profile);
|
||||
nua_shutdown(profile->nua);
|
||||
|
@ -3514,13 +3526,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
|
||||
sofia_clear_pflag_locked(profile, PFLAG_RUNNING);
|
||||
sofia_clear_pflag_locked(profile, PFLAG_SHUTDOWN);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for worker thread\n");
|
||||
|
||||
if ( worker_thread ) {
|
||||
switch_thread_join(&st, worker_thread);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: Sofia worker thead failed to start\n");
|
||||
}
|
||||
|
||||
sanity = 4;
|
||||
while (profile->inuse) {
|
||||
|
@ -3569,6 +3574,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
}
|
||||
}
|
||||
|
||||
end:
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write lock %s\n", profile->name);
|
||||
switch_thread_rwlock_wrlock(profile->rwlock);
|
||||
|
||||
|
@ -3590,7 +3596,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
|||
|
||||
sofia_profile_destroy(profile);
|
||||
|
||||
end:
|
||||
switch_mutex_lock(mod_sofia_globals.mutex);
|
||||
mod_sofia_globals.threads--;
|
||||
switch_mutex_unlock(mod_sofia_globals.mutex);
|
||||
|
|
|
@ -2,7 +2,7 @@ include $(top_srcdir)/build/modmake.rulesam
|
|||
|
||||
noinst_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core switch_console switch_vpx switch_core_file \
|
||||
switch_ivr_play_say switch_core_codec switch_rtp switch_xml
|
||||
noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_core_asr
|
||||
noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_core_asr test_sofia
|
||||
|
||||
AM_LDFLAGS += -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS)
|
||||
AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
<?xml version="1.0"?>
|
||||
<document type="freeswitch/xml">
|
||||
<section name="configuration" description="Various Configuration">
|
||||
|
||||
<configuration name="modules.conf" description="Modules">
|
||||
<modules>
|
||||
<load module="mod_sofia"/>
|
||||
</modules>
|
||||
</configuration>
|
||||
|
||||
<configuration name="console.conf" description="Console Logger">
|
||||
<mappings>
|
||||
<map name="all" value="console,debug,info,notice,warning,err,crit,alert"/>
|
||||
</mappings>
|
||||
<settings>
|
||||
<param name="colorize" value="true"/>
|
||||
<param name="uuid" value="true"/>
|
||||
<param name="loglevel" value="debug"/>
|
||||
</settings>
|
||||
</configuration>
|
||||
<configuration name="sofia.conf" description="SofiaSIP">
|
||||
<profiles>
|
||||
<profile name="external">
|
||||
<gateways>
|
||||
<gateway name="faxtest">
|
||||
<param name="username" value="not-used"/>
|
||||
<param name="password" value="not-used"/>
|
||||
<param name="proxy" value="$${local_ip_v4}:61060"/>
|
||||
<param name="register" value="false"/>
|
||||
<param name="retry-seconds" value="30"/>
|
||||
<param name="dtmf-type" value="rfc2833"/>
|
||||
<variables>
|
||||
<variable name="rtp_secure_media" value="false" direction="outbound"/>
|
||||
</variables>
|
||||
</gateway>
|
||||
</gateways>
|
||||
|
||||
<domains>
|
||||
<domain name="all" alias="false" parse="true"/>
|
||||
</domains>
|
||||
|
||||
<settings>
|
||||
<param name="debug" value="1"/>
|
||||
<param name="shutdown-on-fail" value="true"/>
|
||||
<param name="p-asserted-id-parse" value="verbatim"/>
|
||||
<param name="username" value="SignalWire-STACK"/>
|
||||
<param name="user-agent-string" value="SignalWire STACK Unit Test"/>
|
||||
<param name="sip-trace" value="yes"/>
|
||||
<param name="sip-capture" value="no"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<param name="sip-port" value="61060"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="context" value="default"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="PCMU"/>
|
||||
<param name="outbound-codec-prefs" value="PCMU"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<param name="local-network-acl" value="localnet.auto"/>
|
||||
<param name="manage-presence" value="false"/>
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
<param name="inbound-zrtp-passthru" value="false"/>
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<param name="sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="ext-rtp-ip" value="$${local_ip_v4}"/>
|
||||
<param name="ext-sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<param name="session-timeout" value="600"/>
|
||||
<param name="minimum-session-expires" value="90"/>
|
||||
<param name="tls" value="false"/>
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
<profile name="internal">
|
||||
<gateways>
|
||||
</gateways>
|
||||
|
||||
<domains>
|
||||
<domain name="all" alias="false" parse="true"/>
|
||||
</domains>
|
||||
|
||||
<settings>
|
||||
<param name="debug" value="1"/>
|
||||
<param name="shutdown-on-fail" value="true"/>
|
||||
<param name="p-asserted-id-parse" value="verbatim"/>
|
||||
<param name="username" value="SignalWire-STACK"/>
|
||||
<param name="user-agent-string" value="SignalWire STACK Unit Test"/>
|
||||
<param name="sip-trace" value="yes"/>
|
||||
<param name="sip-capture" value="no"/>
|
||||
<param name="rfc2833-pt" value="101"/>
|
||||
<param name="sip-port" value="61061"/>
|
||||
<param name="dialplan" value="XML"/>
|
||||
<param name="context" value="default"/>
|
||||
<param name="dtmf-duration" value="2000"/>
|
||||
<param name="inbound-codec-prefs" value="PCMU"/>
|
||||
<param name="outbound-codec-prefs" value="PCMU"/>
|
||||
<param name="rtp-timer-name" value="soft"/>
|
||||
<param name="local-network-acl" value="localnet.auto"/>
|
||||
<param name="manage-presence" value="false"/>
|
||||
<param name="inbound-codec-negotiation" value="generous"/>
|
||||
<param name="nonce-ttl" value="60"/>
|
||||
<param name="inbound-late-negotiation" value="true"/>
|
||||
<param name="inbound-zrtp-passthru" value="false"/>
|
||||
<param name="rtp-ip" value="$${local_ip_v4}"/>
|
||||
<param name="sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="ext-rtp-ip" value="$${local_ip_v4}"/>
|
||||
<param name="ext-sip-ip" value="$${local_ip_v4}"/>
|
||||
<param name="rtp-timeout-sec" value="300"/>
|
||||
<param name="rtp-hold-timeout-sec" value="1800"/>
|
||||
<param name="session-timeout" value="600"/>
|
||||
<param name="minimum-session-expires" value="90"/>
|
||||
<param name="tls" value="false"/>
|
||||
</settings>
|
||||
</profile>
|
||||
|
||||
</profiles>
|
||||
</configuration>
|
||||
|
||||
<configuration name="switch.conf" description="Switch">
|
||||
<param name="rtp-start-port" value="20000"/>
|
||||
<param name="rtp-end-port" value="30000"/>
|
||||
<param name="threaded-system-exec" value="true"/>
|
||||
</configuration>
|
||||
|
||||
<configuration name="timezones.conf" description="Timezones">
|
||||
<timezones>
|
||||
<zone name="GMT" value="GMT0" />
|
||||
</timezones>
|
||||
</configuration>
|
||||
</section>
|
||||
|
||||
<section name="dialplan" description="Regex/XML Dialplan">
|
||||
<context name="default">
|
||||
<extension name="sample">
|
||||
<condition>
|
||||
<action application="info"/>
|
||||
</condition>
|
||||
</extension>
|
||||
|
||||
</context>
|
||||
</section>
|
||||
</document>
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Copyright (C) 2018-2019, Signalwire, Inc. ALL RIGHTS RESERVED
|
||||
* test_sofia.c -- Tests mod_sofia for memory leaks
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <test/switch_test.h>
|
||||
|
||||
FST_CORE_DB_BEGIN("conf_sofia")
|
||||
{
|
||||
FST_SUITE_BEGIN(switch_sofia)
|
||||
{
|
||||
FST_SETUP_BEGIN()
|
||||
{
|
||||
fst_requires_module("mod_sofia");
|
||||
}
|
||||
FST_SETUP_END()
|
||||
|
||||
FST_TEARDOWN_BEGIN()
|
||||
{
|
||||
}
|
||||
FST_TEARDOWN_END()
|
||||
|
||||
FST_TEST_BEGIN(sofia_leaks)
|
||||
{
|
||||
}
|
||||
FST_TEST_END()
|
||||
}
|
||||
FST_SUITE_END()
|
||||
}
|
||||
FST_CORE_END()
|
Loading…
Reference in New Issue