Reorganization of spinlock defines - Mailing list pgsql-patches

From Bruce Momjian
Subject Reorganization of spinlock defines
Date
Msg-id 200309120143.h8C1hG306886@candle.pha.pa.us
Whole thread Raw
Responses Re: Reorganization of spinlock defines  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: Reorganization of spinlock defines  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: Reorganization of spinlock defines  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: Reorganization of spinlock defines  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-patches
Prompted by confusion over Itanium/Opterion, I have written a patch to
improve the way we define spinlocks for platforms and cpu's.  It
basically decouples the OS from the CPU spinlock code.  In almost all
cases, the spinlock code cares only about the compiler and CPU, not the
OS.

The patch:

    o defines HAS_TEST_AND_SET inside each spinlock routine, not in
      platform-specific files
    o moves slock_t defines into the spinlock routines
    o remove NEED_{CPU}_TAS_ASM define because it is no longer needed
    o reports a compile error if spinlocks are not defined
    o adds a configure option --without-spinlocks to allow
      non-spinlock compiles

Looking at the patch, I realize this is how we should have done it all
along.

It would be nice to report the lack of spinlocks in configure, rather
than during the compile, but I can't compile s_lock.h and test for
HAS_TEST_AND_SET until configure completes.

I plan to apply this to 7.4.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: configure
===================================================================
RCS file: /cvsroot/pgsql-server/configure,v
retrieving revision 1.295
diff -c -c -r1.295 configure
*** configure    7 Sep 2003 16:49:41 -0000    1.295
--- configure    12 Sep 2003 01:36:28 -0000
***************
*** 869,874 ****
--- 869,875 ----
    --with-rendezvous       build with Rendezvous support
    --with-openssl[=DIR]    build with OpenSSL support [/usr/local/ssl]
    --without-readline      do not use Readline
+   --without-spinlocks      do not use Spinlocks
    --without-zlib          do not use Zlib
    --with-gnu-ld           assume the C compiler uses GNU ld default=no

***************
*** 3494,3499 ****
--- 3495,3530 ----


  #
+ # Spinlocks
+ #
+
+
+
+ # Check whether --with-spinlocks or --without-spinlocks was given.
+ if test "${with_spinlocks+set}" = set; then
+   withval="$with_spinlocks"
+
+   case $withval in
+     yes)
+       :
+       ;;
+     no)
+       :
+       ;;
+     *)
+       { { echo "$as_me:$LINENO: error: no argument expected for --with-spinlocks option" >&5
+ echo "$as_me: error: no argument expected for --with-spinlocks option" >&2;}
+    { (exit 1); exit 1; }; }
+       ;;
+   esac
+
+ else
+   with_spinlocks=yes
+
+ fi;
+
+
+ #
  # Zlib
  #

***************
*** 3523,3529 ****
  fi;


-
  #
  # Elf
  #
--- 3554,3559 ----
***************
*** 6060,6065 ****
--- 6090,6108 ----
     { (exit 1); exit 1; }; }
  fi

+ fi
+
+ if test "$with_spinlocks" = yes; then
+
+ cat >>confdefs.h <<\_ACEOF
+ #define HAVE_SPINLOCKS 1
+ _ACEOF
+
+ else
+   { echo "$as_me:$LINENO: WARNING:
+ *** Not using spinlocks will cause poor performance." >&5
+ echo "$as_me: WARNING:
+ *** Not using spinlocks will cause poor performance." >&2;}
  fi

  if test "$with_krb4" = yes ; then
Index: configure.in
===================================================================
RCS file: /cvsroot/pgsql-server/configure.in,v
retrieving revision 1.286
diff -c -c -r1.286 configure.in
*** configure.in    7 Sep 2003 16:38:05 -0000    1.286
--- configure.in    12 Sep 2003 01:36:31 -0000
***************
*** 522,533 ****
                [  --without-readline      do not use Readline])

  #
  # Zlib
  #
  PGAC_ARG_BOOL(with, zlib, yes,
                [  --without-zlib          do not use Zlib])

-
  #
  # Elf
  #
--- 522,538 ----
                [  --without-readline      do not use Readline])

  #
+ # Spinlocks
+ #
+ PGAC_ARG_BOOL(with, spinlocks, yes,
+               [  --without-spinlocks      do not use Spinlocks])
+
+ #
  # Zlib
  #
  PGAC_ARG_BOOL(with, zlib, yes,
                [  --without-zlib          do not use Zlib])

  #
  # Elf
  #
***************
*** 676,681 ****
--- 681,693 ----
  If you have zlib already installed, see config.log for details on the
  failure.  It is possible the compiler isn't looking in the proper directory.
  Use --without-zlib to disable zlib support.])])
+ fi
+
+ if test "$with_spinlocks" = yes; then
+   AC_DEFINE(HAVE_SPINLOCKS, 1, [Define to 1 if you have spinlocks.])
+ else
+   AC_MSG_WARN([
+ *** Not using spinlocks will cause poor performance.])
  fi

  if test "$with_krb4" = yes ; then
Index: doc/src/sgml/installation.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/installation.sgml,v
retrieving revision 1.141
diff -c -c -r1.141 installation.sgml
*** doc/src/sgml/installation.sgml    11 Sep 2003 21:42:20 -0000    1.141
--- doc/src/sgml/installation.sgml    12 Sep 2003 01:36:34 -0000
***************
*** 900,905 ****
--- 900,915 ----
        </varlistentry>

        <varlistentry>
+        <term><option>--without-spinlocks</option></term>
+        <listitem>
+         <para>
+          Allows source builds to succeed without CPU spinlock support.
+          Lack of spinlock support will produce poor performance.
+         </para>
+        </listitem>
+       </varlistentry>
+
+       <varlistentry>
         <term><option>--enable-thread-safety</option></term>
         <listitem>
          <para>
Index: src/backend/main/main.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/main/main.c,v
retrieving revision 1.62
diff -c -c -r1.62 main.c
*** src/backend/main/main.c    9 Sep 2003 15:19:31 -0000    1.62
--- src/backend/main/main.c    12 Sep 2003 01:36:34 -0000
***************
*** 23,29 ****
  #include <pwd.h>
  #include <unistd.h>

! #if defined(__alpha) && defined(__osf__)
  #include <sys/sysinfo.h>
  #include "machine/hal_sysinfo.h"
  #define ASSEMBLER
--- 23,29 ----
  #include <pwd.h>
  #include <unistd.h>

! #if defined(__alpha__) && defined(__osf__)
  #include <sys/sysinfo.h>
  #include "machine/hal_sysinfo.h"
  #define ASSEMBLER
***************
*** 63,76 ****
       * without help.  Avoid adding more here, if you can.
       */

! #if defined(__alpha)
  #ifdef NOFIXADE
      int            buffer[] = {SSIN_UACPROC, UAC_SIGBUS};
  #endif   /* NOFIXADE */
  #ifdef NOPRINTADE
      int            buffer[] = {SSIN_UACPROC, UAC_NOPRINT};
  #endif   /* NOPRINTADE */
! #endif   /* __alpha */

  #if defined(NOFIXADE) || defined(NOPRINTADE)

--- 63,76 ----
       * without help.  Avoid adding more here, if you can.
       */

! #if defined(__alpha__)
  #ifdef NOFIXADE
      int            buffer[] = {SSIN_UACPROC, UAC_SIGBUS};
  #endif   /* NOFIXADE */
  #ifdef NOPRINTADE
      int            buffer[] = {SSIN_UACPROC, UAC_NOPRINT};
  #endif   /* NOPRINTADE */
! #endif   /* __alpha__ */

  #if defined(NOFIXADE) || defined(NOPRINTADE)

***************
*** 78,84 ****
      syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
  #endif

! #if defined(__alpha)
      if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
                     (unsigned long) NULL) < 0)
          fprintf(stderr, gettext("%s: setsysinfo failed: %s\n"),
--- 78,84 ----
      syscall(SYS_sysmips, MIPS_FIXADE, 0, NULL, NULL, NULL);
  #endif

! #if defined(__alpha__)
      if (setsysinfo(SSI_NVPAIRS, buffer, 1, (caddr_t) NULL,
                     (unsigned long) NULL) < 0)
          fprintf(stderr, gettext("%s: setsysinfo failed: %s\n"),
Index: src/backend/storage/lmgr/s_lock.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/storage/lmgr/s_lock.c,v
retrieving revision 1.16
diff -c -c -r1.16 s_lock.c
*** src/backend/storage/lmgr/s_lock.c    8 Aug 2003 21:42:00 -0000    1.16
--- src/backend/storage/lmgr/s_lock.c    12 Sep 2003 01:36:35 -0000
***************
*** 118,128 ****
   * Various TAS implementations that cannot live in s_lock.h as no inline
   * definition exists (yet).
   * In the future, get rid of tas.[cso] and fold it into this file.
   */


  #if defined(__GNUC__)
! /*************************************************************************
   * All the gcc flavors that are not inlined
   */

--- 118,133 ----
   * Various TAS implementations that cannot live in s_lock.h as no inline
   * definition exists (yet).
   * In the future, get rid of tas.[cso] and fold it into this file.
+  *
+  * If you change something here, you have to modify s_lock.h because
+  * the definitions for these is split between this file and s_lock.h.
   */


  #if defined(__GNUC__)
!
! /*
!  * -----------------------------------------------------------------
   * All the gcc flavors that are not inlined
   */

***************
*** 208,214 ****



! #if defined(NEED_SPARC_TAS_ASM)
  /*
   * sparc machines not using gcc
   */
--- 213,219 ----



! #if defined(__sparc__)
  /*
   * sparc machines not using gcc
   */
***************
*** 227,240 ****
      asm("retl");
      asm("nop");
  }
! #endif   /* NEED_SPARC_TAS_ASM */
!
!
!

- #if defined(NEED_I386_TAS_ASM)
- /* non gcc i386 based things */
- #endif   /* NEED_I386_TAS_ASM */
  #endif   /* not __GNUC__ */


--- 232,239 ----
      asm("retl");
      asm("nop");
  }
! #endif   /* __sparc__ */

  #endif   /* not __GNUC__ */


Index: src/backend/storage/lmgr/spin.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/storage/lmgr/spin.c,v
retrieving revision 1.11
diff -c -c -r1.11 spin.c
*** src/backend/storage/lmgr/spin.c    4 Aug 2003 02:40:03 -0000    1.11
--- src/backend/storage/lmgr/spin.c    12 Sep 2003 01:36:35 -0000
***************
*** 25,31 ****
  #include "storage/lwlock.h"
  #include "storage/pg_sema.h"
  #include "storage/spin.h"
!

  #ifdef HAS_TEST_AND_SET

--- 25,31 ----
  #include "storage/lwlock.h"
  #include "storage/pg_sema.h"
  #include "storage/spin.h"
! #include "storage/s_lock.h"

  #ifdef HAS_TEST_AND_SET

Index: src/include/pg_config.h.in
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/pg_config.h.in,v
retrieving revision 1.62
diff -c -c -r1.62 pg_config.h.in
*** src/include/pg_config.h.in    7 Sep 2003 03:43:56 -0000    1.62
--- src/include/pg_config.h.in    12 Sep 2003 01:36:36 -0000
***************
*** 357,362 ****
--- 357,365 ----
  /* Define to 1 if you have the `snprintf' function. */
  #undef HAVE_SNPRINTF

+ /* Define to 1 if you have spinlocks. */
+ #undef HAVE_SPINLOCKS
+
  /* Define to 1 if you have the `srandom' function. */
  #undef HAVE_SRANDOM

Index: src/include/port/aix.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/aix.h,v
retrieving revision 1.9
diff -c -c -r1.9 aix.h
*** src/include/port/aix.h    12 Nov 2002 00:39:08 -0000    1.9
--- src/include/port/aix.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,8 ****
  #define CLASS_CONFLICT
  #define DISABLE_XOPEN_NLS
- #define HAS_TEST_AND_SET
-
- typedef unsigned int slock_t;

  #include <sys/machine.h>        /* ENDIAN definitions for network
                                   * communication */
--- 1,5 ----
Index: src/include/port/beos.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/beos.h,v
retrieving revision 1.11
diff -c -c -r1.11 beos.h
*** src/include/port/beos.h    25 Oct 2001 05:50:09 -0000    1.11
--- src/include/port/beos.h    12 Sep 2003 01:36:36 -0000
***************
*** 2,11 ****
  #include <kernel/image.h>
  #include <sys/ioctl.h>

- #define HAS_TEST_AND_SET
-
- typedef unsigned char slock_t;
-
  #define AF_UNIX        10            /* no domain sockets on BeOS */

  /* Beos doesn't have all the required getrusage fields */
--- 2,7 ----
Index: src/include/port/bsdi.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/bsdi.h,v
retrieving revision 1.8
diff -c -c -r1.8 bsdi.h
*** src/include/port/bsdi.h    4 Aug 2003 00:43:32 -0000    1.8
--- src/include/port/bsdi.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,10 ****
- #if defined(__i386__)
- #define NEED_I386_TAS_ASM
- #endif
- #if defined(__sparc__)
- #define NEED_SPARC_TAS_ASM
- #endif
-
- #define HAS_TEST_AND_SET
-
- typedef unsigned char slock_t;
--- 0 ----
Index: src/include/port/cygwin.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/cygwin.h,v
retrieving revision 1.4
diff -c -c -r1.4 cygwin.h
*** src/include/port/cygwin.h    4 Aug 2003 00:43:32 -0000    1.4
--- src/include/port/cygwin.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,8 ****
  /* $Header: /cvsroot/pgsql-server/src/include/port/cygwin.h,v 1.4 2003/08/04 00:43:32 momjian Exp $ */

- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
-
  #include <cygwin/version.h>

  /*
--- 1,5 ----
***************
*** 20,24 ****
  #define DLLIMPORT __declspec (dllexport)
  #else
  #define DLLIMPORT __declspec (dllimport)
-
  #endif
--- 17,20 ----
Index: src/include/port/darwin.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/darwin.h,v
retrieving revision 1.5
diff -c -c -r1.5 darwin.h
*** src/include/port/darwin.h    28 Oct 2001 06:26:08 -0000    1.5
--- src/include/port/darwin.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,13 ****
  #define __darwin__    1
-
- #if defined(__ppc__)
- #define HAS_TEST_AND_SET
- #endif
-
- #if defined(__ppc__)
- typedef unsigned int slock_t;
-
- #else
- typedef unsigned char slock_t;
-
- #endif
--- 1 ----
Index: src/include/port/dgux.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/dgux.h,v
retrieving revision 1.9
diff -c -c -r1.9 dgux.h
*** src/include/port/dgux.h    28 Oct 2001 06:26:08 -0000    1.9
--- src/include/port/dgux.h    12 Sep 2003 01:36:36 -0000
***************
*** 9,13 ****
  #endif
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        BIG_ENDIAN
-
  #endif
--- 9,12 ----
Index: src/include/port/freebsd.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/freebsd.h,v
retrieving revision 1.10
diff -c -c -r1.10 freebsd.h
*** src/include/port/freebsd.h    4 Aug 2003 00:43:32 -0000    1.10
--- src/include/port/freebsd.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,48 ****
- #if defined(__i386__)
- #define NEED_I386_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__sparc__)
- #define NEED_SPARC_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__vax__)
- #define NEED_VAX_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__ns32k__)
- #define NEED_NS32K_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__m68k__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__arm__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__mips__)
- /* #    undef HAS_TEST_AND_SET */
- #endif
-
- #if defined(__alpha__)
- #define HAS_TEST_AND_SET
- typedef unsigned long slock_t;
- #endif
-
- #if defined(__powerpc__)
- #define HAS_TEST_AND_SET
- typedef unsigned int slock_t;
-
- #endif
--- 0 ----
Index: src/include/port/hpux.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/hpux.h,v
retrieving revision 1.19
diff -c -c -r1.19 hpux.h
*** src/include/port/hpux.h    4 Aug 2003 00:43:32 -0000    1.19
--- src/include/port/hpux.h    12 Sep 2003 01:36:36 -0000
***************
*** 10,35 ****

  #if defined(__hppa)

- #define HAS_TEST_AND_SET
- typedef struct
- {
-     int            sema[4];
- } slock_t;
-
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        BIG_ENDIAN
  #endif

  #elif defined(__ia64)

- #define HAS_TEST_AND_SET
- typedef unsigned int slock_t;
-
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        LITTLE_ENDIAN
  #endif

  #else
  #error unrecognized CPU type for HP-UX

  #endif
--- 10,27 ----

  #if defined(__hppa)

  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        BIG_ENDIAN
  #endif

  #elif defined(__ia64)

  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        LITTLE_ENDIAN
  #endif

  #else
+
  #error unrecognized CPU type for HP-UX

  #endif
Index: src/include/port/irix5.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/irix5.h,v
retrieving revision 1.8
diff -c -c -r1.8 irix5.h
*** src/include/port/irix5.h    12 Nov 2002 00:39:08 -0000    1.8
--- src/include/port/irix5.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,3 ****
- #define HAS_TEST_AND_SET
-
- typedef unsigned long slock_t;
--- 0 ----
Index: src/include/port/linux.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/linux.h,v
retrieving revision 1.33
diff -c -c -r1.33 linux.h
*** src/include/port/linux.h    10 Nov 2002 00:33:43 -0000    1.33
--- src/include/port/linux.h    12 Sep 2003 01:36:36 -0000
***************
*** 2,52 ****
  #ifndef _GNU_SOURCE
  #define _GNU_SOURCE 1
  #endif
-
-
- #if defined(__i386__)
- typedef unsigned char slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__sparc__)
- typedef unsigned char slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__powerpc64__)
- typedef unsigned long slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__powerpc__)
- typedef unsigned int slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__alpha__)
- typedef long int slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__mips__)
- typedef unsigned int slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__arm__)
- typedef unsigned char slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__ia64__)
- typedef unsigned int slock_t;
-
- #define HAS_TEST_AND_SET
-
- #elif defined(__s390__) || defined(__s390x__)
- typedef unsigned int slock_t;
-
- #define HAS_TEST_AND_SET
-
- #endif
--- 2,4 ----
Index: src/include/port/netbsd.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/netbsd.h,v
retrieving revision 1.9
diff -c -c -r1.9 netbsd.h
*** src/include/port/netbsd.h    4 Aug 2003 00:43:32 -0000    1.9
--- src/include/port/netbsd.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,48 ****
- #if defined(__i386__)
- #define NEED_I386_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__sparc__)
- #define NEED_SPARC_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__vax__)
- #define NEED_VAX_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__ns32k__)
- #define NEED_NS32K_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__m68k__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__arm__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__mips__)
- /* #    undef HAS_TEST_AND_SET */
- #endif
-
- #if defined(__alpha__)
- #define HAS_TEST_AND_SET
- typedef unsigned long slock_t;
- #endif
-
- #if defined(__powerpc__)
- #define HAS_TEST_AND_SET
- typedef unsigned int slock_t;
-
- #endif
--- 0 ----
Index: src/include/port/nextstep.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/nextstep.h,v
retrieving revision 1.6
diff -c -c -r1.6 nextstep.h
*** src/include/port/nextstep.h    28 Oct 2000 23:53:00 -0000    1.6
--- src/include/port/nextstep.h    12 Sep 2003 01:36:36 -0000
***************
*** 15,18 ****
  #endif

  #define NO_WAITPID
- typedef struct mutex slock_t;
--- 15,17 ----
Index: src/include/port/openbsd.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/openbsd.h,v
retrieving revision 1.8
diff -c -c -r1.8 openbsd.h
*** src/include/port/openbsd.h    4 Aug 2003 00:43:32 -0000    1.8
--- src/include/port/openbsd.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,48 ****
- #if defined(__i386__)
- #define NEED_I386_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__sparc__)
- #define NEED_SPARC_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__vax__)
- #define NEED_VAX_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__ns32k__)
- #define NEED_NS32K_TAS_ASM
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__m68k__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__arm__)
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
- #endif
-
- #if defined(__mips__)
- /* #    undef HAS_TEST_AND_SET */
- #endif
-
- #if defined(__alpha__)
- #define HAS_TEST_AND_SET
- typedef unsigned long slock_t;
- #endif
-
- #if defined(__powerpc__)
- #define HAS_TEST_AND_SET
- typedef unsigned int slock_t;
-
- #endif
--- 0 ----
Index: src/include/port/osf.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/osf.h,v
retrieving revision 1.7
diff -c -c -r1.7 osf.h
*** src/include/port/osf.h    28 Oct 2001 06:26:08 -0000    1.7
--- src/include/port/osf.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,7 ****
  #define NOFIXADE
  #define DISABLE_XOPEN_NLS
! #define HAS_TEST_AND_SET
!  /* #include <sys/mman.h> */    /* for msemaphore */
  /*typedef msemaphore slock_t;*/
  #include <alpha/builtins.h>
- typedef volatile long slock_t;
--- 1,5 ----
  #define NOFIXADE
  #define DISABLE_XOPEN_NLS
! /* #include <sys/mman.h> */    /* for msemaphore */
  /*typedef msemaphore slock_t;*/
  #include <alpha/builtins.h>
Index: src/include/port/qnx4.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/qnx4.h,v
retrieving revision 1.8
diff -c -c -r1.8 qnx4.h
*** src/include/port/qnx4.h    9 May 2003 16:59:43 -0000    1.8
--- src/include/port/qnx4.h    12 Sep 2003 01:36:36 -0000
***************
*** 5,12 ****
  #include <unix.h>
  #include <sys/select.h>            /* for select */

- #define HAS_TEST_AND_SET
-
  #undef HAVE_GETRUSAGE

  #define strncasecmp strnicmp
--- 5,10 ----
***************
*** 21,28 ****
  #endif   /* NAN */

  typedef u_short ushort;
-
- typedef unsigned char slock_t;

  extern int    isnan(double dsrc);

--- 19,24 ----
Index: src/include/port/sco.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/sco.h,v
retrieving revision 1.13
diff -c -c -r1.13 sco.h
*** src/include/port/sco.h    28 Oct 2001 06:26:08 -0000    1.13
--- src/include/port/sco.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,13 ****
  /* see src/backend/libpq/pqcomm.c */
  #define SCO_ACCEPT_BUG

- #define HAS_TEST_AND_SET
- #define NEED_I386_TAS_ASM
-
  #define USE_UNIVEL_CC

- typedef unsigned char slock_t;
-
  #ifndef            BIG_ENDIAN
  #define            BIG_ENDIAN        4321
  #endif
--- 1,8 ----
***************
*** 19,23 ****
  #endif
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        LITTLE_ENDIAN
-
  #endif
--- 14,17 ----
Index: src/include/port/solaris.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/solaris.h,v
retrieving revision 1.8
diff -c -c -r1.8 solaris.h
*** src/include/port/solaris.h    10 Mar 2003 22:28:21 -0000    1.8
--- src/include/port/solaris.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,8 ****
  /* $Header: /cvsroot/pgsql-server/src/include/port/solaris.h,v 1.8 2003/03/10 22:28:21 tgl Exp $ */

- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
-
  /*
   * Sort this out for all operating systems some time.  The __xxx
   * symbols are defined on both GCC and Solaris CC, although GCC
--- 1,5 ----
Index: src/include/port/sunos4.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/sunos4.h,v
retrieving revision 1.7
diff -c -c -r1.7 sunos4.h
*** src/include/port/sunos4.h    28 Oct 2001 06:26:08 -0000    1.7
--- src/include/port/sunos4.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,6 ****
- #define HAS_TEST_AND_SET
- typedef unsigned char slock_t;
-
  /* sprintf() returns char *, not int, on SunOS 4.1.x */
  #define SPRINTF_CHAR

--- 1,3 ----
***************
*** 15,19 ****
  #endif
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        BIG_ENDIAN
-
  #endif
--- 12,15 ----
Index: src/include/port/svr4.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/svr4.h,v
retrieving revision 1.11
diff -c -c -r1.11 svr4.h
*** src/include/port/svr4.h    28 Oct 2001 06:26:08 -0000    1.11
--- src/include/port/svr4.h    12 Sep 2003 01:36:36 -0000
***************
*** 3,13 ****
  #define            BYTE_ORDER        BIG_ENDIAN
  #endif
  #endif
-
- #ifdef sinix
- #define HAS_TEST_AND_SET
-
- #include "abi_mutex.h"
- typedef abilock_t slock_t;
-
- #endif
--- 3,5 ----
Index: src/include/port/univel.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/univel.h,v
retrieving revision 1.17
diff -c -c -r1.17 univel.h
*** src/include/port/univel.h    28 Oct 2001 06:26:08 -0000    1.17
--- src/include/port/univel.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,14 ****
- #define HAS_TEST_AND_SET
- #define NEED_I386_TAS_ASM
-
  /***************************************
   * Define this if you are compiling with
   * the native UNIXWARE C compiler.
   ***************************************/
  #define USE_UNIVEL_CC

- typedef unsigned char slock_t;
-
  #ifndef            BIG_ENDIAN
  #define            BIG_ENDIAN        4321
  #endif
--- 1,9 ----
***************
*** 20,24 ****
  #endif
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        LITTLE_ENDIAN
-
  #endif
--- 15,18 ----
Index: src/include/port/unixware.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/port/unixware.h,v
retrieving revision 1.11
diff -c -c -r1.11 unixware.h
*** src/include/port/unixware.h    28 Oct 2001 06:26:08 -0000    1.11
--- src/include/port/unixware.h    12 Sep 2003 01:36:36 -0000
***************
*** 1,6 ****
- #define HAS_TEST_AND_SET
- #define NEED_I386_TAS_ASM
-
  /* see src/backend/libpq/pqcomm.c */
  #define SCO_ACCEPT_BUG

--- 1,3 ----
***************
*** 10,17 ****
   ***************************************/
  #define USE_UNIVEL_CC

- typedef unsigned char slock_t;
-
  #ifndef            BIG_ENDIAN
  #define            BIG_ENDIAN        4321
  #endif
--- 7,12 ----
***************
*** 23,27 ****
  #endif
  #ifndef            BYTE_ORDER
  #define            BYTE_ORDER        LITTLE_ENDIAN
-
  #endif
--- 18,21 ----
Index: src/include/storage/s_lock.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/include/storage/s_lock.h,v
retrieving revision 1.112
diff -c -c -r1.112 s_lock.h
*** src/include/storage/s_lock.h    4 Aug 2003 02:40:15 -0000    1.112
--- src/include/storage/s_lock.h    12 Sep 2003 01:36:37 -0000
***************
*** 73,84 ****
  #include "storage/pg_sema.h"


- #if defined(HAS_TEST_AND_SET)
-
-
  #if defined(__GNUC__) || defined(__ICC)
! /*************************************************************************
   * All the gcc inlines
   */

  /*
--- 73,84 ----
  #include "storage/pg_sema.h"


  #if defined(__GNUC__) || defined(__ICC)
! /*
!  * ---------------------------------------------------------------------
   * All the gcc inlines
+  *
+  * Gcc consistently defines the CPU as __cpu__.
   */

  /*
***************
*** 95,101 ****
--- 95,104 ----


  #if defined(__i386__) || defined(__x86_64__) /* AMD Opteron */
+
+ #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 114,122 ****


  /* Intel Itanium */
! #if defined(__ia64__) || defined(__ia64)
! #define TAS(lock) tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
  {
--- 117,128 ----


  /* Intel Itanium */
! #if defined(__ia64__)

+ #define HAS_TEST_AND_SET
+ #define TAS(lock) tas(lock)
+ typedef unsigned int slock_t;
+
  static __inline__ int
  tas(volatile slock_t *lock)
  {
***************
*** 131,141 ****
      return (int) ret;
  }

! #endif     /* __ia64__ || __ia64 */


! #if defined(__arm__) || defined(__arm__)
  #define TAS(lock) tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
--- 137,150 ----
      return (int) ret;
  }

! #endif     /* __ia64__ */
!

+ #if defined(__arm__)

! #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 156,162 ****
  /*
   * S/390 Linux
   */
! #define TAS(lock)       tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
--- 165,174 ----
  /*
   * S/390 Linux
   */
!
! #define HAS_TEST_AND_SET
! #define TAS(lock) tas(lock)
! typedef unsigned int slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 182,188 ****
  /*
   * S/390x Linux (64-bit zSeries)
   */
! #define TAS(lock)       tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
--- 194,203 ----
  /*
   * S/390x Linux (64-bit zSeries)
   */
!
! #define HAS_TEST_AND_SET
! #define TAS(lock) tas(lock)
! typedef unsigned int slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 206,212 ****
--- 221,230 ----


  #if defined(__sparc__)
+
+ #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 223,229 ****
--- 241,251 ----
  #endif     /* __sparc__ */

  #if defined(__ppc__) || defined(__powerpc__) || defined(__powerpc64__)
+
+ #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned int slock_t;
+
  /*
   * NOTE: per the Enhanced PowerPC Architecture manual, v1.0 dated 7-May-2002,
   * an isync is a sufficient synchronization barrier after a lwarx/stwcx loop.
***************
*** 259,265 ****
--- 281,290 ----


  #if defined(__mc68000__) && defined(__linux__)
+
+ #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 281,286 ****
--- 306,315 ----


  #if defined(__ppc__) || defined(__powerpc__) || defined(__powerpc64__)
+
+ #define HAS_TEST_AND_SET
+ typedef unsigned int slock_t;
+
  /*
   * PowerPC S_UNLOCK is almost standard but requires a "sync" instruction.
   */
***************
*** 294,305 ****
  #endif /* powerpc */


! #if defined(NEED_VAX_TAS_ASM)
  /*
   * VAXen -- even multiprocessor ones
   * (thanks to Tom Ivar Helbekkmo)
   */
  #define TAS(lock) tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
--- 323,337 ----
  #endif /* powerpc */


! #if defined(__vax__)
  /*
   * VAXen -- even multiprocessor ones
   * (thanks to Tom Ivar Helbekkmo)
   */
+
+ #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 317,327 ****
      return _res;
  }

! #endif     /* NEED_VAX_TAS_ASM */


! #if defined(NEED_NS32K_TAS_ASM)
  #define TAS(lock) tas(lock)

  static __inline__ int
  tas(volatile slock_t *lock)
--- 349,362 ----
      return _res;
  }

! #endif     /* __vax__ */


! #if defined (__ns32k__)
!
! #define HAS_TEST_AND_SET
  #define TAS(lock) tas(lock)
+ typedef unsigned char slock_t;

  static __inline__ int
  tas(volatile slock_t *lock)
***************
*** 335,352 ****
      return _res;
  }

! #endif     /* NEED_NS32K_TAS_ASM */



  #else                            /* !__GNUC__ */

! /***************************************************************************
   * All non-gcc inlines
   */

! #if defined(NEED_I386_TAS_ASM) && defined(USE_UNIVEL_CC)
! #define TAS(lock)    tas(lock)

  asm int
  tas(volatile slock_t *s_lock)
--- 370,404 ----
      return _res;
  }

! #endif     /* __ns32k__ */
!
!
! /* These live in s_lock.c */
!
! #if defined(__m68k__)
! #define HAS_TEST_AND_SET
! typedef unsigned char slock_t;
! #endif
!
! #if defined(__mips__) && !defined(__sgi)
! #define HAS_TEST_AND_SET
! typedef unsigned char slock_t;
! #endif



  #else                            /* !__GNUC__ */

! /*
!  * ---------------------------------------------------------------------
   * All non-gcc inlines
   */

! #if defined(__i386__) && defined(USE_UNIVEL_CC)
!
! #define HAS_TEST_AND_SET
! #define TAS(lock) tas(lock)
! typedef unsigned char slock_t;

  asm int
  tas(volatile slock_t *s_lock)
***************
*** 361,380 ****
      popl %ebx
  }

! #endif     /* defined(NEED_I386_TAS_ASM) && defined(USE_UNIVEL_CC) */

  #endif     /* defined(__GNUC__) */



! /*************************************************************************
   * These are the platforms that have only one compiler, or do not use inline
   * assembler (and hence have common code for gcc and non-gcc compilers,
   * if both are available).
   */


! #if defined(__alpha)

  /*
   * Correct multi-processor locking methods are explained in section 5.5.3
--- 413,451 ----
      popl %ebx
  }

! #endif     /* defined(__i386__) && defined(USE_UNIVEL_CC) */
!
!
! /* These live in s_lock.c */
!
! #if defined(sun3)
! #define HAS_TEST_AND_SET
! typedef unsigned char slock_t;
! #endif
!
! #if defined(__sparc__)
! #define HAS_TEST_AND_SET
! typedef unsigned char slock_t;
! #endif
!
!

  #endif     /* defined(__GNUC__) */



! /*
!  * -------------------------------------------------------------------------
   * These are the platforms that have only one compiler, or do not use inline
   * assembler (and hence have common code for gcc and non-gcc compilers,
   * if both are available).
   */


! #if defined(__alpha__)
!
! #define HAS_TEST_AND_SET
! typedef unsigned long slock_t;

  /*
   * Correct multi-processor locking methods are explained in section 5.5.3
***************
*** 384,390 ****
   */
  #if defined(__GNUC__)

! #define TAS(lock)  tas(lock)
  #define S_UNLOCK(lock)    \
  do \
  {\
--- 455,461 ----
   */
  #if defined(__GNUC__)

! #define TAS(lock) tas(lock)
  #define S_UNLOCK(lock)    \
  do \
  {\
***************
*** 435,441 ****

  #endif     /* defined(__GNUC__) */

! #endif     /* __alpha */


  #if defined(__hppa)
--- 506,512 ----

  #endif     /* defined(__GNUC__) */

! #endif     /* __alpha__ */


  #if defined(__hppa)
***************
*** 449,454 ****
--- 520,530 ----
   * all words set to non-zero. tas() is in tas.s
   */

+ #define HAS_TEST_AND_SET
+ typedef struct
+ {
+     int            sema[4];
+ } slock_t;
  #define S_UNLOCK(lock) \
      do { \
          volatile slock_t *lock_ = (volatile slock_t *) (lock); \
***************
*** 466,471 ****
--- 542,550 ----
  /*
   * QNX 4 using WATCOM C
   */
+
+ #define HAS_TEST_AND_SET
+ typedef unsigned char slock_t;
  #define TAS(lock) wc_tas(lock)
  extern slock_t wc_tas(volatile slock_t *lock);
  #pragma aux wc_tas =\
***************
*** 490,495 ****
--- 569,578 ----
   * assembly from his NECEWS SVR4 port, but we probably ought to retain this
   * for the R3000 chips out there.
   */
+
+ #define HAS_TEST_AND_SET
+ typedef unsigned long slock_t;
+
  #include "mutex.h"
  #define TAS(lock)    (test_and_set(lock,1))
  #define S_UNLOCK(lock)    (test_then_and(lock,0))
***************
*** 504,509 ****
--- 587,597 ----
   * member. (Basically same as SGI)
   *
   */
+
+ #define HAS_TEST_AND_SET
+ #include "abi_mutex.h"
+ typedef abilock_t slock_t;
+
  #define TAS(lock)    (!acquire_lock(lock))
  #define S_UNLOCK(lock)    release_lock(lock)
  #define S_INIT_LOCK(lock)    init_lock(lock)
***************
*** 517,522 ****
--- 605,614 ----
   *
   * Note that slock_t on POWER/POWER2/PowerPC is int instead of char
   */
+
+ #define HAS_TEST_AND_SET
+ typedef unsigned int slock_t;
+
  #define TAS(lock)            _check_lock(lock, 0, 1)
  #define S_UNLOCK(lock)        _clear_lock(lock, 0)
  #endif     /* _AIX */
***************
*** 528,533 ****
--- 620,628 ----
   * slock_t is defined as a struct mutex.
   */

+ #define HAS_TEST_AND_SET
+ typedef struct mutex slock_t;
+
  #define S_LOCK(lock)    mutex_lock(lock)
  #define S_UNLOCK(lock)    mutex_unlock(lock)
  #define S_INIT_LOCK(lock)    mutex_init(lock)
***************
*** 537,543 ****



! #else                            /* !HAS_TEST_AND_SET */

  /*
   * Fake spinlock implementation using semaphores --- slow and prone
--- 632,645 ----



! #ifndef HAS_TEST_AND_SET
!
! #ifdef HAVE_SPINLOCKS
! #error This platform does not support native spinlocks.
! #error To continue the compile, rerun configure using --without-spinlocks.
! #error However, performance will be poor.
! #error Please report this to pgsql-bugs@postgresql.org.
! #endif

  /*
   * Fake spinlock implementation using semaphores --- slow and prone
***************
*** 556,562 ****
  #define S_INIT_LOCK(lock)    s_init_lock_sema(lock)
  #define TAS(lock)    tas_sema(lock)

! #endif     /* HAS_TEST_AND_SET */



--- 658,664 ----
  #define S_INIT_LOCK(lock)    s_init_lock_sema(lock)
  #define TAS(lock)    tas_sema(lock)

! #endif




pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: Minor verbosity increase for analyze
Next
From: Tom Lane
Date:
Subject: Re: Reorganization of spinlock defines