Merge branch 'master' into smgmaster

This commit is contained in:
Moises Silva 2010-09-20 12:31:15 -04:00
commit d4232aa8cc
13 changed files with 175 additions and 45 deletions

7
debian/changelog vendored
View File

@ -1,3 +1,10 @@
freeswitch (1.0.6-1ubuntu1) maverick; urgency=low
* upgrade: Added mod_callcenter and pulled out Python into its own
package.
-- Gabriel Gunderson <gabe@gundy.org> Thu, 16 Nov 2010 18:28:30 -0800
freeswitch (1.0.4-1ubuntu2) karmic; urgency=low freeswitch (1.0.4-1ubuntu2) karmic; urgency=low
* upgrade: Add more verbosity when building to make it easier to find build * upgrade: Add more verbosity when building to make it easier to find build

14
debian/control vendored
View File

@ -2,7 +2,7 @@ Source: freeswitch
Section: comm Section: comm
Priority: extra Priority: extra
Maintainer: Michal Bielicki <michal.bielicki@voiceworks.pl> Maintainer: Michal Bielicki <michal.bielicki@voiceworks.pl>
Build-Depends: debhelper (>= 5), fakeroot, wget, automake (>=1.9), autoconf, libtool, unixodbc-dev, libasound2-dev, libcurl3-openssl-dev|libcurl4-openssl-dev, libssl-dev, ncurses-dev, libogg-dev, libvorbis-dev, libperl-dev, libgdbm-dev, libdb-dev, libgnutls-dev, libtiff4-dev, python, libx11-dev, uuid-dev Build-Depends: debhelper (>= 5), fakeroot, wget, automake (>=1.9), autoconf, libtool, unixodbc-dev, libasound2-dev, libcurl3-openssl-dev|libcurl4-openssl-dev, libssl-dev, ncurses-dev, libogg-dev, libvorbis-dev, libperl-dev, libgdbm-dev, libdb-dev, libgnutls-dev, libtiff4-dev, python-dev, libx11-dev, uuid-dev
Homepage: http://freeswitch.org/ Homepage: http://freeswitch.org/
Standards-Version: 3.8.4 Standards-Version: 3.8.4
Vcs-Svn: http://svn.freeswitch.org/svn/freeswitch/trunk/ Vcs-Svn: http://svn.freeswitch.org/svn/freeswitch/trunk/
@ -86,6 +86,18 @@ Description: Lua engine for FreeSWITCH
. .
This package contains the mod_lua language module. This package contains the mod_lua language module.
Package: freeswitch-python
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch
Description: Python engine for FreeSWITCH
FreeSWITCH is an open source telephony platform designed to facilitate the
creation of voice and chat driven products scaling from a soft-phone up to a
soft-switch. It can be used as a simple switching engine, a PBX, a media
gateway or a media server to host IVR applications using simple scripts or XML
to control the callflow.
.
This package contains the mod_python language module.
Package: freeswitch-codec-passthru-g7231 Package: freeswitch-codec-passthru-g7231
Architecture: any Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch Depends: ${shlibs:Depends}, ${misc:Depends}, freeswitch

View File

@ -1,5 +1,6 @@
/opt/freeswitch/conf/autoload_configs/acl.conf.xml /opt/freeswitch/conf/autoload_configs/acl.conf.xml
/opt/freeswitch/conf/autoload_configs/alsa.conf.xml /opt/freeswitch/conf/autoload_configs/alsa.conf.xml
/opt/freeswitch/conf/autoload_configs/callcenter.conf.xml
/opt/freeswitch/conf/autoload_configs/cdr_csv.conf.xml /opt/freeswitch/conf/autoload_configs/cdr_csv.conf.xml
/opt/freeswitch/conf/autoload_configs/cidlookup.conf.xml /opt/freeswitch/conf/autoload_configs/cidlookup.conf.xml
/opt/freeswitch/conf/autoload_configs/conference.conf.xml /opt/freeswitch/conf/autoload_configs/conference.conf.xml
@ -26,7 +27,6 @@
/opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml /opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml
/opt/freeswitch/conf/autoload_configs/portaudio.conf.xml /opt/freeswitch/conf/autoload_configs/portaudio.conf.xml
/opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml /opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml
/opt/freeswitch/conf/autoload_configs/python.conf.xml
/opt/freeswitch/conf/autoload_configs/rss.conf.xml /opt/freeswitch/conf/autoload_configs/rss.conf.xml
/opt/freeswitch/conf/autoload_configs/shout.conf.xml /opt/freeswitch/conf/autoload_configs/shout.conf.xml
/opt/freeswitch/conf/autoload_configs/skinny.conf.xml /opt/freeswitch/conf/autoload_configs/skinny.conf.xml
@ -43,7 +43,6 @@
/opt/freeswitch/conf/autoload_configs/zeroconf.conf.xml /opt/freeswitch/conf/autoload_configs/zeroconf.conf.xml
/opt/freeswitch/conf/dialplan/default/00_pizza_demo.xml /opt/freeswitch/conf/dialplan/default/00_pizza_demo.xml
/opt/freeswitch/conf/dialplan/default/01_example.com.xml /opt/freeswitch/conf/dialplan/default/01_example.com.xml
/opt/freeswitch/conf/dialplan/default/99999_enum.xml
/opt/freeswitch/conf/dialplan/default.xml /opt/freeswitch/conf/dialplan/default.xml
/opt/freeswitch/conf/dialplan/features.xml /opt/freeswitch/conf/dialplan/features.xml
/opt/freeswitch/conf/dialplan/public/00_inbound_did.xml /opt/freeswitch/conf/dialplan/public/00_inbound_did.xml

View File

@ -6,6 +6,7 @@ opt/freeswitch/bin/gentls_cert
opt/freeswitch/bin/scripts/* opt/freeswitch/bin/scripts/*
opt/freeswitch/conf/autoload_configs/acl.conf.xml opt/freeswitch/conf/autoload_configs/acl.conf.xml
opt/freeswitch/conf/autoload_configs/alsa.conf.xml opt/freeswitch/conf/autoload_configs/alsa.conf.xml
opt/freeswitch/conf/autoload_configs/callcenter.conf.xml
opt/freeswitch/conf/autoload_configs/cdr_csv.conf.xml opt/freeswitch/conf/autoload_configs/cdr_csv.conf.xml
opt/freeswitch/conf/autoload_configs/cidlookup.conf.xml opt/freeswitch/conf/autoload_configs/cidlookup.conf.xml
opt/freeswitch/conf/autoload_configs/conference.conf.xml opt/freeswitch/conf/autoload_configs/conference.conf.xml
@ -34,7 +35,6 @@ opt/freeswitch/conf/autoload_configs/openzap.conf.xml
opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml opt/freeswitch/conf/autoload_configs/pocketsphinx.conf.xml
opt/freeswitch/conf/autoload_configs/portaudio.conf.xml opt/freeswitch/conf/autoload_configs/portaudio.conf.xml
opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml opt/freeswitch/conf/autoload_configs/post_load_modules.conf.xml
opt/freeswitch/conf/autoload_configs/python.conf.xml
opt/freeswitch/conf/autoload_configs/rss.conf.xml opt/freeswitch/conf/autoload_configs/rss.conf.xml
opt/freeswitch/conf/autoload_configs/shout.conf.xml opt/freeswitch/conf/autoload_configs/shout.conf.xml
opt/freeswitch/conf/autoload_configs/skinny.conf.xml opt/freeswitch/conf/autoload_configs/skinny.conf.xml
@ -51,7 +51,6 @@ opt/freeswitch/conf/autoload_configs/xml_rpc.conf.xml
opt/freeswitch/conf/autoload_configs/zeroconf.conf.xml opt/freeswitch/conf/autoload_configs/zeroconf.conf.xml
opt/freeswitch/conf/dialplan/default/00_pizza_demo.xml opt/freeswitch/conf/dialplan/default/00_pizza_demo.xml
opt/freeswitch/conf/dialplan/default/01_example.com.xml opt/freeswitch/conf/dialplan/default/01_example.com.xml
opt/freeswitch/conf/dialplan/default/99999_enum.xml
opt/freeswitch/conf/dialplan/default.xml opt/freeswitch/conf/dialplan/default.xml
opt/freeswitch/conf/dialplan/features.xml opt/freeswitch/conf/dialplan/features.xml
opt/freeswitch/conf/dialplan/public/00_inbound_did.xml opt/freeswitch/conf/dialplan/public/00_inbound_did.xml
@ -113,6 +112,7 @@ opt/freeswitch/conf/zt.conf
opt/freeswitch/htdocs/* opt/freeswitch/htdocs/*
opt/freeswitch/lib/libfreeswitch*.so* opt/freeswitch/lib/libfreeswitch*.so*
opt/freeswitch/lib/libopenzap*.so* opt/freeswitch/lib/libopenzap*.so*
opt/freeswitch/mod/mod_callcenter.so*
opt/freeswitch/mod/mod_cdr_csv.so* opt/freeswitch/mod/mod_cdr_csv.so*
opt/freeswitch/mod/mod_celt.so* opt/freeswitch/mod/mod_celt.so*
opt/freeswitch/mod/mod_cidlookup.so* opt/freeswitch/mod/mod_cidlookup.so*

6
debian/rules vendored
View File

@ -13,7 +13,7 @@ export APPLICATIONS_MODULES=applications/mod_cluechoo applications/mod_commands
applications/mod_hash applications/mod_db applications/mod_valet_parking applications/mod_voicemail applications/mod_rss \ applications/mod_hash applications/mod_db applications/mod_valet_parking applications/mod_voicemail applications/mod_rss \
applications/mod_spandsp applications/mod_cidlookup applications/mod_curl applications/mod_easyroute \ applications/mod_spandsp applications/mod_cidlookup applications/mod_curl applications/mod_easyroute \
applications/mod_lcr applications/mod_nibblebill applications/mod_snom \ applications/mod_lcr applications/mod_nibblebill applications/mod_snom \
applications/mod_spy applications/mod_vmd applications/mod_directory applications/mod_spy applications/mod_vmd applications/mod_directory applications/mod_callcenter
export ASR_TTS_MODULES=asr_tts/mod_tts_commandline export ASR_TTS_MODULES=asr_tts/mod_tts_commandline
export CODECS_MODULES=codecs/mod_ilbc codecs/mod_h26x codecs/mod_speex codecs/mod_siren codecs/mod_celt export CODECS_MODULES=codecs/mod_ilbc codecs/mod_h26x codecs/mod_speex codecs/mod_siren codecs/mod_celt
export DIALPLANS_MODULES=dialplans/mod_dialplan_asterisk dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml export DIALPLANS_MODULES=dialplans/mod_dialplan_asterisk dialplans/mod_dialplan_directory dialplans/mod_dialplan_xml
@ -24,11 +24,11 @@ export ENDPOINTS_MODULES=endpoints/mod_dingaling endpoints/mod_portaudio endpoin
endpoints/mod_skinny endpoints/mod_skinny
export EVENT_HANDLERS_MODULES=event_handlers/mod_event_multicast event_handlers/mod_event_socket event_handlers/mod_cdr_csv export EVENT_HANDLERS_MODULES=event_handlers/mod_event_multicast event_handlers/mod_event_socket event_handlers/mod_cdr_csv
export FORMATS_MODULES=formats/mod_local_stream formats/mod_native_file formats/mod_sndfile formats/mod_tone_stream formats/mod_shout export FORMATS_MODULES=formats/mod_local_stream formats/mod_native_file formats/mod_sndfile formats/mod_tone_stream formats/mod_shout
export LANGUAGES_MODULES=languages/mod_spidermonkey languages/mod_perl languages/mod_lua export LANGUAGES_MODULES=languages/mod_spidermonkey languages/mod_perl languages/mod_lua languages/mod_python
export LOGGERS_MODULES=loggers/mod_console loggers/mod_logfile loggers/mod_syslog export LOGGERS_MODULES=loggers/mod_console loggers/mod_logfile loggers/mod_syslog
export SAY_MODULES=say/mod_say_en say/mod_say_it say/mod_say_de say/mod_say_fr say/mod_say_es say/mod_say_nl say/mod_say_ru export SAY_MODULES=say/mod_say_en say/mod_say_it say/mod_say_de say/mod_say_fr say/mod_say_es say/mod_say_nl say/mod_say_ru
export TIMERS_MODULES= export TIMERS_MODULES=
export DISABLED_MODULES=applications/mod_memcache applications/mod_soundtouch directories/mod_ldap languages/mod_java languages/mod_python \ export DISABLED_MODULES=applications/mod_memcache applications/mod_soundtouch directories/mod_ldap languages/mod_java \
asr_tts/mod_cepstral asr_tts/mod_lumenvox endpoints/mod_wanpipe \ asr_tts/mod_cepstral asr_tts/mod_lumenvox endpoints/mod_wanpipe \
event_handlers/mod_event_test event_handlers/mod_radius_cdr event_handlers/mod_zeroconf event_handlers/mod_event_test event_handlers/mod_radius_cdr event_handlers/mod_zeroconf
export XML_INT_MODULES=xml_int/mod_xml_rpc xml_int/mod_xml_curl xml_int/mod_xml_cdr export XML_INT_MODULES=xml_int/mod_xml_rpc xml_int/mod_xml_curl xml_int/mod_xml_cdr

View File

@ -4063,7 +4063,7 @@ SWITCH_STANDARD_API(uuid_dump_function)
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
#define GLOBAL_SETVAR_SYNTAX "<var> <value> [<value2>]" #define GLOBAL_SETVAR_SYNTAX "<var>=<value> [=<value2>]"
SWITCH_STANDARD_API(global_setvar_function) SWITCH_STANDARD_API(global_setvar_function)
{ {
char *mycmd = NULL, *argv[3] = { 0 }; char *mycmd = NULL, *argv[3] = { 0 };

View File

@ -120,6 +120,21 @@ static struct {
int thread_running; int thread_running;
} t38_state_list; } t38_state_list;
static void wake_thread(int force)
{
if (force) {
switch_thread_cond_signal(globals.cond);
return;
}
if (switch_mutex_trylock(globals.cond_mutex) == SWITCH_STATUS_SUCCESS) {
switch_thread_cond_signal(globals.cond);
switch_mutex_unlock(globals.cond_mutex);
}
}
static int add_pvt(pvt_t *pvt) static int add_pvt(pvt_t *pvt)
{ {
int r = 0; int r = 0;
@ -130,7 +145,7 @@ static int add_pvt(pvt_t *pvt)
t38_state_list.head = pvt; t38_state_list.head = pvt;
switch_mutex_unlock(t38_state_list.mutex); switch_mutex_unlock(t38_state_list.mutex);
r = 1; r = 1;
switch_thread_cond_broadcast(globals.cond); wake_thread(0);
} else { } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Error launching thread\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Error launching thread\n");
} }
@ -165,7 +180,7 @@ static int del_pvt(pvt_t *del_pvt)
switch_mutex_unlock(t38_state_list.mutex); switch_mutex_unlock(t38_state_list.mutex);
switch_thread_cond_broadcast(globals.cond); wake_thread(0);
return r; return r;
} }
@ -1335,7 +1350,7 @@ void mod_spandsp_fax_shutdown(void)
switch_status_t tstatus = SWITCH_STATUS_SUCCESS; switch_status_t tstatus = SWITCH_STATUS_SUCCESS;
t38_state_list.thread_running = 0; t38_state_list.thread_running = 0;
switch_thread_cond_broadcast(globals.cond); wake_thread(1);
switch_thread_join(&tstatus, t38_state_list.thread); switch_thread_join(&tstatus, t38_state_list.thread);
memset(&globals, 0, sizeof(globals)); memset(&globals, 0, sizeof(globals));
} }

View File

@ -3166,6 +3166,21 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t
goto done; goto done;
} }
if (!strcasecmp(argv[1], "gwlist")) {
int up = 1;
if (argc > 2) {
if (!strcasecmp(argv[2], "down")) {
up = 0;
}
}
sofia_glue_gateway_list(profile, stream, up);
goto done;
}
stream->write_function(stream, "-ERR Unknown command!\n"); stream->write_function(stream, "-ERR Unknown command!\n");
done: done:
@ -4707,8 +4722,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
switch_console_set_complete("add sofia help"); switch_console_set_complete("add sofia help");
switch_console_set_complete("add sofia status"); switch_console_set_complete("add sofia status");
switch_console_set_complete("add sofia xmlstatus"); switch_console_set_complete("add sofia xmlstatus");
switch_console_set_complete("add sofia loglevel");
switch_console_set_complete("add sofia tracelevel"); switch_console_set_complete("add sofia loglevel ::[all:default:tport:iptsec:nea:nta:nth_client:nth_server:nua:soa:sresolv:stun ::[0:1:2:3:4:5:6:7:8:9");
switch_console_set_complete("add sofia tracelevel ::[console:alert:crit:err:warning:notice:info:debug");
switch_console_set_complete("add sofia profile"); switch_console_set_complete("add sofia profile");
switch_console_set_complete("add sofia profile restart all"); switch_console_set_complete("add sofia profile restart all");
@ -4724,6 +4741,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace on"); switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace on");
switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace off"); switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace off");
switch_console_set_complete("add sofia profile ::sofia::list_profiles gwlist up");
switch_console_set_complete("add sofia profile ::sofia::list_profiles gwlist down");
switch_console_set_complete("add sofia status profile ::sofia::list_profiles"); switch_console_set_complete("add sofia status profile ::sofia::list_profiles");
switch_console_set_complete("add sofia status profile ::sofia::list_profiles reg"); switch_console_set_complete("add sofia status profile ::sofia::list_profiles reg");
switch_console_set_complete("add sofia status gateway ::sofia::list_gateways"); switch_console_set_complete("add sofia status gateway ::sofia::list_gateways");

View File

@ -942,6 +942,7 @@ switch_status_t sofia_glue_tech_set_video_codec(private_object_t *tech_pvt, int
const char *sofia_glue_strip_proto(const char *uri); const char *sofia_glue_strip_proto(const char *uri);
switch_status_t reconfig_sofia(sofia_profile_t *profile); switch_status_t reconfig_sofia(sofia_profile_t *profile);
void sofia_glue_del_gateway(sofia_gateway_t *gp); void sofia_glue_del_gateway(sofia_gateway_t *gp);
void sofia_glue_gateway_list(sofia_profile_t *profile, switch_stream_handle_t *stream, int up);
void sofia_glue_del_every_gateway(sofia_profile_t *profile); void sofia_glue_del_every_gateway(sofia_profile_t *profile);
void sofia_reg_send_reboot(sofia_profile_t *profile, const char *user, const char *host, const char *contact, const char *user_agent, void sofia_reg_send_reboot(sofia_profile_t *profile, const char *user, const char *host, const char *contact, const char *user_agent,
const char *network_ip); const char *network_ip);

View File

@ -4109,7 +4109,8 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
} }
} }
if (tech_pvt && tech_pvt->remote_sdp_str && switch_stristr("m=image", tech_pvt->remote_sdp_str)) {
if (sip->sip_payload && sip->sip_payload->pl_data && switch_stristr("m=image", sip->sip_payload->pl_data)) {
has_t38 = 1; has_t38 = 1;
} }
@ -4164,12 +4165,12 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status
} }
if (status == 200 && sofia_test_flag(tech_pvt, TFLAG_T38_PASSTHRU) && has_t38) { if (status == 200 && sofia_test_flag(tech_pvt, TFLAG_T38_PASSTHRU) && has_t38) {
switch_core_session_receive_message(other_session, msg);
if (switch_rtp_ready(tech_pvt->rtp_session) && switch_rtp_ready(other_tech_pvt->rtp_session)) { if (switch_rtp_ready(tech_pvt->rtp_session) && switch_rtp_ready(other_tech_pvt->rtp_session)) {
switch_rtp_udptl_mode(tech_pvt->rtp_session); switch_rtp_udptl_mode(tech_pvt->rtp_session);
switch_rtp_udptl_mode(other_tech_pvt->rtp_session); switch_rtp_udptl_mode(other_tech_pvt->rtp_session);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Activating T38 Passthru\n"); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "Activating T38 Passthru\n");
} }
switch_core_session_receive_message(other_session, msg);
} else { } else {
switch_core_session_queue_message(other_session, msg); switch_core_session_queue_message(other_session, msg);
} }

View File

@ -4267,6 +4267,28 @@ void sofia_glue_del_every_gateway(sofia_profile_t *profile)
} }
void sofia_glue_gateway_list(sofia_profile_t *profile, switch_stream_handle_t *stream, int up)
{
sofia_gateway_t *gp = NULL;
char *r = (char *) stream->data;
switch_mutex_lock(mod_sofia_globals.hash_mutex);
for (gp = profile->gateways; gp; gp = gp->next) {
int reged = (gp->status == SOFIA_GATEWAY_UP);
if (up ? reged : !reged) {
stream->write_function(stream, "%s ", gp->name);
}
}
if (r) {
end_of(r) = '\0';
}
switch_mutex_unlock(mod_sofia_globals.hash_mutex);
}
void sofia_glue_del_gateway(sofia_gateway_t *gp) void sofia_glue_del_gateway(sofia_gateway_t *gp)
{ {
if (!gp->deleted) { if (!gp->deleted) {

View File

@ -483,9 +483,29 @@ static int comp_callback(void *pArg, int argc, char **argv, char **columnNames)
return -1; return -1;
} }
if (!zstr(target) && *target == ':' && *(target + 1) == ':' && *(target + 2) == '[') {
char *p = target + 3, *list = NULL;
if (p) {
char *argv[100] = { 0 };
char *r_argv[1] = { 0 }, *r_cols[1] = {0};
list = strdup(p);
argc = switch_separate_string(list, ':', argv, (sizeof(argv) / sizeof(argv[0])));
for (i = 0; i < argc; i++) {
if (!cur || !strncmp(argv[i], cur, strlen(cur))) {
r_argv[0] = argv[i];
comp_callback(h, 1, r_argv, r_cols);
}
}
switch_safe_free(list);
}
return 0;
}
if (!zstr(target) && *target == ':' && *(target + 1) == ':') { if (!zstr(target) && *target == ':' && *(target + 1) == ':') {
char *r_argv[1] = { 0 }, *r_cols[1] = { char *r_argv[1] = { 0 }, *r_cols[1] = {0};
0};
switch_console_callback_match_t *matches; switch_console_callback_match_t *matches;
if (switch_console_run_complete_func(target, str, cur, &matches) == SWITCH_STATUS_SUCCESS) { if (switch_console_run_complete_func(target, str, cur, &matches) == SWITCH_STATUS_SUCCESS) {
switch_console_callback_match_node_t *m; switch_console_callback_match_node_t *m;
@ -797,6 +817,7 @@ SWITCH_DECLARE(unsigned char) switch_console_complete(const char *line, const ch
} }
stream.write_function(&stream, " and hostname='%s' order by a%d", switch_core_get_variable("hostname"), h.words + 1); stream.write_function(&stream, " and hostname='%s' order by a%d", switch_core_get_variable("hostname"), h.words + 1);
switch_cache_db_execute_sql_callback(db, stream.data, comp_callback, &h, &errmsg); switch_cache_db_execute_sql_callback(db, stream.data, comp_callback, &h, &errmsg);
if (errmsg) { if (errmsg) {

View File

@ -34,6 +34,7 @@
#include <switch.h> #include <switch.h>
#include "private/switch_core_pvt.h" #include "private/switch_core_pvt.h"
//*#define DEBUG_SQL 1
static struct { static struct {
switch_cache_db_handle_t *event_db; switch_cache_db_handle_t *event_db;
@ -41,7 +42,9 @@ static struct {
switch_memory_pool_t *memory_pool; switch_memory_pool_t *memory_pool;
switch_event_node_t *event_node; switch_event_node_t *event_node;
switch_thread_t *thread; switch_thread_t *thread;
switch_thread_t *db_thread;
int thread_running; int thread_running;
int db_thread_running;
switch_bool_t manage; switch_bool_t manage;
switch_mutex_t *io_mutex; switch_mutex_t *io_mutex;
switch_mutex_t *dbh_mutex; switch_mutex_t *dbh_mutex;
@ -464,6 +467,19 @@ static switch_status_t switch_cache_db_execute_sql_real(switch_cache_db_handle_t
return status; return status;
} }
static void wake_thread(int force)
{
if (force) {
switch_thread_cond_signal(sql_manager.cond);
return;
}
if (switch_mutex_trylock(sql_manager.cond_mutex) == SWITCH_STATUS_SUCCESS) {
switch_thread_cond_signal(sql_manager.cond);
switch_mutex_unlock(sql_manager.cond_mutex);
}
}
/** /**
OMFG you cruel bastards. Who chooses 64k as a max buffer len for a sql statement, have you ever heard of transactions? OMFG you cruel bastards. Who chooses 64k as a max buffer len for a sql statement, have you ever heard of transactions?
**/ **/
@ -846,7 +862,24 @@ SWITCH_DECLARE(switch_bool_t) switch_cache_db_test_reactive(switch_cache_db_hand
} }
static void *SWITCH_THREAD_FUNC switch_core_sql_db_thread(switch_thread_t *thread, void *obj)
{
int sec = 0;
sql_manager.db_thread_running = 1;
while (sql_manager.db_thread_running == 1) {
if (++sec == SQL_CACHE_TIMEOUT) {
sql_close(switch_epoch_time_now(NULL));
wake_thread(1);
sec = 0;
}
switch_yield(1000);
}
return NULL;
}
static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread, void *obj) static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread, void *obj)
{ {
@ -859,16 +892,10 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
char *sql = NULL; char *sql = NULL;
switch_size_t newlen; switch_size_t newlen;
int lc = 0; int lc = 0;
uint32_t loops = 0, sec = 0;
uint32_t l1 = 1000;
uint32_t sanity = 120; uint32_t sanity = 120;
switch_assert(sqlbuf); switch_assert(sqlbuf);
if (!sql_manager.manage) {
l1 = 10;
}
while (!sql_manager.event_db) { while (!sql_manager.event_db) {
if (switch_core_db_handle(&sql_manager.event_db) == SWITCH_STATUS_SUCCESS && sql_manager.event_db) if (switch_core_db_handle(&sql_manager.event_db) == SWITCH_STATUS_SUCCESS && sql_manager.event_db)
break; break;
@ -882,26 +909,12 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
return NULL; return NULL;
} }
sql_manager.thread_running = 1; sql_manager.thread_running = 1;
while (sql_manager.thread_running == 1) { while (sql_manager.thread_running == 1) {
switch_mutex_lock(sql_manager.cond_mutex); switch_mutex_lock(sql_manager.cond_mutex);
if (++loops == l1) {
if (++sec == SQL_CACHE_TIMEOUT) {
sql_close(switch_epoch_time_now(NULL));
sec = 0;
}
loops = 0;
}
if (!sql_manager.manage) {
switch_yield(100000);
continue;
}
if (sql || switch_queue_trypop(sql_manager.sql_queue[0], &pop) == SWITCH_STATUS_SUCCESS || if (sql || switch_queue_trypop(sql_manager.sql_queue[0], &pop) == SWITCH_STATUS_SUCCESS ||
switch_queue_trypop(sql_manager.sql_queue[1], &pop) == SWITCH_STATUS_SUCCESS) { switch_queue_trypop(sql_manager.sql_queue[1], &pop) == SWITCH_STATUS_SUCCESS) {
@ -919,9 +932,11 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
if (new_mlen < runtime.max_sql_buffer_len) { if (new_mlen < runtime.max_sql_buffer_len) {
sql_len = new_mlen; sql_len = new_mlen;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, #ifdef DEBUG_SQL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
"REALLOC %ld %d %d\n", (long int)sql_len, switch_queue_size(sql_manager.sql_queue[0]), "REALLOC %ld %d %d\n", (long int)sql_len, switch_queue_size(sql_manager.sql_queue[0]),
switch_queue_size(sql_manager.sql_queue[1])); switch_queue_size(sql_manager.sql_queue[1]));
#endif
if (!(tmp = realloc(sqlbuf, sql_len))) { if (!(tmp = realloc(sqlbuf, sql_len))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread ending on mem err\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread ending on mem err\n");
abort(); abort();
@ -929,8 +944,10 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
} }
sqlbuf = tmp; sqlbuf = tmp;
} else { } else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, #ifdef DEBUG_SQL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
"SAVE %d %d\n", switch_queue_size(sql_manager.sql_queue[0]), switch_queue_size(sql_manager.sql_queue[1])); "SAVE %d %d\n", switch_queue_size(sql_manager.sql_queue[0]), switch_queue_size(sql_manager.sql_queue[1]));
#endif
goto skip; goto skip;
} }
} }
@ -951,12 +968,16 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
lc = sql ? 1 : 0 + switch_queue_size(sql_manager.sql_queue[0]) + switch_queue_size(sql_manager.sql_queue[1]); lc = sql ? 1 : 0 + switch_queue_size(sql_manager.sql_queue[0]) + switch_queue_size(sql_manager.sql_queue[1]);
if (trans && iterations && (iterations > target || !lc)) { if (trans && iterations && (iterations > target || !lc)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, #ifdef DEBUG_SQL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT,
"RUN %d %d %d\n", switch_queue_size(sql_manager.sql_queue[0]), switch_queue_size(sql_manager.sql_queue[1]), iterations); "RUN %d %d %d\n", switch_queue_size(sql_manager.sql_queue[0]), switch_queue_size(sql_manager.sql_queue[1]), iterations);
#endif
if (switch_cache_db_persistant_execute_trans(sql_manager.event_db, sqlbuf, 1) != SWITCH_STATUS_SUCCESS) { if (switch_cache_db_persistant_execute_trans(sql_manager.event_db, sqlbuf, 1) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread unable to commit transaction, records lost!\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "SQL thread unable to commit transaction, records lost!\n");
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "DONE\n"); #ifdef DEBUG_SQL
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "DONE\n");
#endif
iterations = 0; iterations = 0;
trans = 0; trans = 0;
len = 0; len = 0;
@ -965,6 +986,8 @@ static void *SWITCH_THREAD_FUNC switch_core_sql_thread(switch_thread_t *thread,
switch_yield(400000); switch_yield(400000);
} }
lc = sql ? 1 : 0 + switch_queue_size(sql_manager.sql_queue[0]) + switch_queue_size(sql_manager.sql_queue[1]);
if (!lc) { if (!lc) {
switch_thread_cond_wait(sql_manager.cond, sql_manager.cond_mutex); switch_thread_cond_wait(sql_manager.cond, sql_manager.cond_mutex);
} }
@ -1399,7 +1422,7 @@ static void core_event_handler(switch_event_t *event)
switch_queue_push(sql_manager.sql_queue[0], sql[i]); switch_queue_push(sql_manager.sql_queue[0], sql[i]);
} }
sql[i] = NULL; sql[i] = NULL;
switch_thread_cond_broadcast(sql_manager.cond); wake_thread(1);
} }
} }
} }
@ -1650,7 +1673,10 @@ switch_status_t switch_core_sqldb_start(switch_memory_pool_t *pool, switch_bool_
switch_threadattr_create(&thd_attr, sql_manager.memory_pool); switch_threadattr_create(&thd_attr, sql_manager.memory_pool);
switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE); switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
switch_thread_create(&sql_manager.thread, thd_attr, switch_core_sql_thread, NULL, sql_manager.memory_pool); if (sql_manager.manage) {
switch_thread_create(&sql_manager.thread, thd_attr, switch_core_sql_thread, NULL, sql_manager.memory_pool);
}
switch_thread_create(&sql_manager.db_thread, thd_attr, switch_core_sql_db_thread, NULL, sql_manager.memory_pool);
while (!sql_manager.thread_running) { while (!sql_manager.thread_running) {
switch_yield(10000); switch_yield(10000);
@ -1673,13 +1699,19 @@ void switch_core_sqldb_stop(void)
switch_queue_push(sql_manager.sql_queue[0], NULL); switch_queue_push(sql_manager.sql_queue[0], NULL);
switch_queue_push(sql_manager.sql_queue[1], NULL); switch_queue_push(sql_manager.sql_queue[1], NULL);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Waiting for unfinished SQL transactions\n"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CONSOLE, "Waiting for unfinished SQL transactions\n");
switch_thread_cond_broadcast(sql_manager.cond); wake_thread(1);
} }
sql_manager.thread_running = -1; sql_manager.thread_running = -1;
switch_thread_join(&st, sql_manager.thread); switch_thread_join(&st, sql_manager.thread);
} }
if (sql_manager.thread && sql_manager.db_thread_running) {
sql_manager.db_thread_running = -1;
switch_thread_join(&st, sql_manager.db_thread);
}
switch_cache_db_flush_handles(); switch_cache_db_flush_handles();
sql_close(0); sql_close(0);