Skip to content
Snippets Groups Projects
Commit 05cd3f05 authored by rswindell's avatar rswindell
Browse files

Added support for thread-safe JavaScript usage.

parent 0fe85a9c
Branches
Tags
No related merge requests found
...@@ -542,7 +542,13 @@ long sbbs_t::js_execfile(char *fname) ...@@ -542,7 +542,13 @@ long sbbs_t::js_execfile(char *fname)
return(-1); 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); errormsg(WHERE,ERR_EXEC,path,0);
return(-1); return(-1);
} }
......
...@@ -524,43 +524,51 @@ JSContext* js_initcx(JSObject** glob) ...@@ -524,43 +524,51 @@ JSContext* js_initcx(JSObject** glob)
JSObject* js_glob; JSObject* js_glob;
JSObject* sysobj; JSObject* sysobj;
jsval val; jsval val;
BOOL success=FALSE;
if((js_cx = JS_NewContext(js_runtime, JAVASCRIPT_CONTEXT_STACK))==NULL) if((js_cx = JS_NewContext(js_runtime, JAVASCRIPT_CONTEXT_STACK))==NULL)
return(NULL); return(NULL);
JS_BeginRequest(js_cx); /* Required for multi-thread support */
JS_SetErrorReporter(js_cx, js_ErrorReporter); JS_SetErrorReporter(js_cx, js_ErrorReporter);
if((js_glob = JS_NewObject(js_cx, &js_global_class, NULL, NULL))==NULL) { do {
JS_DestroyContext(js_cx);
return(NULL);
}
if (!JS_InitStandardClasses(js_cx, js_glob)) { if((js_glob = JS_NewObject(js_cx, &js_global_class, NULL, NULL))==NULL)
JS_DestroyContext(js_cx); break;
return(NULL);
}
if (!JS_DefineFunctions(js_cx, js_glob, js_global_functions)) { if (!JS_InitStandardClasses(js_cx, js_glob))
JS_DestroyContext(js_cx); break;
return(NULL);
}
if((sysobj=js_CreateSystemObject(&scfg, js_cx, js_glob))==NULL) { if (!JS_DefineFunctions(js_cx, js_glob, js_global_functions))
JS_DestroyContext(js_cx); break;
return(NULL);
}
sprintf(ver,"%s v%s",FTP_SERVER,FTP_VERSION); if((sysobj=js_CreateSystemObject(&scfg, js_cx, js_glob))==NULL)
val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ver)); break;
if(!JS_SetProperty(js_cx, sysobj, "version", &val))
return(FALSE);
val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ftp_ver())); sprintf(ver,"%s v%s",FTP_SERVER,FTP_VERSION);
if(!JS_SetProperty(js_cx, sysobj, "version_detail", &val)) val = STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, ver));
return(FALSE); 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) JS_EndRequest(js_cx); /* Required for multi-thread support */
*glob=js_glob;
if(!success) {
JS_DestroyContext(js_cx);
return(NULL);
}
return(js_cx); return(js_cx);
} }
...@@ -2294,6 +2302,8 @@ static void ctrl_thread(void* arg) ...@@ -2294,6 +2302,8 @@ static void ctrl_thread(void* arg)
} }
#ifdef JAVASCRIPT #ifdef JAVASCRIPT
JS_BeginRequest(js_cx); /* Required for multi-thread support */
if((js_user=js_CreateUserObject(&scfg, js_cx, js_glob, "user", &user))==NULL) { if((js_user=js_CreateUserObject(&scfg, js_cx, js_glob, "user", &user))==NULL) {
lprintf("%04d !JavaScript ERROR creating user object",sock); lprintf("%04d !JavaScript ERROR creating user object",sock);
} }
...@@ -2301,6 +2311,7 @@ static void ctrl_thread(void* arg) ...@@ -2301,6 +2311,7 @@ static void ctrl_thread(void* arg)
,startup->html_index_file)==NULL) { ,startup->html_index_file)==NULL) {
lprintf("%04d !JavaScript ERROR creating file area object",sock); lprintf("%04d !JavaScript ERROR creating file area object",sock);
} }
JS_EndRequest(js_cx); /* Required for multi-thread support */
#endif #endif
if(sysop) if(sysop)
...@@ -3311,6 +3322,8 @@ static void ctrl_thread(void* arg) ...@@ -3311,6 +3322,8 @@ static void ctrl_thread(void* arg)
|| !strnicmp(p,html_index_ext,strlen(html_index_ext))) || !strnicmp(p,html_index_ext,strlen(html_index_ext)))
&& !delecmd) { && !delecmd) {
#ifdef JAVASCRIPT #ifdef JAVASCRIPT
JS_BeginRequest(js_cx); /* Required for multi-thread support */
js_val=STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, "name")); js_val=STRING_TO_JSVAL(JS_NewStringCopyZ(js_cx, "name"));
JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val); JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val);
js_val=BOOLEAN_TO_JSVAL(FALSE); js_val=BOOLEAN_TO_JSVAL(FALSE);
...@@ -3345,6 +3358,7 @@ static void ctrl_thread(void* arg) ...@@ -3345,6 +3358,7 @@ static void ctrl_thread(void* arg)
JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val); JS_SetProperty(js_cx, js_glob, "ftp_sort", &js_val);
} }
} }
JS_EndRequest(js_cx); /* Required for multi-thread support */
#endif #endif
sprintf(fname,"%sftp%d.tx", scfg.data_dir, sock); sprintf(fname,"%sftp%d.tx", scfg.data_dir, sock);
if((fp=fopen(fname,"w+b"))==NULL) { if((fp=fopen(fname,"w+b"))==NULL) {
...@@ -3362,10 +3376,14 @@ static void ctrl_thread(void* arg) ...@@ -3362,10 +3376,14 @@ static void ctrl_thread(void* arg)
tmpfile=TRUE; tmpfile=TRUE;
delfile=TRUE; delfile=TRUE;
#ifdef JAVASCRIPT #ifdef JAVASCRIPT
JS_BeginRequest(js_cx); /* Required for multi-thread support */
js_val=INT_TO_JSVAL(timeleft); js_val=INT_TO_JSVAL(timeleft);
if(!JS_SetProperty(js_cx, js_user, "time_left", &js_val)) if(!JS_SetProperty(js_cx, js_user, "time_left", &js_val))
lprintf("%04d !JavaScript ERROR setting user.time_left",sock); lprintf("%04d !JavaScript ERROR setting user.time_left",sock);
js_generate_index(js_cx, js_glob, sock, fp, lib, dir, &user); js_generate_index(js_cx, js_glob, sock, fp, lib, dir, &user);
JS_EndRequest(js_cx); /* Required for multi-thread support */
#endif #endif
fclose(fp); fclose(fp);
} else if(dir>=0) { } else if(dir>=0) {
...@@ -3800,8 +3818,7 @@ static void ctrl_thread(void* arg) ...@@ -3800,8 +3818,7 @@ static void ctrl_thread(void* arg)
#endif #endif
#ifdef JAVASCRIPT #ifdef JAVASCRIPT
/* Free Context */ JS_DestroyContext(js_cx); /* Free Context */
JS_DestroyContext(js_cx);
#endif #endif
status(STATUS_WFC); status(STATUS_WFC);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment