From 52067c3d3791d1a5442bf3d1e9ba9471ff30cf1e Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Tue, 2 Feb 2021 17:25:21 +0000 Subject: [PATCH] Backport atomic job locking from ksh 93v- beta Something similar was previously done in 07cc71b8 from a Debian patch, and eventually reverted; it redefined the ast atomic functions asoincint() and asodecint() to be gcc-specific. This imports the upstream version from the ksh 93v- beta instead. This commit is based on an OpenSUSE patch: https://build.opensuse.org/package/view_file/shells/ksh/ksh93-joblock.dif src/cmd/ksh93/include/jobs.h: - Replace job locking mechanism with the 93v- version which uses the atomic libast functions asoincint(), asogetint() and asodecint(). See: src/lib/libast/man/aso.3 src/cmd/ksh93/sh/jobs.c: job_subsave(): - Revert gcc optimiser bug workaround from c258a04f. It should now be unnecessary. --- src/cmd/ksh93/include/jobs.h | 14 ++++++-------- src/cmd/ksh93/sh/jobs.c | 8 +------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/cmd/ksh93/include/jobs.h b/src/cmd/ksh93/include/jobs.h index 90d9d2f8c7a2..ddd169b63b64 100644 --- a/src/cmd/ksh93/include/jobs.h +++ b/src/cmd/ksh93/include/jobs.h @@ -33,6 +33,7 @@ # include #endif /* !SIGINT */ #include "FEATURE/options" +#include #undef JOBS #if defined(SIGCLD) && !defined(SIGCHLD) @@ -125,16 +126,13 @@ extern struct jobs job; #define vmbusy() 0 #endif -#define job_lock() (job.in_critical++) +#define job_lock() asoincint(&job.in_critical) #define job_unlock() \ do { \ - int sig; \ - if (!--job.in_critical && (sig = job.savesig)) \ - { \ - if (!job.in_critical++ && !vmbusy()) \ - job_reap(sig); \ - job.in_critical--; \ - } \ + int _sig; \ + if (asogetint(&job.in_critical) == 1 && (_sig = job.savesig) && !vmbusy()) \ + job_reap(_sig); \ + asodecint(&job.in_critical); \ } while(0) extern const char e_jobusage[]; diff --git a/src/cmd/ksh93/sh/jobs.c b/src/cmd/ksh93/sh/jobs.c index 9b5348c4b602..6952b9d710ea 100644 --- a/src/cmd/ksh93/sh/jobs.c +++ b/src/cmd/ksh93/sh/jobs.c @@ -1882,14 +1882,8 @@ static int job_chksave(register pid_t pid) void *job_subsave(void) { - /* - * We must make a lock first before doing anything else, - * otherwise GCC will remove the job locking mechanism - * as a result of compiler optimization. - */ - job_lock(); - struct back_save *bp = new_of(struct back_save,0); + job_lock(); *bp = bck; bp->prev = bck.prev; bck.count = 0;