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
Re: Reorganization of spinlock defines Re: Reorganization of spinlock defines Re: Reorganization of spinlock defines |
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: