]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Back-port recent MIPS and M68K spinlock improvements to 8.0 branch.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 26 Aug 2005 14:48:13 +0000 (14:48 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 26 Aug 2005 14:48:13 +0000 (14:48 +0000)
src/backend/storage/lmgr/s_lock.c
src/include/storage/s_lock.h

index 443837a49136e77fa9081af8940dd30123ef3fd9..398dbd9919bf46d367837b5f1a8b45ce23901afb 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/storage/lmgr/s_lock.c,v 1.35 2004/12/31 22:01:05 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/backend/storage/lmgr/s_lock.c,v 1.35.4.1 2005/08/26 14:48:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -135,7 +135,12 @@ s_lock(volatile slock_t *lock, const char *file, int line)
  */
 
 
-#if defined(__m68k__)
+/*
+ * Note: all the if-tests here probably ought to be testing gcc version
+ * rather than platform, but I don't have adequate info to know what to
+ * write.  Ideally we'd flush all this in favor of the inline version.
+ */
+#if defined(__m68k__) && !defined(__linux__)
 /* really means: extern int tas(slock_t* **lock); */
 static void
 tas_dummy()
@@ -169,35 +174,7 @@ _success:                                          \n\
 #endif   /* __NetBSD__ && __ELF__ */
 );
 }
-#endif   /* __m68k__ */
-
-
-#if defined(__mips__) && !defined(__sgi)
-static void
-tas_dummy()
-{
-       __asm__         __volatile__(
-                                                                                "\
-.global        tas                                             \n\
-tas:                                                   \n\
-                       .frame  $sp, 0, $31     \n\
-                       .set push               \n\
-                       .set mips2              \n\
-                       ll              $14, 0($4)      \n\
-                       or              $15, $14, 1     \n\
-                       sc              $15, 0($4)      \n\
-                       .set pop                        \n\
-                       beq             $15, 0, fail\n\
-                       bne             $14, 0, fail\n\
-                       li              $2, 0           \n\
-                       .livereg 0x2000FF0E,0x00000FFF  \n\
-                       j               $31                     \n\
-fail:                                                  \n\
-                       li              $2, 1           \n\
-                       j       $31                     \n\
-");
-}
-#endif   /* __mips__ && !__sgi */
+#endif   /* __m68k__ && !__linux__ */
 
 
 #else                                                  /* not __GNUC__ */
index 1fa644cb09374cb63693e033f8bad29a9566297e..2fd7988e5e5647904796988294ab82c18d9742f0 100644 (file)
@@ -66,7 +66,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *       $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.133 2004/12/31 22:03:42 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.133.4.1 2005/08/26 14:48:13 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -313,7 +313,7 @@ do \
 #endif /* powerpc */
 
 
-#if defined(__mc68000__) && defined(__linux__)
+#if (defined(__mc68000__) || defined(__m68k__)) && defined(__linux__)
 #define HAS_TEST_AND_SET
 
 typedef unsigned char slock_t;
@@ -335,7 +335,7 @@ tas(volatile slock_t *lock)
        return rv;
 }
 
-#endif  /* defined(__mc68000__) && defined(__linux__) */
+#endif  /* (__mc68000__ || __m68k__) && __linux__ */
 
 
 #if defined(__vax__)
@@ -438,20 +438,48 @@ do \
 #endif /* __alpha || __alpha__ */
 
 
-/* These live in s_lock.c, but only for gcc */
+#if defined(__mips__) && !defined(__sgi)
+/* Note: on SGI we use the OS' mutex ABI, see below */
+#define HAS_TEST_AND_SET
 
+typedef unsigned int slock_t;
 
-#if defined(__m68k__)
-#define HAS_TEST_AND_SET
+#define TAS(lock) tas(lock)
 
-typedef unsigned char slock_t;
-#endif
+static __inline__ int
+tas(volatile slock_t *lock)
+{
+       register volatile slock_t *__l = lock;
+       register int __r;
 
+       __asm__ __volatile__(
+               "       .set push           \n"
+               "       .set mips2          \n"
+               "       .set noreorder      \n"
+               "       .set nomacro        \n"
+               "1:     ll      %0, %1      \n"
+               "       bne     %0, $0, 1f  \n"
+               "        xori   %0, 1       \n"
+               "       sc      %0, %1      \n"
+               "       beq     %0, $0, 1b  \n"
+               "        sync               \n"
+               "1:     .set pop              "
+:              "=&r" (__r), "+R" (*__l)
+:
+:              "memory", "cc");
+       return __r;
+}
 
-#if defined(__mips__) && !defined(__sgi)
+#endif /* __mips__ && !__sgi */
+
+
+/* These live in s_lock.c, but only for gcc */
+
+
+#if defined(__m68k__) && !defined(__linux__)
 #define HAS_TEST_AND_SET
 
-typedef unsigned int slock_t;
+typedef unsigned char slock_t;
 #endif