--- db-3.1.17/dist/aclocal/mutex.m4.jbj	Sat Apr 29 15:03:49 2000
+++ db-3.1.17/dist/aclocal/mutex.m4	Sat Sep 30 01:03:03 2000
@@ -307,6 +307,42 @@
 }], [db_cv_mutex="ia64/gcc-assembly"])
 fi
 
+dnl alphalinux/gcc: Linux
+if test "$db_cv_mutex" = no; then
+AC_TRY_RUN([main(){
+#if defined(__alpha__)
+#if defined(__linux__)
+	exit(0);
+#endif
+#endif
+	exit(1);
+}], [db_cv_mutex="alphalinux/gcc-assembly"])
+fi
+
+dnl sparc32linux/gcc: Linux
+if test "$db_cv_mutex" = no; then
+AC_TRY_RUN([main(){
+#if defined(__sparc__) && !defined(__arch64__)
+#if defined(__linux__)
+	exit(0);
+#endif
+#endif
+	exit(1);
+}], [db_cv_mutex="sparc32linux/gcc-assembly"])
+fi
+
+dnl sparc64linux/gcc: Linux
+if test "$db_cv_mutex" = no; then
+AC_TRY_RUN([main(){
+#if defined(__sparc__) && defined(__arch64__)
+#if defined(__linux__)
+	exit(0);
+#endif
+#endif
+	exit(1);
+}], [db_cv_mutex="sparc64linux/gcc-assembly"])
+fi
+
 dnl: uts/cc: UTS
 if test "$db_cv_mutex" = no; then
 AC_TRY_RUN([main(){
@@ -370,5 +406,11 @@
 			AC_DEFINE(HAVE_MUTEX_UTS_CC_ASSEMBLY);;
 x86/gcc-assembly)	ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
 			AC_DEFINE(HAVE_MUTEX_X86_GCC_ASSEMBLY);;
+alphalinux/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
+			AC_DEFINE(HAVE_MUTEX_ALPHA_LINUX_ASSEMBLY);;
+sparc32linux/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
+			AC_DEFINE(HAVE_MUTEX_SPARC32_LINUX_ASSEMBLY);;
+sparc64linux/gcc-assembly) ADDITIONAL_OBJS="mut_tas${o} $ADDITIONAL_OBJS"
+			AC_DEFINE(HAVE_MUTEX_SPARC64_LINUX_ASSEMBLY);;
 esac
 ])dnl
--- db-3.1.17/dist/acconfig.h.jbj	Tue May 16 11:40:44 2000
+++ db-3.1.17/dist/acconfig.h	Sat Sep 30 01:03:03 2000
@@ -48,6 +48,9 @@
 #undef HAVE_MUTEX_WIN16
 #undef HAVE_MUTEX_WIN32
 #undef HAVE_MUTEX_X86_GCC_ASSEMBLY
+#undef HAVE_MUTEX_ALPHA_LINUX_ASSEMBLY
+#undef HAVE_MUTEX_SPARC32_LINUX_ASSEMBLY
+#undef HAVE_MUTEX_SPARC64_LINUX_ASSEMBLY
 
 /* Define if building RPC client/server. */
 #undef HAVE_RPC
--- db-3.1.17/include/mutex.h.jbj	Sat Sep 30 01:10:35 2000
+++ db-3.1.17/include/mutex.h	Sat Sep 30 01:15:44 2000
@@ -341,6 +341,29 @@
 typedef unsigned char tsl_t;
 #endif
 
+/*********************************************************************
+ * alphalinux/gcc assembly.
+ *********************************************************************/
+#ifdef HAVE_MUTEX_ALPHA_LINUX_ASSEMBLY
+typedef unsigned long int tsl_t;
+
+#define	MUTEX_ALIGN	8
+#endif
+
+/*********************************************************************
+ * sparc32linux/gcc assembly.
+ *********************************************************************/
+#ifdef HAVE_MUTEX_SPARC32_LINUX_ASSEMBLY
+typedef unsigned char tsl_t;
+#endif
+
+/*********************************************************************
+ * sparc64linux/gcc assembly.
+ *********************************************************************/
+#ifdef HAVE_MUTEX_SPARC64_LINUX_ASSEMBLY
+typedef unsigned char tsl_t;
+#endif
+
 /*
  * Mutex alignment defaults to one byte.
  *
--- db-3.1.17/mutex/sparc32linux.gcc.jbj	Sat Sep 30 01:03:03 2000
+++ db-3.1.17/mutex/sparc32linux.gcc	Sat Sep 30 01:03:03 2000
@@ -0,0 +1,30 @@
+
+/*
+ * The ldstub instruction takes the location specified by its first argument
+ * (a register containing a memory address) and loads its contents into its
+ * second argument (a register) and atomically sets the contents the location
+ * specified by its first argument to a byte of 1s.  (The value in the second
+ * argument is never read, but only overwritten.)
+ *
+ * The stbar is needed for v8, and is implemented as membar #sync on v9,
+ + so is functional there as well.  For v7, stbar may generate an illegal
+ + instruction and we have no way to tell what we're running on.  Some
+ + operating systems notice and skip this instruction in the fault handler.
+ *
+ * For gcc/sparc, 0 is clear, 1 is set.
+ *
+ * Adapted from glibc-2.1.94 pthreads/sysdeps/sparc/sparc32/pspinlock.c.
+ */
+#define	MUTEX_SET(tsl) ({						\
+	register tsl_t *__l = (tsl);					\
+	register tsl_t __r;						\
+	__asm__ volatile						\
+	    ("ldstub [%1], %0"						\
+	    : "=r" (__r)						\
+	    : "r" (__l)							\
+	    : "memory");						\
+	!__r;								\
+})
+
+#define	MUTEX_UNSET(tsl)	(*(tsl) = 0)
+#define	MUTEX_INIT(tsl)		MUTEX_UNSET(tsl)
--- db-3.1.17/mutex/mut_tas.c.jbj	Wed May 31 17:38:14 2000
+++ db-3.1.17/mutex/mut_tas.c	Sat Sep 30 01:03:03 2000
@@ -43,6 +43,15 @@
 #ifdef HAVE_MUTEX_X86_GCC_ASSEMBLY
 #include "x86.gcc"
 #endif
+#ifdef HAVE_MUTEX_ALPHA_LINUX_ASSEMBLY
+#include "alphalinux.gcc"
+#endif
+#ifdef HAVE_MUTEX_SPARC32_LINUX_ASSEMBLY
+#include "sparc32linux.gcc"
+#endif
+#ifdef HAVE_MUTEX_SPARC64_LINUX_ASSEMBLY
+#include "sparc64linux.gcc"
+#endif
 
 #ifdef DIAGNOSTIC
 #undef	MSG1
--- db-3.1.17/mutex/sparc64linux.gcc.jbj	Sat Sep 30 01:03:03 2000
+++ db-3.1.17/mutex/sparc64linux.gcc	Sat Sep 30 01:03:03 2000
@@ -0,0 +1,33 @@
+
+/*
+ * $Id: db-3.1.17-jbj.patch,v 1.1 2000/11/08 14:30:00 bryan Exp $
+ *
+ * The ldstub instruction takes the location specified by its first argument
+ * (a register containing a memory address) and loads its contents into its
+ * second argument (a register) and atomically sets the contents the location
+ * specified by its first argument to a byte of 1s.  (The value in the second
+ * argument is never read, but only overwritten.)
+ *
+ * The stbar is needed for v8, and is implemented as membar #sync on v9,
+ + so is functional there as well.  For v7, stbar may generate an illegal
+ + instruction and we have no way to tell what we're running on.  Some
+ + operating systems notice and skip this instruction in the fault handler.
+ *
+ * For gcc/sparc, 0 is clear, 1 is set.
+ *
+ * Adapted from glibc-2.1.94 pthreads/sysdeps/sparc/sparc64/pspinlock.c.
+ */
+#define	MUTEX_SET(tsl) ({						\
+	register tsl_t *__l = (tsl);					\
+	register tsl_t __r;						\
+	__asm__ volatile						\
+	    ("ldstub [%1], %0\n"					\
+	    "membar #StoreLoad | #StoreStore"				\
+	    : "=r" (__r)						\
+	    : "r" (__l)							\
+	    : "memory");						\
+	!__r;								\
+})
+
+#define	MUTEX_UNSET(tsl)	(*(tsl) = 0)
+#define	MUTEX_INIT(tsl)		MUTEX_UNSET(tsl)
--- db-3.1.17/mutex/alphalinux.gcc.jbj	Sat Sep 30 01:03:03 2000
+++ db-3.1.17/mutex/alphalinux.gcc	Sat Sep 30 01:03:03 2000
@@ -0,0 +1,46 @@
+ * For gcc/alpha.
+ *
+ * Should return 0 if could not acquire the lock, 1 if lock was acquired
+ * properly.
+ */
+#ifdef __GNUC__
+static inline int
+MUTEX_SET(tsl_t *tsl) {
+	register tsl_t *__l = tsl;
+	unsigned long int __r;
+	unsigned long int temp;
+	__asm__ volatile(
+		("1:	ldl_l	%0,%1\n"
+		"	and	%0,%3,%2\n"
+		"	bne	%2,2f\n"
+		"	xor	%0,%3,%0\n"
+		"	stl_c	%0,%1\n"
+		"	beq	%0,3f\n"
+		"	mb\n"
+		"2:\n"
+		".subsection 2\n"
+		"3:	br	1b\n"
+		".previous"
+		: "=&r" (temp), "=m" (*__l), "=&r" (__r)
+		: "Ir" (1UL), "m" (*__l));
+	return __r;
+}
+
+/*
+ * Unset mutex. Judging by Alpha Architecture Handbook, the mb instruction
+ * might be necessary before unlocking
+ */
+static inline int
+MUTEX_UNSET(tsl_t *tsl) {
+	asm volatile("	mb\n");
+	return *tsl = 0;
+}
+#endif
+
+#ifdef __DECC
+#include <alpha/builtins.h>
+#define	MUTEX_SET(tsl)		(__LOCK_LONG_RETRY((tsl), 1) != 0)
+#define	MUTEX_UNSET(tsl)	(*(tsl) = 0)
+#endif
+
+#define	MUTEX_INIT(tsl)		MUTEX_UNSET(tsl)
