about summary refs log tree commit diff
path: root/db2/os/os_spin.c
diff options
context:
space:
mode:
Diffstat (limited to 'db2/os/os_spin.c')
-rw-r--r--db2/os/os_spin.c92
1 files changed, 69 insertions, 23 deletions
diff --git a/db2/os/os_spin.c b/db2/os/os_spin.c
index 2fd21d018b..cbde58894a 100644
--- a/db2/os/os_spin.c
+++ b/db2/os/os_spin.c
@@ -8,17 +8,50 @@
 #include "config.h"
 
 #ifndef lint
-static const char sccsid[] = "@(#)os_spin.c	10.7 (Sleepycat) 5/20/98";
+static const char sccsid[] = "@(#)os_spin.c	10.10 (Sleepycat) 10/12/98";
 #endif /* not lint */
 
 #ifndef NO_SYSTEM_INCLUDES
 #include <sys/types.h>
+#if defined(HAVE_PSTAT_GETDYNAMIC)
+#include <sys/pstat.h>
+#endif
 
 #include <limits.h>
 #include <unistd.h>
 #endif
 
 #include "db_int.h"
+#include "os_jump.h"
+
+#if defined(HAVE_PSTAT_GETDYNAMIC)
+/*
+ * __os_pstat_getdynamic --
+ *	HP/UX.
+ */
+static int
+__os_pstat_getdynamic()
+{
+	struct pst_dynamic psd;
+
+	return (pstat_getdynamic(&psd,
+	    sizeof(psd), (size_t)1, 0) == -1 ? 1 : psd.psd_proc_cnt);
+}
+#endif
+
+#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
+/*
+ * __os_sysconf --
+ *	Solaris, Linux.
+ */
+static int
+__os_sysconf(void)
+{
+	int nproc;
+
+	return ((nproc = sysconf(_SC_NPROCESSORS_ONLN)) > 1 ? nproc : 1);
+}
+#endif
 
 /*
  * __os_spin --
@@ -29,33 +62,46 @@ static const char sccsid[] = "@(#)os_spin.c	10.7 (Sleepycat) 5/20/98";
 int
 __os_spin()
 {
-	static long sys_val;
-
-	/* If the application specified the spins, use its value. */
+	/*
+	 * If the application specified a value or we've already figured it
+	 * out, return it.
+	 *
+	 * XXX
+	 * We don't want to repeatedly call the underlying function because
+	 * it can be expensive (e.g., requiring multiple filesystem accesses
+	 * under Debian Linux).
+	 */
 	if (DB_GLOBAL(db_tsl_spins) != 0)
 		return (DB_GLOBAL(db_tsl_spins));
 
-	/* If we've already figured this out, return the value. */
-	if (sys_val != 0)
-		return (sys_val);
+	DB_GLOBAL(db_tsl_spins) = 1;
+#if defined(HAVE_PSTAT_GETDYNAMIC)
+	DB_GLOBAL(db_tsl_spins) = __os_pstat_getdynamic();
+#endif
+#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
+	DB_GLOBAL(db_tsl_spins) = __os_sysconf();
+#endif
 
 	/*
-	 * XXX
-	 * Solaris and Linux use _SC_NPROCESSORS_ONLN to return the number of
-	 * online processors.  We don't want to repeatedly call sysconf because
-	 * it's quite expensive (requiring multiple filesystem accesses) under
-	 * Debian Linux.
-	 *
-	 * Spin 50 times per processor -- we have anecdotal evidence that this
+	 * Spin 50 times per processor, we have anecdotal evidence that this
 	 * is a reasonable value.
 	 */
-#if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
-	if ((sys_val = sysconf(_SC_NPROCESSORS_ONLN)) > 1)
-		sys_val *= 50;
-	else
-		sys_val = 1;
-#else
-	sys_val = 1;
-#endif
-	return (sys_val);
+	DB_GLOBAL(db_tsl_spins) *= 50;
+
+	return (DB_GLOBAL(db_tsl_spins));
+}
+
+/*
+ * __os_yield --
+ *	Yield the processor.
+ *
+ * PUBLIC: void __os_yield __P((u_long));
+ */
+void
+__os_yield(usecs)
+	u_long usecs;
+{
+	if (__db_jump.j_yield != NULL && __db_jump.j_yield() == 0)
+		return;
+	__os_sleep(0, usecs);
 }