diff --git a/src/sbbs3/exec.cpp b/src/sbbs3/exec.cpp index 7a8834654257dea832d2e0d3bc500856625ffa09..c03186f5540614fb78c129b02101c9a0c4516376 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 e5db765fe33ec5360411ea19aa03e2c6d6b3b58f..ffc36df2f1d0a32f2c31691d1bba17ac466e3f4d 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);