From be582825162e329f382286c40f11870fe0fc5f42 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sun, 8 Oct 2000 04:38:21 +0000 Subject: [PATCH] Tom Lane wrote: > > For a while I though it might be because we are using an alpha TAS in > > the spinlock rather than the old semaphore. I replaced our spinlock > > with the standard one and it made no difference. We have been running > > with our spinlock implementation for nearly 2 months on a production > > database now without a hitch, so I think it is ok. Did I ever submit > > any patches for the Alpha spinlock? > > Not that I recall. We did get some advice from some Alpha gurus at DEC > who seemed to think the existing TAS code is OK. What was it that you > felt needed to be improved? The current code uses semaphores, which has the advantage that it works well even on multi-processor machines, but the disadvantage that it is not the fastest way possible. Writing a spinlock on Alpha for SMP machines is very difficult, as you need to deal with memory barriers. A real mess. But then one of the people at Compaq pointed out to us that there is a ready-made routine on Alpha. We implemented it with the two patches below. I ran tests with lots of parallel back-ends and got around a 10% speed increase. I include the two patches. Perhaps some of the other people running Tru64 can have a look at these as well. Cheers, Adriaan Joubert --- src/include/port/osf.h | 6 ++++-- src/include/storage/s_lock.h | 7 ++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/include/port/osf.h b/src/include/port/osf.h index 90c5a8af6c..5f138a3179 100644 --- a/src/include/port/osf.h +++ b/src/include/port/osf.h @@ -1,8 +1,10 @@ #define USE_POSIX_TIME #define DISABLE_XOPEN_NLS #define HAS_TEST_AND_SET -#include /* for msemaphore */ -typedef msemaphore slock_t; +/*#include */ /* for msemaphore */ +/*typedef msemaphore slock_t;*/ +#include +typedef volatile long slock_t; /* some platforms define __alpha, but not __alpha__ */ #if defined(__alpha) && !defined(__alpha__) diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index 98cbf10920..86acb8bb56 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/include/storage/s_lock.h,v 1.71 2000/07/05 16:09:31 momjian Exp $ + * $Header: /cvsroot/pgsql/src/include/storage/s_lock.h,v 1.72 2000/10/08 04:38:21 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -270,10 +270,15 @@ tas(slock_t *s_lock) * Note that slock_t on the Alpha AXP is msemaphore instead of char * (see storage/ipc.h). */ +#include +#if 0 #define TAS(lock) (msem_lock((lock), MSEM_IF_NOWAIT) < 0) #define S_UNLOCK(lock) msem_unlock((lock), 0) #define S_INIT_LOCK(lock) msem_init((lock), MSEM_UNLOCKED) #define S_LOCK_FREE(lock) (!(lock)->msem_state) +#else +#define TAS(lock) (__INTERLOCKED_TESTBITSS_QUAD((lock),0)) +#endif #else /* i.e. not __osf__ */