diff --git a/src/sbbs3/sbbs_ini.c b/src/sbbs3/sbbs_ini.c index 7aa9ca16413f182f7ec3f4785d05c2a06b7936d1..8a6bef2067e9da8276696456451eeb936e980984 100644 --- a/src/sbbs3/sbbs_ini.c +++ b/src/sbbs3/sbbs_ini.c @@ -443,6 +443,12 @@ void sbbs_read_ini( =iniReadInteger(fp,section,strJavaScriptMaxBytes ,global->js.max_bytes); web->js_cx_stack =iniReadInteger(fp,section,strJavaScriptContextStack ,global->js.cx_stack); + web->js_branch_limit + =iniReadInteger(fp,section,strJavaScriptBranchLimit ,global->js.branch_limit); + web->js_gc_interval + =iniReadInteger(fp,section,strJavaScriptGcInterval ,global->js.gc_interval); + web->js_yield_interval + =iniReadInteger(fp,section,strJavaScriptYieldInterval ,global->js.yield_interval); SAFECOPY(web->host_name ,iniReadString(fp,section,strHostName,global->host_name,value)); @@ -982,6 +988,21 @@ BOOL sbbs_write_ini( else if(!iniSetInteger(lp,section,strJavaScriptContextStack ,web->js_cx_stack,&style)) break; + if(web->js_branch_limit==global->js.branch_limit) + iniRemoveValue(lp,section,strJavaScriptBranchLimit); + else if(!iniSetInteger(lp,section,strJavaScriptBranchLimit ,web->js_branch_limit,&style)) + break; + + if(web->js_gc_interval==global->js.gc_interval) + iniRemoveValue(lp,section,strJavaScriptGcInterval); + else if(!iniSetInteger(lp,section,strJavaScriptGcInterval ,web->js_gc_interval,&style)) + break; + + if(web->js_yield_interval==global->js.yield_interval) + iniRemoveValue(lp,section,strJavaScriptYieldInterval); + else if(!iniSetInteger(lp,section,strJavaScriptYieldInterval,web->js_yield_interval,&style)) + break; + if(strcmp(web->host_name,global->host_name)==0 || strcmp(bbs->host_name,cfg->sys_inetaddr)==0) iniRemoveKey(lp,section,strHostName); diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index 3fbde907aaa2bd714fd2b7515f16d5fb8071cf81..794ee88c2e5d80d7878af122b352b3b7c1bca3ea 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -212,6 +212,7 @@ typedef struct { JSObject* js_query; JSObject* js_header; JSObject* js_request; + js_branch_t js_branch; /* Client info */ client_t client; @@ -819,7 +820,6 @@ static BOOL send_headers(http_session_t *session, const char *status) struct tm tm; char *headers; char header[MAX_REQUEST_LINE+1]; - char *p; list_node_t *node; lprintf(LOG_DEBUG,"%04d Request resolved to: %s" @@ -1379,7 +1379,6 @@ static void js_add_header(http_session_t * session, char *key, char *value) static BOOL parse_headers(http_session_t * session) { char *head_line; - char next_char; char *value; char *p; int i; @@ -1626,7 +1625,6 @@ static BOOL get_request_headers(http_session_t * session) char head_line[MAX_REQUEST_LINE+1]; char next_char; char *value; - char *p; int i; while(sockreadline(session,head_line,sizeof(head_line)-1)>0) { @@ -2435,6 +2433,17 @@ static JSFunctionSpec js_global_functions[] = { {0} }; +static JSBool +js_BranchCallback(JSContext *cx, JSScript *script) +{ + http_session_t* session; + + if((session=(http_session_t*)JS_GetContextPrivate(cx))==NULL) + return(JS_FALSE); + + return(js_CommonBranchCallback(cx,&session->js_branch)); +} + static JSContext* js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, http_session_t *session) { @@ -2452,6 +2461,8 @@ js_initcx(JSRuntime* runtime, SOCKET sock, JSObject** glob, http_session_t *sess JS_SetErrorReporter(js_cx, js_ErrorReporter); + JS_SetBranchCallback(js_cx, js_BranchCallback); + do { lprintf(LOG_INFO,"%04d JavaScript: Initializing Global object",sock); @@ -2591,7 +2602,7 @@ static BOOL exec_ssjs(http_session_t* session) { /* RUN SCRIPT */ JS_ClearPendingException(session->js_cx); - + session->js_branch.counter=0; if((js_script=JS_CompileFile(session->js_cx, session->js_glob ,session->req.physical_path))==NULL) { @@ -3313,6 +3324,11 @@ void DLLCALL web_server(void* arg) SAFECOPY(session->host_ip,host_ip); session->addr=client_addr; session->socket=client_socket; + session->js_branch.auto_terminate=TRUE; + session->js_branch.terminated=&terminate_server; + session->js_branch.limit=startup->js_branch_limit; + session->js_branch.gc_interval=startup->js_gc_interval; + session->js_branch.yield_interval=startup->js_yield_interval; _beginthread(http_session_thread, 0, session); served++; diff --git a/src/sbbs3/websrvr.h b/src/sbbs3/websrvr.h index d972035169a49c5d9f01edbbc8a785a3f2f74e60..6f571b1919ed76ea8b63a65b20d701822d3c88c6 100644 --- a/src/sbbs3/websrvr.h +++ b/src/sbbs3/websrvr.h @@ -53,6 +53,9 @@ typedef struct { DWORD options; DWORD js_max_bytes; DWORD js_cx_stack; + DWORD js_branch_limit; + DWORD js_yield_interval; + DWORD js_gc_interval; void* cbdata; /* Private data passed to callbacks */