Red hat fix :
ksh.spec: -- - job locking mechanism did not survive compiler optimization (#1123467) --
ksh-20120801-locking.patch -- diff -up ksh-20120801/src/cmd/ksh93/include/jobs.h.locking ksh-20120801/src/cmd/ksh93/include/jobs.h --- ksh-20120801/src/cmd/ksh93/include/jobs.h.locking 2014-06-27 15:51:07.144923719 +0200 +++ ksh-20120801/src/cmd/ksh93/include/jobs.h 2014-06-27 15:52:56.463272276 +0200 @@ -149,15 +149,18 @@ extern struct jobs job; #define vmbusy() 0 #endif
-#define job_lock() (job.in_critical++) +#define asoincint(p) __sync_fetch_and_add(p,1) +#define asodecint(p) __sync_fetch_and_sub(p,1) + +#define job_lock() asoincint(&job.in_critical) #define job_unlock() \ do { \ int sig; \ - if (!--job.in_critical && (sig = job.savesig)) \ + if (asodecint(&job.in_critical)==1 && (sig = job.savesig)) \ { \ - if (!job.in_critical++ && !vmbusy()) \ + if (!asoincint(&job.in_critical) && !vmbusy()) \ job_reap(sig); \ - job.in_critical--; \ + asodecint(&job.in_critical); \ } \ } while(0) --
Red hat fix :
ksh.spec:
--
- job locking mechanism did not survive compiler optimization (#1123467)
--
ksh-20120801- locking. patch src/cmd/ ksh93/include/ jobs.h. locking ksh-20120801/ src/cmd/ ksh93/include/ jobs.h src/cmd/ ksh93/include/ jobs.h. locking 2014-06-27 15:51:07.144923719 +0200 src/cmd/ ksh93/include/ jobs.h 2014-06-27 15:52:56.463272276 +0200
--
diff -up ksh-20120801/
--- ksh-20120801/
+++ ksh-20120801/
@@ -149,15 +149,18 @@ extern struct jobs job;
#define vmbusy() 0
#endif
-#define job_lock() (job.in_critical++) fetch_and_ add(p,1) fetch_and_ sub(p,1) &job.in_ critical) &job.in_ critical) ==1 && (sig = job.savesig)) \ &job.in_ critical) && !vmbusy()) \ &job.in_ critical) ; \
+#define asoincint(p) __sync_
+#define asodecint(p) __sync_
+
+#define job_lock() asoincint(
#define job_unlock() \
do { \
int sig; \
- if (!--job.in_critical && (sig = job.savesig)) \
+ if (asodecint(
{ \
- if (!job.in_critical++ && !vmbusy()) \
+ if (!asoincint(
job_reap(sig); \
- job.in_critical--; \
+ asodecint(
} \
} while(0)
--