From 05cd3f05cf0d59317ec90cc7d1298ad4f6bc8b82 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Mon, 23 Apr 2001 01:18:04 +0000
Subject: [PATCH] Added support for thread-safe JavaScript usage.

---
 src/sbbs3/exec.cpp  |  8 ++++-
 src/sbbs3/ftpsrvr.c | 71 ++++++++++++++++++++++++++++-----------------
 2 files changed, 51 insertions(+), 28 deletions(-)

diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp
index 7a88346542..c03186f554 100644
--- a/src/sbbs3/exec.cpp
+++ b/src/sbbs3/exec.cpp
@@ -542,7 +542,13 @@ long sbbs_t::js_execfile(char *fname)
 		return(-1); 
 	}
 
-	if((js_script=JS_CompileFile(js_cx, js_glob, path))==NULL) {
+	JS_BeginRequest(js_cx);	/* Required for multi-thread support */
+
+	js_script=JS_CompileFile(js_cx, js_glob, path);
+
+	JS_EndRequest(js_cx);	/* Required for multi-thread support */
+
+	if(js_script==NULL) {
 		errormsg(WHERE,ERR_EXEC,path,0);
 		return(-1);
 	}
diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index e5db765fe3..ffc36df2f1 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -524,43 +524,51 @@ JSContext* js_initcx(JSObject** glob)
 	JSObject*	js_glob;
 	JSObject*	sysobj;
 	jsval		val;
+	BOOL		success=FALSE;
 
     if((js_cx = JS_NewContext(js_runtime, JAVASCRIPT_CONTEXT_STACK))==NULL)
 		return(NULL);
 
+	JS_BeginRequest(js_cx);	/* Required for multi-thread support */
+
     JS_SetErrorReporter(js_cx, js_ErrorReporter);
 
-    if((js_glob = JS_NewObject(js_cx, &js_global_class, NULL, NULL))==NULL) {
-		JS_DestroyContext(js_cx);
-		return(NULL);
-	}
+	do {
 
-    if (!JS_InitStandardClasses(js_cx, js_glob)) {
-		JS_DestroyContext(js_cx);
-		return(NULL);
-	}
+		if((js_glob = JS_NewObject(js_cx, &js_global_class, NULL, NULL))==NULL) 
+			break;
 
-    if (!JS_DefineFunctions(js_cx, js_glob, js_global_functions)) {
-		JS_DestroyContext(js_cx);
-		return(NULL);
-	}
+		if (!JS_InitStandardClasses(js_cx, js_glob)) 
+			break;
 
-	if((sysobj=js_CreateSystemObject(&scfg, js_cx, js_glob))==NULL) {
-		JS_DestroyContext(js_cx);
-		return(NULL);
-	}
+		if (!JS_DefineFunctions(js_cx, js_glob, js_global_functions)) 
+			break;
 
-	sprintf(ver,"%s v%s",FTP_SERVER,FTP_VERSION);
-	val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ver));
-	if(!JS_SetProperty(js_cx, sysobj, "version", &val))
-		return(FALSE);
+		if((sysobj=js_CreateSystemObject(&scfg, js_cx, js_glob))==NULL) 
+			break;
 
-	val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ftp_ver()));
-	if(!JS_SetProperty(js_cx, sysobj, "version_detail", &val))
-		return(FALSE);
+		sprintf(ver,"%s v%s",FTP_SERVER,FTP_VERSION);
+		val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ver));
+		if(!JS_SetProperty(js_cx, sysobj, "version", &val))
+			break;
+
+		val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ftp_ver()));
+		if(!JS_SetProperty(js_cx, sysobj, "version_detail", &val))
+			break;
+
+		if(glob!=NULL)
+			*glob=js_glob;
+
+		success=TRUE;
+
+	} while(0);
 
-	if(glob!=NULL)
-		*glob=js_glob;
+	JS_EndRequest(js_cx);		/* Required for multi-thread support */
+
+	if(!success) {
+		JS_DestroyContext(js_cx);
+		return(NULL);
+	}
 
 	return(js_cx);
 }
@@ -2294,6 +2302,8 @@ static void ctrl_thread(void* arg)
 			}
 
 #ifdef JAVASCRIPT
+			JS_BeginRequest(js_cx);	/* Required for multi-thread support */
+
 			if((js_user=js_CreateUserObject(&scfg, js_cx, js_glob, "user", &user))==NULL) {
 				lprintf("%04d !JavaScript ERROR creating user object",sock);
 			}
@@ -2301,6 +2311,7 @@ static void ctrl_thread(void* arg)
 				,startup->html_index_file)==NULL) {
 				lprintf("%04d !JavaScript ERROR creating file area object",sock);
 			}
+			JS_EndRequest(js_cx);	/* Required for multi-thread support */
 #endif
 
 			if(sysop)
@@ -3311,6 +3322,8 @@ static void ctrl_thread(void* arg)
 				|| !strnicmp(p,html_index_ext,strlen(html_index_ext)))
 				&& !delecmd) {
 #ifdef JAVASCRIPT
+				JS_BeginRequest(js_cx);	/* Required for multi-thread support */
+
 				js_val=STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, "name"));
 				JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val);
 				js_val=BOOLEAN_TO_JSVAL(FALSE);
@@ -3345,6 +3358,7 @@ static void ctrl_thread(void* arg)
 						JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val);
 					}
 				}
+				JS_EndRequest(js_cx);	/* Required for multi-thread support */
 #endif
 				sprintf(fname,"%sftp%d.tx", scfg.data_dir, sock);
 				if((fp=fopen(fname,"w+b"))==NULL) {
@@ -3362,10 +3376,14 @@ static void ctrl_thread(void* arg)
 				tmpfile=TRUE;
 				delfile=TRUE;
 #ifdef JAVASCRIPT
+				JS_BeginRequest(js_cx);	/* Required for multi-thread support */
+
 				js_val=INT_TO_JSVAL(timeleft);
 				if(!JS_SetProperty(js_cx, js_user, "time_left", &js_val))
 					lprintf("%04d !JavaScript ERROR setting user.time_left",sock);
 				js_generate_index(js_cx, js_glob, sock, fp, lib, dir, &user);
+
+				JS_EndRequest(js_cx);	/* Required for multi-thread support */
 #endif
 				fclose(fp);
 			} else if(dir>=0) {
@@ -3800,8 +3818,7 @@ static void ctrl_thread(void* arg)
 #endif
 
 #ifdef JAVASCRIPT
-	/* Free Context */
-	JS_DestroyContext(js_cx);
+	JS_DestroyContext(js_cx);	/* Free Context */
 #endif
 
 	status(STATUS_WFC);
-- 
GitLab