]> granicus.if.org Git - postgresql/commitdiff
Tom Lane wrote:
authorBruce Momjian <bruce@momjian.us>
Sun, 8 Oct 2000 04:38:21 +0000 (04:38 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 8 Oct 2000 04:38:21 +0000 (04:38 +0000)
> > 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
src/include/storage/s_lock.h

index 90c5a8af6cf98d59451eb3de05acca42898950c8..5f138a317917e499f02f32382ba295f6c1025f3e 100644 (file)
@@ -1,8 +1,10 @@
 #define USE_POSIX_TIME
 #define DISABLE_XOPEN_NLS
 #define HAS_TEST_AND_SET
-#include <sys/mman.h>                  /* for msemaphore */
-typedef msemaphore slock_t;
+/*#include <sys/mman.h>*/                      /* for msemaphore */
+/*typedef msemaphore slock_t;*/
+#include <alpha/builtins.h>
+typedef volatile long slock_t;
 
 /* some platforms define __alpha, but not __alpha__ */
 #if defined(__alpha) && !defined(__alpha__)
index 98cbf10920a411929d65b98317ab66cac6867674..86acb8bb56ad380e7e4fd3a301e6cf25e959d237 100644 (file)
@@ -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 <alpha/builtins.h>
+#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__ */