From 9b98c2d512d380ba79dff53ba898fed6aeb95388 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 20 Nov 2008 02:27:59 +0000 Subject: [PATCH] cleaning up stupid mess (lesson in regressions for Math`) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10472 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_core.h | 16 +++++++++++ .../mod_spidermonkey/mod_spidermonkey.c | 5 ++-- src/switch_core_rwlock.c | 28 +++++++++++++++++++ src/switch_core_state_machine.c | 3 +- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index 7f9efc6d9b..7670435c30 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -320,6 +320,22 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock(_In_ switch_core_s #endif +#ifdef SWITCH_DEBUG_RWLOCKS +SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock_hangup(_In_ switch_core_session_t *session, const char *file, const char *func, int line); +#endif + +/*! + \brief Acquire a read lock on the session + \param session the session to acquire from + \return success if it is safe to read from the session +*/ +#ifdef SWITCH_DEBUG_RWLOCKS +#define switch_core_session_read_lock(session) switch_core_session_perform_read_lock_hangup(session, __FILE__, __SWITCH_FUNC__, __LINE__) +#else +SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock_hangup(_In_ switch_core_session_t *session); +#endif + + #ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(void) switch_core_session_perform_write_lock(_In_ switch_core_session_t *session, const char *file, const char *func, int line); #endif diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index 93dcf10e46..2c0155b3f1 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -2727,7 +2727,7 @@ static JSObject *new_js_session(JSContext * cx, JSObject * obj, switch_core_sess (*jss)->stack_depth = 0; if ((JS_SetPrivate(cx, session_obj, *jss) && JS_DefineProperties(cx, session_obj, session_props) && JS_DefineFunctions(cx, session_obj, session_methods))) { - if (switch_core_session_read_lock(session) != SWITCH_STATUS_SUCCESS) { + if (switch_core_session_read_lock_hangup(session) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Read Lock Failure.\n"); free(*jss); return NULL; @@ -3508,8 +3508,9 @@ static void js_parse_and_execute(switch_core_session_t *session, const char *inp /* Emaculent conception of session object into the script if one is available */ if (!(session && new_js_session(cx, javascript_global_object, session, &jss, "session", flags))) { - switch_snprintf(buf, sizeof(buf), "~var session = false;"); + switch_snprintf(buf, sizeof(buf), "~var session = new Object();"); eval_some_js(buf, cx, javascript_global_object, &rval); + return; } if (ro) { new_request(cx, javascript_global_object, ro); diff --git a/src/switch_core_rwlock.c b/src/switch_core_rwlock.c index a7cb9d77fe..93841e932e 100644 --- a/src/switch_core_rwlock.c +++ b/src/switch_core_rwlock.c @@ -63,6 +63,34 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock(switch_core_sessio return status; } + +#ifdef SWITCH_DEBUG_RWLOCKS +SWITCH_DECLARE(switch_status_t) switch_core_session_perform_read_lock_hangup(switch_core_session_t *session, const char *file, const char *func, int line) +#else +SWITCH_DECLARE(switch_status_t) switch_core_session_read_lock_hangup(switch_core_session_t *session) +#endif +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + if (session->rwlock) { + if (switch_test_flag(session, SSF_DESTROYED) || switch_channel_get_state(session->channel) >= CS_DONE) { + status = SWITCH_STATUS_FALSE; +#ifdef SWITCH_DEBUG_RWLOCKS + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock FAIL\n", + switch_channel_get_name(session->channel)); +#endif + } else { + status = (switch_status_t) switch_thread_rwlock_tryrdlock(session->rwlock); +#ifdef SWITCH_DEBUG_RWLOCKS + switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, NULL, SWITCH_LOG_ERROR, "%s Read lock ACQUIRED\n", + switch_channel_get_name(session->channel)); +#endif + } + } + + return status; +} + #ifdef SWITCH_DEBUG_RWLOCKS SWITCH_DECLARE(void) switch_core_session_perform_write_lock(switch_core_session_t *session, const char *file, const char *func, int line) { diff --git a/src/switch_core_state_machine.c b/src/switch_core_state_machine.c index a864a3bf62..109d93bc0c 100644 --- a/src/switch_core_state_machine.c +++ b/src/switch_core_state_machine.c @@ -421,9 +421,10 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session) switch_channel_get_variables(session->channel, &stream.param_event); expanded = switch_channel_expand_variables(session->channel, arg); - switch_api_execute(cmd, expanded, use_session, &stream); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Hangup Command %s(%s):\n%s\n", cmd, expanded, switch_str_nil((char *) stream.data)); + switch_api_execute(cmd, expanded, use_session, &stream); if (expanded != arg) { switch_safe_free(expanded); }