Skip to content

Commit

Permalink
Re-backport atomic job locking from 93v- (re: 52067c3, 595a0a5)
Browse files Browse the repository at this point in the history
[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 07cc71b 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 c258a04.
  It should now be unnecessary.
  • Loading branch information
McDutchie committed Aug 1, 2022
1 parent 37d12bc commit 1560223
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 16 deletions.
3 changes: 3 additions & 0 deletions src/cmd/ksh93/Mamfile
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,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
Expand Down
14 changes: 6 additions & 8 deletions src/cmd/ksh93/include/jobs.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
# include <signal.h>
#endif /* !SIGINT */
#include "FEATURE/options"
#include <aso.h>

#undef JOBS
#if defined(SIGCLD) && !defined(SIGCHLD)
Expand Down Expand Up @@ -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[];
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/ksh93/include/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

#define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */
#define SH_RELEASE_SVER "1.1.0-alpha" /* semantic version number: https://semver.org */
#define SH_RELEASE_DATE "2022-07-28" /* must be in this format for $((.sh.version)) */
#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

/* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */
Expand Down
8 changes: 1 addition & 7 deletions src/cmd/ksh93/sh/jobs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1880,14 +1880,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;
Expand Down

0 comments on commit 1560223

Please sign in to comment.