From 9c5d941e37d5777ec6f2571998de84d5a4d768de Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 8 Dec 2008 07:44:32 +0000
Subject: [PATCH] Move towards shared runtimes...

---
 src/sbbs3/js_global.c | 192 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 182 insertions(+), 10 deletions(-)

diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index 5bcbd40b2a..9826ef9775 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -227,6 +227,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	JSBool		success;
 	JSBool		background=JS_FALSE;
 	background_data_t* bg;
+	jsrefcount	rc;
 
 	*rval=JSVAL_VOID;
 
@@ -330,6 +331,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 			,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY);
 	}
 
+	rc=JS_SuspendRequest(cx);
 	errno = 0;
 	if(isfullpath(filename))
 		strcpy(path,filename);
@@ -338,6 +340,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		if(p->cfg->mods_dir[0]==0 || !fexistcase(path))
 			sprintf(path,"%s%s",p->cfg->exec_dir,filename);
 	}
+	JS_ResumeRequest(cx, rc);
 
 	JS_ClearPendingException(exec_cx);
 
@@ -384,14 +387,17 @@ static JSBool
 js_yield(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	BOOL forced=TRUE;
+	jsrefcount	rc;
 
 	if(argc)
 		JS_ValueToBoolean(cx, argv[0], &forced);
+	rc=JS_SuspendRequest(cx);
 	if(forced) {
 		YIELD();
 	} else {
 		MAYBE_YIELD();
 	}
+	JS_ResumeRequest(cx, rc);
 
 	return(JS_TRUE);
 }
@@ -401,10 +407,13 @@ js_mswait(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32 val=1;
 	clock_t start=msclock();
+	jsrefcount	rc;
 
 	if(argc)
 		JS_ValueToInt32(cx,argv[0],&val);
+	rc=JS_SuspendRequest(cx);
 	mswait(val);
+	JS_ResumeRequest(cx, rc);
 
 	JS_NewNumberValue(cx,msclock()-start,rval);
 
@@ -436,13 +445,16 @@ js_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32 freq=500;
 	int32 dur=500;
+	jsrefcount	rc;
 
 	if(argc)
 		JS_ValueToInt32(cx,argv[0],&freq);
 	if(argc>1)
 		JS_ValueToInt32(cx,argv[1],&dur);
 
+	rc=JS_SuspendRequest(cx);
 	sbbs_beep(freq,dur);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -461,6 +473,7 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
 	size_t		len;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -468,7 +481,9 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = INT_TO_JSVAL(crc16(p,len));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -477,6 +492,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
 	size_t		len;
+	uint32_t	cs;
+	jsrefcount	rc;
+	rc=JS_SuspendRequest(cx);
+	JS_ResumeRequest(cx, rc);
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -484,7 +503,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL)
 		return(JS_FALSE);
 
-	JS_NewNumberValue(cx,crc32(p,len),rval);
+	cs=crc32(p,len);
+	rc=JS_SuspendRequest(cx);
+	JS_NewNumberValue(cx,cs,rval);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -494,6 +516,7 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	ulong		sum=0;
 	char*		p;
 	size_t		len;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -501,7 +524,9 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	while(len--) sum+=*(p++);
+	JS_ResumeRequest(cx, rc);
 
 	JS_NewNumberValue(cx,sum,rval);
 	return(JS_TRUE);
@@ -839,6 +864,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	int			old_prefix_bytes=0;
 	int			outbuf_size=0;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -870,6 +896,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		}
 		prefix[0]=0;
 	}
+	rc=JS_SuspendRequest(cx);
 
 	outbuf[0]=0;
 	/* Get prefix from the first line (ouch) */
@@ -1071,6 +1098,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		}
 	}
 
+	JS_ResumeRequest(cx, rc);
 	js_str = JS_NewStringCopyZ(cx, outbuf);
 	free(outbuf);
 	free(linebuf);
@@ -1093,6 +1121,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		linebuf;
 	char*		prefix=" > ";
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -1116,6 +1145,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((linebuf=(char*)alloca(len*2+2))==NULL)	/* (Hopefully) Room for ^A codes.  ToDo */
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	outbuf[0]=0;
 	clen=0;
 	for(i=l=0;inbuf[i];i++) {
@@ -1139,6 +1169,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	}
 	if(l)	/* remainder */
 		strncat(outbuf,linebuf,l);
+	JS_ResumeRequest(cx, rc);
 
 	js_str = JS_NewStringCopyZ(cx, outbuf);
 	free(outbuf);
@@ -1409,6 +1440,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	ulong		clear_screen=0;
 	JSObject*	stateobj=NULL;
 	jsval		val;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -1472,6 +1504,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	if((tmpbuf=(char*)malloc((strlen(inbuf)*10)+1))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	for(i=j=0;inbuf[i];i++) {
 		switch(inbuf[i]) {
 			case TAB:
@@ -1549,6 +1582,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 		if((outbuf=(uchar*)malloc(obsize))==NULL)
 		{
 			free(tmpbuf);
+			rc=JS_SuspendRequest(cx);
 			return(JS_FALSE);
 		}
 		j=sprintf(outbuf,"<span style=\"%s\">",htmlansi[7]);
@@ -1561,6 +1595,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 				{
 					free(tmpbuf);
 					free(outbuf);
+					rc=JS_SuspendRequest(cx);
 					return(JS_FALSE);
 				}
 				outbuf=param;
@@ -2014,12 +2049,15 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 			}
 		}
 		strcpy(outbuf+j,"</span>");
+		rc=JS_SuspendRequest(cx);
 
 		js_str = JS_NewStringCopyZ(cx, outbuf);
 		free(outbuf);
 	}
-	else
+	else {
+		rc=JS_SuspendRequest(cx);
 		js_str = JS_NewStringCopyZ(cx, tmpbuf);
+	}
 
 	free(tmpbuf);	/* assertion here, Feb-20-2006 */
 	if(js_str==NULL)
@@ -2064,6 +2102,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	char		token[16];
 	size_t		t;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2074,6 +2113,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	if((outbuf=(char*)malloc(strlen(inbuf)+1))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	for(i=j=0;inbuf[i];i++) {
 		if(inbuf[i]!='&') {
 			outbuf[j++]=inbuf[i];
@@ -2143,6 +2183,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 		
 	}
 	outbuf[j]=0;
+	JS_ResumeRequest(cx, rc);
 
 	js_str = JS_NewStringCopyZ(cx, outbuf);
 	free(outbuf);
@@ -2162,6 +2203,7 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	uchar*		inbuf;
 	uchar*		outbuf;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -2176,7 +2218,9 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((outbuf=(char*)malloc(len))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	res=b64_encode(outbuf,len,inbuf,inbuf_len);
+	JS_ResumeRequest(cx, rc);
 
 	if(res<1) {
 		free(outbuf);
@@ -2200,6 +2244,7 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	uchar*		inbuf;
 	uchar*		outbuf;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -2214,7 +2259,9 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((outbuf=(char*)malloc(len))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	res=b64_decode(outbuf,len,inbuf,strlen(inbuf));
+	JS_ResumeRequest(cx, rc);
 
 	if(res<1) {
 		free(outbuf);
@@ -2239,6 +2286,7 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
 	char*		inbuf;
 	char		outbuf[64];
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -2251,12 +2299,14 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
 	if(argc>1 && JSVAL_IS_BOOLEAN(argv[1]))
 		hex=JSVAL_TO_BOOLEAN(argv[1]);
 
+	rc=JS_SuspendRequest(cx);
 	MD5_calc(digest,inbuf,inbuf_len);
 
 	if(hex)
 		MD5_hex(outbuf,digest);
 	else
 		b64_encode(outbuf,sizeof(outbuf),digest,sizeof(digest));
+	JS_ResumeRequest(cx, rc);
 
 	js_str = JS_NewStringCopyZ(cx, outbuf);
 	if(js_str==NULL)
@@ -2373,6 +2423,7 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char		path[MAX_PATH+1];
 	char*		str;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2381,7 +2432,9 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	SAFECOPY(path,str);
+	rc=JS_SuspendRequest(cx);
 	_fullpath(path, str, sizeof(path));
+	JS_ResumeRequest(cx, rc);
 
 	if((js_str = JS_NewStringCopyZ(cx, path))==NULL)
 		return(JS_FALSE);
@@ -2441,6 +2494,8 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		str;
 	char		path[MAX_PATH+1];
 	JSString*	js_str;
+	jsrefcount	rc;
+	rc=JS_SuspendRequest(cx);
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2449,13 +2504,17 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		return(JS_FALSE);
 
 	SAFECOPY(path,str);
+	rc=JS_SuspendRequest(cx);
 	if(fexistcase(path)) {
+		JS_ResumeRequest(cx, rc);
 		js_str = JS_NewStringCopyZ(cx, path);
 		if(js_str==NULL)
 			return(JS_FALSE);
 
 		*rval = STRING_TO_JSVAL(js_str);
 	}
+	else
+		JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2465,6 +2524,7 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		str;
 	char		path[MAX_PATH+1];
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2474,13 +2534,17 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((str=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	if(GetShortPathName(str,path,sizeof(path))) {
+		JS_ResumeRequest(cx, rc);
 		js_str = JS_NewStringCopyZ(cx, path);
 		if(js_str==NULL)
 			return(JS_FALSE);
 
 		*rval = STRING_TO_JSVAL(js_str);
 	}
+	else
+		JS_ResumeRequest(cx, rc);
 
 #else	/* No non-Windows equivalent */
 
@@ -2497,6 +2561,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		path;
 	char*		fname;
 	char		result[MAX_PATH+1];
+	char*		cstr;
+	jsrefcount	rc;
+	rc=JS_SuspendRequest(cx);
+	JS_ResumeRequest(cx, rc);
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2507,7 +2575,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((fname=js_ValueToStringBytes(cx, argv[1], NULL))==NULL) 
 		return(JS_FALSE);
 
-	*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,iniFileName(result,sizeof(result),path,fname)));
+	rc=JS_SuspendRequest(cx);
+	cstr = iniFileName(result,sizeof(result),path,fname);
+	JS_ResumeRequest(cx, rc);
+	*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,cstr));
 
 	return(JS_TRUE);
 }
@@ -2516,6 +2587,7 @@ static JSBool
 js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2523,7 +2595,9 @@ js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(fexist(p));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2531,6 +2605,7 @@ static JSBool
 js_removecase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2538,7 +2613,9 @@ js_removecase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(removecase(p)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2546,6 +2623,7 @@ static JSBool
 js_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2553,7 +2631,9 @@ js_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(remove(p)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2562,6 +2642,7 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		oldname;
 	char*		newname;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2572,7 +2653,9 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((newname=js_ValueToStringBytes(cx, argv[1], NULL))==NULL)
 		return(JS_TRUE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(rename(oldname,newname)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2581,6 +2664,7 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		src;
 	char*		dest;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2591,7 +2675,9 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((dest=js_ValueToStringBytes(cx, argv[1], NULL))==NULL)
 		return(JS_TRUE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(fcopy(src,dest));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2600,6 +2686,7 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		fn1;
 	char*		fn2;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2610,7 +2697,9 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((fn2=js_ValueToStringBytes(cx, argv[1], NULL))==NULL)
 		return(JS_TRUE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(fcompare(fn1,fn2));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2620,6 +2709,7 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		fname;
 	int32		level=5;
 	BOOL		ren=FALSE;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2633,7 +2723,9 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argc>2)
 		JS_ValueToBoolean(cx,argv[2],&ren);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(backup(fname,level,ren));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2641,6 +2733,7 @@ static JSBool
 js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2648,7 +2741,9 @@ js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(isdir(p));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2656,6 +2751,8 @@ static JSBool
 js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
+	int			attr;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2663,7 +2760,10 @@ js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
-	JS_NewNumberValue(cx,getfattr(p),rval);
+	rc=JS_SuspendRequest(cx);
+	attr=getfattr(p);
+	JS_ResumeRequest(cx, rc);
+	JS_NewNumberValue(cx,attr,rval);
 	return(JS_TRUE);
 }
 
@@ -2671,6 +2771,8 @@ static JSBool
 js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	time_t		fd;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2678,7 +2780,10 @@ js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
-	JS_NewNumberValue(cx,fdate(p),rval);
+	rc=JS_SuspendRequest(cx);
+	fd=fdate(p);
+	JS_ResumeRequest(cx, rc);
+	JS_NewNumberValue(cx,fd,rval);
 	return(JS_TRUE);
 }
 
@@ -2689,6 +2794,7 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	int32			actime;
 	int32			modtime;
 	struct utimbuf	ut;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2709,7 +2815,9 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 		ut.modtime=modtime;
 	}
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(utime(fname,&ut)==0);
+	JS_ResumeRequest(cx, rc);
 
 	return(JS_TRUE);
 }
@@ -2719,6 +2827,8 @@ static JSBool
 js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	long		fl;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2726,7 +2836,10 @@ js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
-	JS_NewNumberValue(cx,flength(p),rval);
+	rc=JS_SuspendRequest(cx);
+	fl=flength(p);
+	JS_ResumeRequest(cx, rc);
+	JS_NewNumberValue(cx,fl,rval);
 	return(JS_TRUE);
 }
 
@@ -2735,6 +2848,7 @@ static JSBool
 js_ftouch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		fname;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2742,7 +2856,9 @@ js_ftouch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((fname=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(ftouch(fname));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -2753,6 +2869,7 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		text=NULL;
 	int32		max_age=0;
 	uintN		argn=0;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2764,7 +2881,9 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argc > argn && JSVAL_IS_NUMBER(argv[argn]))
 		JS_ValueToInt32(cx, argv[argn++], &max_age);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(fmutex(fname,text,max_age));
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 		
@@ -2772,6 +2891,7 @@ static JSBool
 js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(!argc) {	/* Stop playing sound */
 #ifdef _WIN32
@@ -2787,11 +2907,13 @@ js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 #ifdef _WIN32
 	*rval = BOOLEAN_TO_JSVAL(PlaySound(p, NULL, SND_ASYNC|SND_FILENAME));
 #else
 	*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
 #endif
+	JS_ResumeRequest(cx, rc);
 
 	return(JS_TRUE);
 }
@@ -2807,6 +2929,7 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	JSString*	js_str;
     jsint       len=0;
 	jsval		val;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2822,7 +2945,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
     if((array = JS_NewArrayObject(cx, 0, NULL))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	glob(p,flags,NULL,&g);
+	JS_ResumeRequest(cx, rc);
 	for(i=0;i<(int)g.gl_pathc;i++) {
 		if((js_str=JS_NewStringCopyZ(cx,g.gl_pathv[i]))==NULL)
 			break;
@@ -2830,7 +2955,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
         if(!JS_SetElement(cx, array, len++, &val))
 			break;
 	}
+	rc=JS_SuspendRequest(cx);
 	globfree(&g);
+	JS_ResumeRequest(cx, rc);
 
     *rval = OBJECT_TO_JSVAL(array);
 
@@ -2845,6 +2972,7 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	char*		fname;
 	char*		spec="*";
 	uintN		argn=0;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_BOOLEAN(argv[argn]))
 		JS_ValueToBoolean(cx, argv[argn++], &case_sensitive);
@@ -2859,10 +2987,12 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argn<argc && argv[argn]!=JSVAL_VOID)
 		JS_ValueToBoolean(cx, argv[argn++], &path);
 	
+	rc=JS_SuspendRequest(cx);
 	if(case_sensitive)
 		*rval = BOOLEAN_TO_JSVAL(wildmatch(fname, spec, path));
 	else
 		*rval = BOOLEAN_TO_JSVAL(wildmatchi(fname, spec, path));
+	JS_ResumeRequest(cx, rc);
 
 	return(JS_TRUE);
 }
@@ -2873,6 +3003,8 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 {
 	int32		unit=0;
 	char*		p;
+	ulong		fd;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2883,7 +3015,10 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 	if(argc>1)
 		JS_ValueToInt32(cx,argv[1],&unit);
 
-	JS_NewNumberValue(cx,getfreediskspace(p,unit),rval);
+	rc=JS_SuspendRequest(cx);
+	fd=getfreediskspace(p,unit);
+	JS_ResumeRequest(cx, rc);
+	JS_NewNumberValue(cx,fd,rval);
 
     return(JS_TRUE);
 }
@@ -2893,6 +3028,8 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		unit=0;
 	char*		p;
+	ulong		ds;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2903,7 +3040,10 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argc>1)
 		JS_ValueToInt32(cx,argv[1],&unit);
 
-	JS_NewNumberValue(cx,getdisksize(p,unit),rval);
+	rc=JS_SuspendRequest(cx);
+	ds=getdisksize(p,unit);
+	JS_ResumeRequest(cx, rc);
+	JS_NewNumberValue(cx,ds,rval);
 
     return(JS_TRUE);
 }
@@ -2927,6 +3067,7 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 	SOCKET*		index;
 	jsval		val;
 	int			len=0;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -2970,18 +3111,24 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
 		}
     }
 
+	rc=JS_SuspendRequest(cx);
 	if(select(maxsock+1,rd_set,wr_set,NULL,&tv) >= 0) {
 
 		for(i=0;i<limit;i++) {
 			if(index[i]!=INVALID_SOCKET && FD_ISSET(index[i],&socket_set)) {
 				val=INT_TO_JSVAL(i);
-   				if(!JS_SetElement(cx, rarray, len++, &val))
+				JS_ResumeRequest(cx, rc);
+   				if(!JS_SetElement(cx, rarray, len++, &val)) {
+					rc=JS_SuspendRequest(cx);
 					break;
+				}
+				rc=JS_SuspendRequest(cx);
 			}
 		}
 
 		*rval = OBJECT_TO_JSVAL(rarray);
 	}
+	JS_ResumeRequest(cx, rc);
 
     return(JS_TRUE);
 }
@@ -2990,6 +3137,7 @@ static JSBool
 js_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -2997,7 +3145,9 @@ js_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(MKDIR(p)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -3005,6 +3155,7 @@ static JSBool
 js_mkpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -3012,7 +3163,9 @@ js_mkpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(mkpath(p)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -3020,6 +3173,7 @@ static JSBool
 js_rmdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	char*		p;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -3027,7 +3181,9 @@ js_rmdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	*rval = BOOLEAN_TO_JSVAL(rmdir(p)==0);
+	JS_ResumeRequest(cx, rc);
 	return(JS_TRUE);
 }
 
@@ -3041,6 +3197,7 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	time_t		t;
 	struct tm	tm;
 	JSString*	js_str;
+	jsrefcount	rc;
 
 	if(JSVAL_IS_VOID(argv[0]))
 		return(JS_TRUE);
@@ -3051,11 +3208,13 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if(argc>1)
 		JS_ValueToInt32(cx,argv[1],&i);
 
+	rc=JS_SuspendRequest(cx);
 	strcpy(str,"-Invalid time-");
 	t=i;
 	if(localtime_r(&t,&tm)==NULL)
 		memset(&tm,0,sizeof(tm));
 	strftime(str,sizeof(str),fmt,&tm);
+	JS_ResumeRequest(cx, rc);
 
 	if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
 		return(JS_FALSE);
@@ -3070,6 +3229,7 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	struct in_addr addr;
 	JSString*	str;
 	char*		p;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -3079,8 +3239,10 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	if((addr.s_addr=resolve_ip(p))==INADDR_NONE)
 		return(JS_TRUE);
+	JS_ResumeRequest(cx, rc);
 	
 	if((str=JS_NewStringCopyZ(cx, inet_ntoa(addr)))==NULL)
 		return(JS_FALSE);
@@ -3096,6 +3258,7 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	struct in_addr addr;
 	HOSTENT*	h;
 	char*		p;
+	jsrefcount	rc;
 
 	*rval = JSVAL_NULL;
 
@@ -3105,8 +3268,10 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 	if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) 
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	addr.s_addr=inet_addr(p);
 	h=gethostbyaddr((char *)&addr,sizeof(addr),AF_INET);
+	JS_ResumeRequest(cx, rc);
 
 	if(h!=NULL && h->h_name!=NULL)
 		*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,h->h_name));
@@ -3125,17 +3290,24 @@ js_list_named_queues(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsva
 	jsval		val;
 	list_node_t* node;
 	msg_queue_t* q;
+	jsrefcount	rc;
 
     if((array = JS_NewArrayObject(cx, 0, NULL))==NULL)
 		return(JS_FALSE);
 
+	rc=JS_SuspendRequest(cx);
 	for(node=listFirstNode(&named_queues);node!=NULL;node=listNextNode(node)) {
 		if((q=listNodeData(node))==NULL)
 			continue;
+		JS_ResumeRequest(cx, rc);
 		val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,q->name));
-        if(!JS_SetElement(cx, array, len++, &val))
+        if(!JS_SetElement(cx, array, len++, &val)) {
+			rc=JS_SuspendRequest(cx);
 			break;
+		}
+		rc=JS_SuspendRequest(cx);
 	}
+	JS_ResumeRequest(cx, rc);
 
     *rval = OBJECT_TO_JSVAL(array);
 
-- 
GitLab