os_spin.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1997-2002
  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.13 2002/08/07 02:02:07 bostic 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. #if defined(HAVE_PSTAT_GETDYNAMIC)
  21. static int __os_pstat_getdynamic __P((void));
  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. static int __os_sysconf __P((void));
  36. /*
  37.  * __os_sysconf --
  38.  * Solaris, Linux.
  39.  */
  40. static int
  41. __os_sysconf()
  42. {
  43. long nproc;
  44. return ((nproc = sysconf(_SC_NPROCESSORS_ONLN)) > 1 ? (int)nproc : 1);
  45. }
  46. #endif
  47. /*
  48.  * __os_spin --
  49.  * Return the number of default spins before blocking.
  50.  *
  51.  * PUBLIC: int __os_spin __P((DB_ENV *));
  52.  */
  53. int
  54. __os_spin(dbenv)
  55. DB_ENV *dbenv;
  56. {
  57. /*
  58.  * If the application specified a value or we've already figured it
  59.  * out, return it.
  60.  *
  61.  * XXX
  62.  * We don't want to repeatedly call the underlying function because
  63.  * it can be expensive (e.g., requiring multiple filesystem accesses
  64.  * under Debian Linux).
  65.  */
  66. if (dbenv->tas_spins != 0)
  67. return (dbenv->tas_spins);
  68. dbenv->tas_spins = 1;
  69. #if defined(HAVE_PSTAT_GETDYNAMIC)
  70. dbenv->tas_spins = __os_pstat_getdynamic();
  71. #endif
  72. #if defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)
  73. dbenv->tas_spins = __os_sysconf();
  74. #endif
  75. /*
  76.  * Spin 50 times per processor, we have anecdotal evidence that this
  77.  * is a reasonable value.
  78.  */
  79. if (dbenv->tas_spins != 1)
  80. dbenv->tas_spins *= 50;
  81. return (dbenv->tas_spins);
  82. }
  83. /*
  84.  * __os_yield --
  85.  * Yield the processor.
  86.  *
  87.  * PUBLIC: void __os_yield __P((DB_ENV*, u_long));
  88.  */
  89. void
  90. __os_yield(dbenv, usecs)
  91. DB_ENV *dbenv;
  92. u_long usecs;
  93. {
  94. if (DB_GLOBAL(j_yield) != NULL && DB_GLOBAL(j_yield)() == 0)
  95. return;
  96. (void)__os_sleep(dbenv, 0, usecs);
  97. }