aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/storage/lmgr/s_lock.c30
-rw-r--r--src/include/storage/s_lock.h44
2 files changed, 37 insertions, 37 deletions
diff --git a/src/backend/storage/lmgr/s_lock.c b/src/backend/storage/lmgr/s_lock.c
index e12b683d98a..f57dd9a439e 100644
--- a/src/backend/storage/lmgr/s_lock.c
+++ b/src/backend/storage/lmgr/s_lock.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/storage/lmgr/s_lock.c,v 1.36 2005/07/30 03:07:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/storage/lmgr/s_lock.c,v 1.37 2005/08/25 17:17:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -172,34 +172,6 @@ _success: \n\
#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 */
-
-
#else /* not __GNUC__ */
/*
diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h
index 49bb9f64c21..579db815a4e 100644
--- a/src/include/storage/s_lock.h
+++ b/src/include/storage/s_lock.h
@@ -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.134 2005/03/10 21:41:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/storage/s_lock.h,v 1.135 2005/08/25 17:17:10 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -453,20 +453,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__)
#define HAS_TEST_AND_SET
-typedef unsigned int slock_t;
+typedef unsigned char slock_t;
#endif