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

MySQL数据库

开发平台:

Visual C++

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