From 9c69fac7939576aab8a6a275b0f07fa5d115bf25 Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Mon, 1 Aug 2022 04:05:06 +0200 Subject: [PATCH] Re-backport atomic job locking from 93v- (re: 52067c3d, 595a0a56) [This commit was previously reverted because it seemed to cause the build to fail on Cygwin. But I just re-tested it, and it's fine. It may be that my Cygwin installation at the time was defective.] 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/Mamfile | 3 +++ src/cmd/ksh93/include/jobs.h | 14 ++++++-------- src/cmd/ksh93/include/version.h | 2 +- src/cmd/ksh93/sh/jobs.c | 8 +------- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/cmd/ksh93/Mamfile b/src/cmd/ksh93/Mamfile index f14205d3f..b5f682d45 100644 --- a/src/cmd/ksh93/Mamfile +++ b/src/cmd/ksh93/Mamfile @@ -377,6 +377,9 @@ make install make include/jobs.h implicit prev ${PACKAGE_ast_INCLUDE}/vmalloc.h implicit prev include/terminal.h implicit + make ${PACKAGE_ast_INCLUDE}/aso.h implicit + prev ${PACKAGE_ast_INCLUDE}/ast_common.h implicit + done ${PACKAGE_ast_INCLUDE}/aso.h implicit prev FEATURE/options implicit prev ${PACKAGE_ast_INCLUDE}/sfio.h implicit prev ${PACKAGE_ast_INCLUDE}/ast.h implicit diff --git a/src/cmd/ksh93/include/jobs.h b/src/cmd/ksh93/include/jobs.h index b6e0713c4..0d03cb7f3 100644 --- a/src/cmd/ksh93/include/jobs.h +++ b/src/cmd/ksh93/include/jobs.h @@ -30,6 +30,7 @@ # include #endif /* !SIGINT */ #include "FEATURE/options" +#include #undef JOBS #if defined(SIGCLD) && !defined(SIGCHLD) @@ -120,16 +121,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/include/version.h b/src/cmd/ksh93/include/version.h index b4fc81296..72b8c16e2 100644 --- a/src/cmd/ksh93/include/version.h +++ b/src/cmd/ksh93/include/version.h @@ -17,7 +17,7 @@ #include #define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */ -#define SH_RELEASE_SVER "1.0.0-rc.5" /* semantic version number: https://semver.org */ +#define SH_RELEASE_SVER "1.0.0-rc.6" /* semantic version number: https://semver.org */ #define SH_RELEASE_DATE "2022-07-31" /* must be in this format for $((.sh.version)) */ #define SH_RELEASE_CPYR "(c) 2020-2022 Contributors to ksh " SH_RELEASE_FORK diff --git a/src/cmd/ksh93/sh/jobs.c b/src/cmd/ksh93/sh/jobs.c index dd0af5f45..f923e661c 100644 --- a/src/cmd/ksh93/sh/jobs.c +++ b/src/cmd/ksh93/sh/jobs.c @@ -1878,14 +1878,8 @@ again: 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;