Blame SPECS/ksh-20120801-locking.patch

Packit 992a25
diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.locking ksh-20120801/src/cmd/ksh93/include/jobs.h
Packit 992a25
--- ksh-20120801/src/cmd/ksh93/include/jobs.h.locking	2014-06-27 15:51:07.144923719 +0200
Packit 992a25
+++ ksh-20120801/src/cmd/ksh93/include/jobs.h	2014-06-27 15:52:56.463272276 +0200
Packit 992a25
@@ -149,15 +149,18 @@ extern struct jobs job;
Packit 992a25
 #define vmbusy()	0
Packit 992a25
 #endif
Packit 992a25
 
Packit 992a25
-#define job_lock()	(job.in_critical++)
Packit 992a25
+#define asoincint(p)  __sync_fetch_and_add(p,1)
Packit 992a25
+#define asodecint(p)  __sync_fetch_and_sub(p,1)
Packit 992a25
+
Packit 992a25
+#define job_lock()	asoincint(&job.in_critical)
Packit 992a25
 #define job_unlock()	\
Packit 992a25
 	do { \
Packit 992a25
 		int	sig; \
Packit 992a25
-		if (!--job.in_critical && (sig = job.savesig)) \
Packit 992a25
+		if (asodecint(&job.in_critical)==1 && (sig = job.savesig)) \
Packit 992a25
 		{ \
Packit 992a25
-			if (!job.in_critical++ && !vmbusy()) \
Packit 992a25
+			if (!asoincint(&job.in_critical) && !vmbusy()) \
Packit 992a25
 				job_reap(sig); \
Packit 992a25
-			job.in_critical--; \
Packit 992a25
+			asodecint(&job.in_critical); \
Packit 992a25
 		} \
Packit 992a25
 	} while(0)
Packit 992a25