From 5151cf32ac9795cf473006ee9d8bb35abb66beb2 Mon Sep 17 00:00:00 2001
From: Mathieu Rene <mrene@avgs.ca>
Date: Wed, 11 Mar 2009 12:39:37 +0000
Subject: [PATCH] FSCORE-327

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@12561 d0543943-73ff-0310-b7d9-9358b9ac24b2
---
 .../mod_spidermonkey/mod_spidermonkey.c         | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
index 64051eefdb..fd0faae14d 100644
--- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
+++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
@@ -1146,8 +1146,21 @@ static switch_status_t js_common_callback(switch_core_session_t *session, void *
 			switch_dtmf_t *dtmf = (switch_dtmf_t *) input;
 			
 			if (dtmf) {
-				if ((Event = new_js_dtmf(dtmf, var_name, cb_state->cx, cb_state->obj))) {
-					argv[argc++] = STRING_TO_JSVAL(JS_NewStringCopyZ(cb_state->cx, "dtmf"));
+				JSString *str = NULL;
+				/* FSCORE-327 - If a javascript garbage collection is in progress, 
+					JS_NewStringCopyZ returns NULL */
+				int try = 100;
+				while (try-- && !str) {
+					if ((str = JS_NewStringCopyZ(cb_state->cx, "dtmf"))) break;
+					switch_yield(10000);
+				}
+				
+				if (!str) {
+					switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Javascript memory allocation failed\n");	
+				}
+				
+				if (str && (Event = new_js_dtmf(dtmf, var_name, cb_state->cx, cb_state->obj))) {
+					argv[argc++] = STRING_TO_JSVAL(str);
 					argv[argc++] = OBJECT_TO_JSVAL(Event);
 				} else {
 					jss->stack_depth--;