From cdadf1836c8bd4074e6407b8e4c5ed3f8b811299 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 7 Jul 2006 00:21:29 +0000
Subject: [PATCH] Mutex-protect the log-output (to the console typically) so
 that foreground and background threads don't step on eachother (as well as
 error reports and status messages).

---
 src/sbbs3/jsexec.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index ce6a8e2221..a6e8abb96a 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -72,6 +72,7 @@ BOOL		terminated=FALSE;
 BOOL		recycled;
 DWORD		log_mask=DEFAULT_LOG_MASK;
 int  		err_level=DEFAULT_ERR_LOG_LVL;
+pthread_mutex_t output_mutex;
 #if defined(__unix__)
 BOOL		daemonize=FALSE;
 #endif
@@ -157,6 +158,10 @@ int lprintf(int level, char *fmt, ...)
 		return(ret);
 	}
 #endif
+
+	/* Mutex-protect stdout/stderr */
+	pthread_mutex_lock(&output_mutex);
+
 	if(level<=err_level) {
 		ret=fprintf(errfp,"%s\n",sbuf);
 		if(errfp!=stderr && confp!=stdout)
@@ -164,6 +169,8 @@ int lprintf(int level, char *fmt, ...)
 	}
 	if(level>err_level || errfp!=stderr)
 		ret=fprintf(confp,"%s\n",sbuf);
+
+	pthread_mutex_unlock(&output_mutex);
     return(ret);
 }
 
@@ -700,7 +707,7 @@ long js_exec(const char *fname, char** args)
 		return(-1);
 	}
 	if((diff=xp_timer()-start) > 0)
-		fprintf(statfp,"%s compiled in %.2Lf seconds\n"
+		lprintf(LOG_INFO,"%s compiled in %.2Lf seconds"
 			,path
 			,diff);
 
@@ -709,14 +716,14 @@ long js_exec(const char *fname, char** args)
 	js_EvalOnExit(js_cx, js_glob, &branch);
 
 	if((diff=xp_timer()-start) > 0)
-		fprintf(statfp,"%s executed in %.2Lf seconds\n"
+		lprintf(LOG_INFO,"%s executed in %.2Lf seconds"
 			,path
 			,diff);
 
 	JS_GetProperty(js_cx, js_glob, "exit_code", &rval);
 
 	if(rval!=JSVAL_VOID && JSVAL_IS_NUMBER(rval)) {
-		fprintf(statfp,"Using JavaScript exit_code: %s\n",JS_GetStringBytes(JS_ValueToString(js_cx,rval)));
+		lprintf(LOG_DEBUG,"Using JavaScript exit_code: %s",JS_GetStringBytes(JS_ValueToString(js_cx,rval)));
 		JS_ValueToInt32(js_cx,rval,&result);
 	}
 
@@ -732,13 +739,13 @@ long js_exec(const char *fname, char** args)
 
 void break_handler(int type)
 {
-	fprintf(statfp,"\n-> Terminated Locally (signal: %d)\n",type);
+	lprintf(LOG_NOTICE,"\n-> Terminated Locally (signal: %d)",type);
 	terminated=TRUE;
 }
 
 void recycle_handler(int type)
 {
-	fprintf(statfp,"\n-> Recycled Locally (signal: %d)\n",type);
+	lprintf(LOG_NOTICE,"\n-> Recycled Locally (signal: %d)",type);
 	recycled=TRUE;
 	branch.terminated=&recycled;
 }
@@ -964,10 +971,12 @@ int main(int argc, char **argv, char** environ)
 	signal(SIGPIPE,SIG_IGN);
 #endif
 
+	output_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 	do {
 
 		if(exec_count++)
-			fprintf(statfp,"\nRe-running: %s\n", module);
+			lprintf(LOG_INFO,"\nRe-running: %s", module);
 
 		recycled=FALSE;
 
-- 
GitLab