[Freeswitch-svn] [commit] r9573 - in freeswitch/trunk/src: . include mod/event_handlers/mod_cdr_csv mod/xml_int/mod_xml_cdr
Freeswitch SVN
anthm at freeswitch.org
Tue Sep 16 13:12:15 EDT 2008
Author: anthm
Date: Tue Sep 16 13:12:14 2008
New Revision: 9573
Modified:
freeswitch/trunk/src/include/switch_core.h
freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
freeswitch/trunk/src/switch_core.c
Log:
improve shutdown/unload
Modified: freeswitch/trunk/src/include/switch_core.h
==============================================================================
--- freeswitch/trunk/src/include/switch_core.h (original)
+++ freeswitch/trunk/src/include/switch_core.h Tue Sep 16 13:12:14 2008
@@ -350,6 +350,8 @@
*/
SWITCH_DECLARE(int) switch_core_add_state_handler(_In_ const switch_state_handler_table_t *state_handler);
+SWITCH_DECLARE(void) switch_core_remove_state_handler(_In_ const switch_state_handler_table_t *state_handler);
+
/*!
\brief Access a state handler
\param index the desired index to access
Modified: freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c (original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_cdr_csv/mod_cdr_csv.c Tue Sep 16 13:12:14 2008
@@ -60,7 +60,7 @@
SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_csv_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown);
-SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, NULL, NULL);
+SWITCH_MODULE_DEFINITION(mod_cdr_csv, mod_cdr_csv_load, mod_cdr_csv_shutdown, NULL);
static off_t fd_size(int fd)
{
@@ -172,6 +172,10 @@
const char *log_dir = NULL, *accountcode = NULL, *a_template_str = NULL, *g_template_str = NULL;
char *log_line, *path = NULL;
+ if (globals.shutdown) {
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (!((globals.legs & CDR_LEG_A) && (globals.legs & CDR_LEG_B))) {
if ((globals.legs & CDR_LEG_A)) {
if (switch_channel_get_originator_caller_profile(channel)) {
@@ -258,6 +262,10 @@
void *val;
cdr_fd_t *fd;
+ if (globals.shutdown) {
+ return;
+ }
+
if (sig && !strcmp(sig, "HUP")) {
for (hi = switch_hash_first(NULL, globals.fd_hash); hi; hi = switch_hash_next(hi)) {
switch_hash_this(hi, NULL, NULL, &val);
@@ -384,7 +392,11 @@
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_csv_shutdown)
{
- globals.shutdown = 1;
+ globals.shutdown = 1;
+ switch_event_unbind_callback(event_handler);
+ switch_core_remove_state_handler(&state_handlers);
+
+
return SWITCH_STATUS_SUCCESS;
}
Modified: freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c
==============================================================================
--- freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c (original)
+++ freeswitch/trunk/src/mod/xml_int/mod_xml_cdr/mod_xml_cdr.c Tue Sep 16 13:12:14 2008
@@ -78,6 +78,10 @@
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_status_t status = SWITCH_STATUS_FALSE;
+ if (globals.shutdown) {
+ return SWITCH_STATUS_SUCCESS;
+ }
+
if (!globals.log_b && channel && switch_channel_get_originator_caller_profile(channel)) {
return SWITCH_STATUS_SUCCESS;
}
@@ -344,6 +348,8 @@
{
globals.shutdown = 1;
+
+ switch_core_remove_state_handler(&state_handlers);
return SWITCH_STATUS_SUCCESS;
}
Modified: freeswitch/trunk/src/switch_core.c
==============================================================================
--- freeswitch/trunk/src/switch_core.c (original)
+++ freeswitch/trunk/src/switch_core.c Tue Sep 16 13:12:14 2008
@@ -163,15 +163,46 @@
return handle;
}
+SWITCH_DECLARE(void) switch_core_remove_state_handler(const switch_state_handler_table_t *state_handler)
+{
+ int index, total = 0;
+ const switch_state_handler_table_t *tmp[SWITCH_MAX_STATE_HANDLERS+1] = { 0 };
+
+ switch_mutex_lock(runtime.global_mutex);
+
+ for (index = 0; index < runtime.state_handler_index; index++) {
+ const switch_state_handler_table_t *cur = runtime.state_handlers[index];
+ runtime.state_handlers[index] = NULL;
+ if (cur == state_handler) {
+ continue;
+ }
+ tmp[index] = runtime.state_handlers[index];
+ total++;
+ }
+
+ runtime.state_handler_index = 0;
+
+ for (index = 0; index < total; index++) {
+ runtime.state_handlers[runtime.state_handler_index++] = tmp[index];
+ }
+ switch_mutex_unlock(runtime.global_mutex);
+}
+
+
SWITCH_DECLARE(int) switch_core_add_state_handler(const switch_state_handler_table_t *state_handler)
{
- int index = runtime.state_handler_index++;
+ int index;
+
+ switch_mutex_lock(runtime.global_mutex);
+ index = runtime.state_handler_index++;
if (runtime.state_handler_index >= SWITCH_MAX_STATE_HANDLERS) {
- return -1;
+ index = -1;
+ } else {
+ runtime.state_handlers[index] = state_handler;
}
- runtime.state_handlers[index] = state_handler;
+ switch_mutex_unlock(runtime.global_mutex);
return index;
}
More information about the Freeswitch-svn
mailing list