From 92edd4233eec13455f9051ae707ce740915e55df Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 1 Oct 1998 01:53:50 +0000 Subject: [PATCH] Make HP-PA S_UNLOCK a little faster and less dependent on unspecified compiler codegen details. Make default S_LOCK macro more robust against syntax mistakes. (I cleared these changes with David Gould a few days ago.) --- src/include/port/hpux.h | 2 +- src/include/storage/s_lock.h | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/include/port/hpux.h b/src/include/port/hpux.h index d1a6451836..b9c0c7564e 100644 --- a/src/include/port/hpux.h +++ b/src/include/port/hpux.h @@ -9,7 +9,7 @@ #define HAS_TEST_AND_SET typedef struct { - int sem[4]; + int sema[4]; } slock_t; #ifndef BIG_ENDIAN diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index d3f9d6d9b2..eb9a808f09 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/include/storage/s_lock.h,v 1.50 1998/09/21 02:25:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/storage/s_lock.h,v 1.51 1998/10/01 01:53:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -243,16 +243,20 @@ tas(slock_t *s_lock) * HP-UX (PA-RISC) * * Note that slock_t on PA-RISC is a structure instead of char - * (see storage/ipc.h). + * (see include/port/hpux.h). * * a "set" slock_t has a single word cleared. a "clear" slock_t has * all words set to non-zero. tas() in tas.s */ -static const slock_t clear_lock = -{{-1, -1, -1, -1}}; -#define S_UNLOCK(lock) (*(lock) = clear_lock) /* struct assignment */ +#define S_UNLOCK(lock) \ +{ \ + volatile slock_t *lock_ = (volatile slock_t *) (lock); \ + lock_->sema[0] = lock_->sema[1] = lock_->sema[2] = lock_->sema[3] = -1; \ +} + #define S_LOCK_FREE(lock) ( *(int *) (((long) (lock) + 15) & ~15) != 0) + #endif /* __hpux */ @@ -322,9 +326,10 @@ static const slock_t clear_lock = extern void s_lock(volatile slock_t *lock, const char *file, const int line); #define S_LOCK(lock) \ - if (TAS((volatile slock_t *) lock)) {\ - s_lock((volatile slock_t *) lock, __FILE__, __LINE__); \ - } else + do { \ + if (TAS((volatile slock_t *) lock)) \ + s_lock((volatile slock_t *) lock, __FILE__, __LINE__); \ + } while (0) #endif /* S_LOCK */ #if !defined(S_LOCK_FREE) -- 2.40.0