[Freeswitch-svn] [commit] r5024 - freeswitch/trunk/src/mod/languages/mod_spidermonkey
Author: mikej Date: Thu Apr 26 19:09:26 2007 New Revision: 5024 Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h Log: address http://jira.freeswitch.org/browse/FSCORE-6 We still need to test what the right number is for stack depth is for different platforms. We can get 13 out of msvc on my box (set the level to 12) but this is probably platform dependent and stack size dependent. How can we compute this? Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c (original) +++ freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c Thu Apr 26 19:09:26 2007 @@ -623,6 +623,7 @@ return Event; } +#define MAX_STACK_DEPTH 12 static switch_status_t js_common_callback(switch_core_session_t *session, void *input, switch_input_type_t itype, void *buf, unsigned int buflen) { @@ -639,6 +640,8 @@ return SWITCH_STATUS_FALSE; } + jss->stack_depth++; + switch (itype) { case SWITCH_INPUT_TYPE_EVENT: if ((event = (switch_event_t *) input)) { @@ -648,6 +651,7 @@ } } if (!Event) { + jss->stack_depth--; return SWITCH_STATUS_FALSE; } break; @@ -662,10 +666,17 @@ argv[argc++] = cb_state->arg; } + if (jss->stack_depth > MAX_STACK_DEPTH) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Maximum recursive callback limit %d reached.\n", MAX_STACK_DEPTH); + jss->stack_depth--; + return SWITCH_STATUS_FALSE; + } + JS_ResumeRequest(cb_state->cx, cb_state->saveDepth); JS_CallFunction(cb_state->cx, cb_state->obj, cb_state->function, argc, argv, &cb_state->ret); cb_state->saveDepth = JS_SuspendRequest(cb_state->cx); + jss->stack_depth--; return SWITCH_STATUS_SUCCESS; } @@ -2037,6 +2048,7 @@ jss->flags = flags; jss->cx = cx; jss->obj = session_obj; + 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))) { return session_obj; Modified: freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h ============================================================================== --- freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h (original) +++ freeswitch/trunk/src/mod/languages/mod_spidermonkey/mod_spidermonkey.h Thu Apr 26 19:09:26 2007 @@ -129,6 +129,7 @@ unsigned int flags; switch_call_cause_t cause; JSFunction *on_hangup; + int stack_depth; switch_channel_state_t hook_state; };
participants (1)
-
Freeswitch SVN