ebf9b31727
- do not resend signal on termination (#1092132) - fix brace expansion on/off - fix incorrect rounding of numsers 0.5 < |x| <1.0 in printf (#1080940) - fix parser errors related to the end of the here-document marker - ksh hangs when command substitution fills out the pipe buffer - using typeset -l with a restricted variabled caused segmentation fault - monitor mode was documented incorrectly - do not crash when unsetting running function from another one (#1105139) - should report an error when trying to cd into directory without execution bit - job locking mechanism did not survive compiler optimization - reading a file via command substitution did not work when any of stdin, stdout or stderr were closed (#1070308) - fix lexical parser crash
27 lines
907 B
Diff
27 lines
907 B
Diff
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)
|
|
|