os_spin.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_spin.c,v 11.5 2000/03/30 01:46:42 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #if defined(HAVE_PSTAT_GETDYNAMIC)
  14. #include <sys/pstat.h>
  15. #endif
  16. #include <limits.h>
  17. #include <unistd.h>
  18. #endif
  19. #include "db_int.h"
  20. #include "os_jump.h"
  21. #if defined(HAVE_PSTAT_GETDYNAMIC)
  22. /*
  23.  * __os_pstat_getdynamic --
  24.  * HP/UX.
  25.  */
  26. static int
  27. __os_pstat_getdynamic()
  28. {
  29. struct pst_dynamic psd;
  30. return (pstat_getdynamic(&psd,
  31.     sizeof(psd), (size_t)1, 0) == -1 ? 1 : psd.psd_proc_cnt);
  32. }
  33. #endif
  34. #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
  35. /*
  36.  * __os_sysconf --
  37.  * Solaris, Linux.
  38.  */
  39. static int
  40. __os_sysconf()
  41. {
  42. int nproc;
  43. return ((nproc = sysconf(_SC_NPROCESSORS_ONLN)) > 1 ? nproc : 1);
  44. }
  45. #endif
  46. /*
  47.  * __os_spin --
  48.  * Return the number of default spins before blocking.
  49.  *
  50.  * PUBLIC: int __os_spin __P((void));
  51.  */
  52. int
  53. __os_spin()
  54. {
  55. /*
  56.  * If the application specified a value or we've already figured it
  57.  * out, return it.
  58.  *
  59.  * XXX
  60.  * We don't want to repeatedly call the underlying function because
  61.  * it can be expensive (e.g., requiring multiple filesystem accesses
  62.  * under Debian Linux).
  63.  */
  64. if (DB_GLOBAL(db_tas_spins) != 0)
  65. return (DB_GLOBAL(db_tas_spins));
  66. DB_GLOBAL(db_tas_spins) = 1;
  67. #if defined(HAVE_PSTAT_GETDYNAMIC)
  68. DB_GLOBAL(db_tas_spins) = __os_pstat_getdynamic();
  69. #endif
  70. #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
  71. DB_GLOBAL(db_tas_spins) = __os_sysconf();
  72. #endif
  73. /*
  74.  * Spin 50 times per processor, we have anecdotal evidence that this
  75.  * is a reasonable value.
  76.  */
  77. if (DB_GLOBAL(db_tas_spins) != 1)
  78. DB_GLOBAL(db_tas_spins) *= 50;
  79. return (DB_GLOBAL(db_tas_spins));
  80. }
  81. /*
  82.  * __os_yield --
  83.  * Yield the processor.
  84.  *
  85.  * PUBLIC: void __os_yield __P((DB_ENV*, u_long));
  86.  */
  87. void
  88. __os_yield(dbenv, usecs)
  89. DB_ENV *dbenv;
  90. u_long usecs;
  91. {
  92. if (__db_jump.j_yield != NULL && __db_jump.j_yield() == 0)
  93. return;
  94. __os_sleep(dbenv, 0, usecs);
  95. }