Re: Reorganization of spinlock defines - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Reorganization of spinlock defines |
Date | |
Msg-id | 200309120439.h8C4d0O19572@candle.pha.pa.us Whole thread Raw |
In response to | Reorganization of spinlock defines (Bruce Momjian <pgman@candle.pha.pa.us>) |
List | pgsql-patches |
New patch attached. --------------------------------------------------------------------------- Bruce Momjian wrote: > 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 04:38:16 -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 04:38:18 -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 04:38:21 -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 04:38:22 -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(__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__) || 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__) || 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 04:38:26 -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 */ *************** *** 148,154 **** } #endif /* __m68k__ */ ! #if defined(__mips__) && !defined(__sgi) static void tas_dummy() { --- 153,159 ---- } #endif /* __m68k__ */ ! #if defined(__mips__) && !defined(__sgi__) static void tas_dummy() { *************** *** 173,179 **** j $31 \n\ "); } ! #endif /* __mips__ && !__sgi */ #else /* not __GNUC__ */ /*************************************************************************** --- 178,184 ---- j $31 \n\ "); } ! #endif /* __mips__ && !__sgi__ */ #else /* not __GNUC__ */ /*************************************************************************** *************** *** 208,214 **** ! #if defined(NEED_SPARC_TAS_ASM) /* * sparc machines not using gcc */ --- 213,219 ---- ! #if defined(__sparc__) || 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 04:38:26 -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 04:38:26 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:27 -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 04:38:28 -0000 *************** *** 73,84 **** #include "storage/pg_sema.h" - #if defined(HAS_TEST_AND_SET) - - #if defined(__GNUC__) || defined(__ICC) ! /************************************************************************* * All the gcc inlines */ /* --- 73,85 ---- #include "storage/pg_sema.h" #if defined(__GNUC__) || defined(__ICC) ! /* ! * --------------------------------------------------------------------- * All the gcc inlines + * + * Gcc consistently defines the CPU as __cpu__. + * Other compilers use __cpu or __cpu__ so we test for both. */ /* *************** *** 95,101 **** --- 96,105 ---- #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) { --- 118,129 ---- /* 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) --- 138,151 ---- 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) --- 166,175 ---- /* * 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) --- 195,204 ---- /* * 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 **** --- 222,231 ---- #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 **** --- 242,252 ---- #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 **** --- 282,291 ---- #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 **** --- 307,316 ---- #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) --- 324,338 ---- #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) --- 350,363 ---- 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) --- 371,405 ---- 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__) && !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) /* SCO cc only defines 'i386' */ ! ! #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 --- 414,452 ---- popl %ebx } ! #endif /* 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__) || 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__) || 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 \ {\ --- 456,462 ---- */ #if defined(__GNUC__) ! #define TAS(lock) tas(lock) #define S_UNLOCK(lock) \ do \ {\ *************** *** 435,444 **** #endif /* defined(__GNUC__) */ ! #endif /* __alpha */ ! #if defined(__hppa) /* * HP's PA-RISC * --- 507,516 ---- #endif /* defined(__GNUC__) */ ! #endif /* __alpha__ */ ! #if defined(__hppa__) || defined(__hppa) /* * HP's PA-RISC * *************** *** 449,454 **** --- 521,531 ---- * 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 **** --- 543,551 ---- /* * 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 =\ *************** *** 477,483 **** #endif /* __QNX__ and __WATCOMC__*/ ! #if defined(__sgi) /* * SGI IRIX 5 * slock_t is defined as a unsigned long. We use the standard SGI --- 557,563 ---- #endif /* __QNX__ and __WATCOMC__*/ ! #if defined(__sgi__) || defined(__sgi) /* * SGI IRIX 5 * slock_t is defined as a unsigned long. We use the standard SGI *************** *** 490,495 **** --- 570,579 ---- * 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 **** --- 588,598 ---- * 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) *************** *** 511,522 **** #endif /* sinix */ ! #if defined(_AIX) /* * AIX (POWER) * * Note that slock_t on POWER/POWER2/PowerPC is int instead of char */ #define TAS(lock) _check_lock(lock, 0, 1) #define S_UNLOCK(lock) _clear_lock(lock, 0) #endif /* _AIX */ --- 600,615 ---- #endif /* sinix */ ! #if defined(_AIX) || defined(__AIX__) || defined(__AIX) /* * AIX (POWER) * * 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 **** --- 621,629 ---- * 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 --- 633,643 ---- ! #ifndef HAS_TEST_AND_SET ! ! #ifdef HAVE_SPINLOCKS ! #error This platform does not support native spinlocks. To continue the compile, rerun configure using --without-spinlocks. However, performance will be poor. 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 */ --- 656,662 ---- #define S_INIT_LOCK(lock) s_init_lock_sema(lock) #define TAS(lock) tas_sema(lock) ! #endif
pgsql-patches by date: