about summary refs log tree commit diff
path: root/db2/mutex/mutex.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/mutex/mutex.c')
-rw-r--r--db2/mutex/mutex.c49
1 files changed, 30 insertions, 19 deletions
diff --git a/db2/mutex/mutex.c b/db2/mutex/mutex.c
index de0d0e23fe..acc6aa07c9 100644
--- a/db2/mutex/mutex.c
+++ b/db2/mutex/mutex.c
@@ -8,7 +8,7 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)mutex.c	10.48 (Sleepycat) 5/23/98";
+static const char sccsid[] = "@(#)mutex.c	10.52 (Sleepycat) 11/8/98";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
@@ -37,9 +37,12 @@ static const char sccsid[] = "@(#)mutex.c	10.48 (Sleepycat) 5/23/98";
 
 #if defined(HAVE_FUNC_MSEM)
 /*
- * XXX
- * Should we not use MSEM_IF_NOWAIT and let the system block for us?
- * I've no idea if this will block all threads in the process or not.
+ * !!!
+ * Do not remove the MSEM_IF_NOWAIT flag.  The problem is that if a single
+ * process makes two msem_lock() calls in a row, the second one returns an
+ * error.  We depend on the fact that we can lock against ourselves in the
+ * locking subsystem, where we set up a mutex so that we can block ourselves.
+ * Tested on OSF1 v4.0.
  */
 #define	TSL_INIT(x)	(msem_init(x, MSEM_UNLOCKED) == NULL)
 #define	TSL_INIT_ERROR	1
@@ -74,6 +77,17 @@ static const char sccsid[] = "@(#)mutex.c	10.48 (Sleepycat) 5/23/98";
 #define	TSL_UNSET(x)	_lock_clear(x)
 #endif
 
+#ifdef HAVE_FUNC_VMS
+#include <builtins.h>
+#ifdef __ALPHA
+#define	TSL_SET(tsl)	(!__TESTBITSSI(tsl, 0))
+#else /* __VAX */
+#define	TSL_SET(tsl)	(!(int)_BBSSI(0, tsl))
+#endif
+#define	TSL_UNSET(tsl) 	(*(tsl) = 0)
+#define	TSL_INIT(tsl)	TSL_UNSET(tsl)
+#endif
+
 #ifdef HAVE_ASSEM_PARISC_GCC
 #include "parisc.gcc"
 #endif
@@ -181,7 +195,7 @@ __db_mutex_lock(mp, fd)
 #ifdef HAVE_SPINLOCKS
 	COMPQUIET(fd, 0);
 
-	for (usecs = MS(10);;) {
+	for (usecs = MS(1);;) {
 		/* Try and acquire the uncontested resource lock for N spins. */
 		for (nspins = mp->spins; nspins > 0; --nspins)
 			if (TSL_SET(&mp->tsl_resource)) {
@@ -193,19 +207,17 @@ __db_mutex_lock(mp, fd)
 				}
 				mp->pid = getpid();
 #endif
-				if (usecs == MS(10))
+				if (usecs == MS(1))
 					++mp->mutex_set_nowait;
 				else
 					++mp->mutex_set_wait;
 				return (0);
 			}
 
-		/* Yield the processor; wait 10ms initially, up to 1 second. */
-		if (__db_yield == NULL || __db_yield() != 0) {
-			(void)__db_sleep(0, usecs);
-			if ((usecs <<= 1) > SECOND)
-				usecs = SECOND;
-		}
+		/* Yield the processor; wait 1ms initially, up to 1 second. */
+		__os_yield(usecs);
+		if ((usecs <<= 1) > SECOND)
+			usecs = SECOND;
 	}
 	/* NOTREACHED */
 
@@ -218,15 +230,14 @@ __db_mutex_lock(mp, fd)
 
 	for (locked = 0, mypid = getpid();;) {
 		/*
-		 * Wait for the lock to become available; wait 10ms initially,
+		 * Wait for the lock to become available; wait 1ms initially,
 		 * up to 1 second.
 		 */
-		for (usecs = MS(10); mp->pid != 0;)
-			if (__db_yield == NULL || __db_yield() != 0) {
-				(void)__db_sleep(0, usecs);
-				if ((usecs <<= 1) > SECOND)
-					usecs = SECOND;
-			}
+		for (usecs = MS(1); mp->pid != 0;) {
+			__os_yield(usecs);
+			if ((usecs <<= 1) > SECOND)
+				usecs = SECOND;
+		}
 
 		/* Acquire an exclusive kernel lock. */
 		k_lock.l_type = F_WRLCK;