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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The interface to the operating system
  3. shared memory primitives
  4. (c) 1995 Innobase Oy
  5. Created 9/23/1995 Heikki Tuuri
  6. *******************************************************/
  7. #include "os0shm.h"
  8. #ifdef UNIV_NONINL
  9. #include "os0shm.ic"
  10. #endif
  11. #ifdef __WIN__
  12. #include "windows.h"
  13. typedef HANDLE os_shm_t;
  14. #endif
  15. /********************************************************************
  16. Creates an area of shared memory. It can be named so that
  17. different processes may access it in the same computer.
  18. If an area with the same name already exists, returns
  19. a handle to that area (where the size of the area is
  20. not changed even if this call requests a different size).
  21. To use the area, it first has to be mapped to the process
  22. address space by os_shm_map. */
  23. os_shm_t
  24. os_shm_create(
  25. /*==========*/
  26. /* out, own: handle to the shared
  27. memory area, NULL if error */
  28. ulint size, /* in: area size < 4 GB */
  29. char* name) /* in: name of the area as a null-terminated
  30. string */
  31. {
  32. #ifdef __WIN__
  33. os_shm_t shm;
  34. ut_a(name);
  35. ut_a(size > 0);
  36. ut_a(size < 0xFFFFFFFF);
  37. /* In Windows NT shared memory is created as a memory mapped
  38. file */
  39. shm = CreateFileMapping((HANDLE)0xFFFFFFFF, /* use operating system
  40.     swap file as the backing
  41.     file */
  42. NULL,     /* default security
  43.     descriptor */
  44. PAGE_READWRITE,     /* allow reading and
  45.     writing */
  46. 0,     /* size must be less
  47.     than 4 GB */
  48. (DWORD)size,
  49. name);
  50. return(shm);
  51. #else
  52. UT_NOT_USED(size);
  53. UT_NOT_USED(name);
  54. return(NULL);
  55. #endif
  56. }
  57. /***************************************************************************
  58. Frees a shared memory area. The area can be freed only after it
  59. has been unmapped in all the processes where it was mapped. */
  60. ibool
  61. os_shm_free(
  62. /*========*/
  63. /* out: TRUE if success */
  64. os_shm_t shm) /* in, own: handle to a shared memory area */
  65. {
  66. #ifdef __WIN__
  67. BOOL ret;
  68. ut_a(shm);
  69. ret = CloseHandle(shm);
  70. if (ret) {
  71. return(TRUE);
  72. } else {
  73. return(FALSE);
  74. }
  75. #else
  76. UT_NOT_USED(shm);
  77. return(FALSE);
  78. #endif
  79. }
  80. /***************************************************************************
  81. Maps a shared memory area in the address space of a process. */
  82. void*
  83. os_shm_map(
  84. /*=======*/
  85. /* out: address of the area, NULL if error */
  86. os_shm_t shm) /* in: handle to a shared memory area */
  87. {
  88. #ifdef __WIN__
  89. void* mem;
  90. ut_a(shm);
  91. mem = MapViewOfFile(shm,
  92.     FILE_MAP_ALL_ACCESS,  /* read and write access
  93.        allowed */
  94.     0,   /* map from start of */
  95.     0,   /* area */
  96.     0);   /* map the whole area */
  97. return(mem);
  98. #else
  99. UT_NOT_USED(shm);
  100. return(NULL);
  101. #endif
  102. }
  103. /***************************************************************************
  104. Unmaps a shared memory area from the address space of a process. */
  105. ibool
  106. os_shm_unmap(
  107. /*=========*/
  108. /* out: TRUE if succeed */
  109. void* addr) /* in: address of the area */
  110. {
  111. #ifdef __WIN__
  112. BOOL ret;
  113. ut_a(addr);
  114. ret = UnmapViewOfFile(addr);
  115. if (ret) {
  116. return(TRUE);
  117. } else {
  118. return(FALSE);
  119. }
  120. #else
  121. UT_NOT_USED(addr);
  122. return(FALSE);
  123. #endif
  124. }