aboutsummaryrefslogtreecommitdiff
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);
}