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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: os_region.c,v 11.15 2002/07/12 18:56:51 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #endif
  14. #include "db_int.h"
  15. /*
  16.  * __os_r_attach --
  17.  * Attach to a shared memory region.
  18.  *
  19.  * PUBLIC: int __os_r_attach __P((DB_ENV *, REGINFO *, REGION *));
  20.  */
  21. int
  22. __os_r_attach(dbenv, infop, rp)
  23. DB_ENV *dbenv;
  24. REGINFO *infop;
  25. REGION *rp;
  26. {
  27. int ret;
  28. /* Round off the requested size for the underlying VM. */
  29. OS_VMROUNDOFF(rp->size);
  30. #ifdef DB_REGIONSIZE_MAX
  31. /* Some architectures have hard limits on the maximum region size. */
  32. if (rp->size > DB_REGIONSIZE_MAX) {
  33. __db_err(dbenv, "region size %lu is too large; maximum is %lu",
  34.     (u_long)rp->size, (u_long)DB_REGIONSIZE_MAX);
  35. return (EINVAL);
  36. }
  37. #endif
  38. /*
  39.  * If a region is private, malloc the memory.
  40.  *
  41.  * !!!
  42.  * If this fails because the region is too large to malloc, mmap(2)
  43.  * using the MAP_ANON or MAP_ANONYMOUS flags would be an alternative.
  44.  * I don't know of any architectures (yet!) where malloc is a problem.
  45.  */
  46. if (F_ISSET(dbenv, DB_ENV_PRIVATE)) {
  47. #if defined(MUTEX_NO_MALLOC_LOCKS)
  48. /*
  49.  * !!!
  50.  * There exist spinlocks that don't work in malloc memory, e.g.,
  51.  * the HP/UX msemaphore interface.  If we don't have locks that
  52.  * will work in malloc memory, we better not be private or not
  53.  * be threaded.
  54.  */
  55. if (F_ISSET(dbenv, DB_ENV_THREAD)) {
  56. __db_err(dbenv, "%s",
  57.     "architecture does not support locks inside process-local (malloc) memory");
  58. __db_err(dbenv, "%s",
  59.     "application may not specify both DB_PRIVATE and DB_THREAD");
  60. return (EINVAL);
  61. }
  62. #endif
  63. if ((ret =
  64.     __os_malloc(dbenv, rp->size, &infop->addr)) != 0)
  65. return (ret);
  66. #if defined(UMRW) && !defined(DIAGNOSTIC)
  67. memset(infop->addr, CLEAR_BYTE, rp->size);
  68. #endif
  69. return (0);
  70. }
  71. /* If the user replaced the map call, call through their interface. */
  72. if (DB_GLOBAL(j_map) != NULL)
  73. return (DB_GLOBAL(j_map)(infop->name,
  74.     rp->size, 1, 0, &infop->addr));
  75. return (__os_r_sysattach(dbenv, infop, rp));
  76. }
  77. /*
  78.  * __os_r_detach --
  79.  * Detach from a shared memory region.
  80.  *
  81.  * PUBLIC: int __os_r_detach __P((DB_ENV *, REGINFO *, int));
  82.  */
  83. int
  84. __os_r_detach(dbenv, infop, destroy)
  85. DB_ENV *dbenv;
  86. REGINFO *infop;
  87. int destroy;
  88. {
  89. REGION *rp;
  90. rp = infop->rp;
  91. /* If a region is private, free the memory. */
  92. if (F_ISSET(dbenv, DB_ENV_PRIVATE)) {
  93. __os_free(dbenv, infop->addr);
  94. return (0);
  95. }
  96. /* If the user replaced the map call, call through their interface. */
  97. if (DB_GLOBAL(j_unmap) != NULL)
  98. return (DB_GLOBAL(j_unmap)(infop->addr, rp->size));
  99. return (__os_r_sysdetach(dbenv, infop, destroy));
  100. }