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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. A fast mutex for interprocess synchronization.
  3. mutex_t can be used only within single process,
  4. but ip_mutex_t also between processes.
  5. (c) 1995 Innobase Oy
  6. Created 9/30/1995 Heikki Tuuri
  7. *******************************************************/
  8. #include "sync0ipm.h"
  9. #ifdef UNIV_NONINL
  10. #include "sync0ipm.ic"
  11. #endif
  12. #include "mem0mem.h"
  13. /* The performance of the ip mutex in NT depends on how often
  14. a thread has to suspend itself waiting for the ip mutex
  15. to become free. The following variable counts system calls
  16. involved. */
  17. ulint ip_mutex_system_call_count = 0;
  18. /**********************************************************************
  19. Creates, or rather, initializes
  20. an ip mutex object in a specified shared memory location (which must be
  21. appropriately aligned). The ip mutex is initialized in the reset state.
  22. NOTE! Explicit destroying of the ip mutex with ip_mutex_free
  23. is not recommended
  24. as the mutex resides in shared memory and we cannot make sure that
  25. no process is currently accessing it. Therefore just use
  26. ip_mutex_close to free the operating system event and mutex. */
  27. ulint
  28. ip_mutex_create(
  29. /*============*/
  30. /* out: 0 if succeed */
  31. ip_mutex_t* ip_mutex, /* in: pointer to shared memory */
  32. char* name, /* in: name of the ip mutex */
  33. ip_mutex_hdl_t** handle) /* out, own: handle to the
  34. created mutex; handle exists
  35. in the private address space of
  36. the calling process */
  37. {
  38. mutex_t* mutex;
  39. char* buf;
  40. os_event_t released;
  41. os_mutex_t exclude;
  42. ip_mutex_set_waiters(ip_mutex, 0);
  43. buf = mem_alloc(strlen(name) + 20);
  44. strcpy(buf, name);
  45. strcpy(buf + strlen(name), "_IB_RELS");
  46. released = os_event_create(buf);
  47. if (released == NULL) {
  48. mem_free(buf);
  49. return(1);
  50. }
  51. strcpy(buf + strlen(name), "_IB_EXCL");
  52. exclude = os_mutex_create(buf);
  53. if (exclude == NULL) {
  54. os_event_free(released);
  55. mem_free(buf);
  56. return(1);
  57. }
  58. mutex = ip_mutex_get_mutex(ip_mutex);
  59. mutex_create(mutex);
  60. mutex_set_level(mutex, SYNC_NO_ORDER_CHECK);
  61. *handle = mem_alloc(sizeof(ip_mutex_hdl_t));
  62. (*handle)->ip_mutex = ip_mutex;
  63. (*handle)->released = released;
  64. (*handle)->exclude = exclude;
  65. mem_free(buf);
  66. return(0);
  67. }
  68. /**********************************************************************
  69. NOTE! Using this function is not recommended. See the note
  70. on ip_mutex_create. Destroys an ip mutex */
  71. void
  72. ip_mutex_free(
  73. /*==========*/
  74. ip_mutex_hdl_t* handle) /* in, own: ip mutex handle */
  75. {
  76. mutex_free(ip_mutex_get_mutex(handle->ip_mutex));
  77. os_event_free(handle->released);
  78. os_mutex_free(handle->exclude);
  79. mem_free(handle);
  80. }
  81. /**********************************************************************
  82. Opens an ip mutex object in a specified shared memory location.
  83. Explicit closing of the ip mutex with ip_mutex_close is necessary to
  84. free the operating system event and mutex created, and the handle. */
  85. ulint
  86. ip_mutex_open(
  87. /*==========*/
  88. /* out: 0 if succeed */
  89. ip_mutex_t* ip_mutex, /* in: pointer to shared memory */
  90. char* name, /* in: name of the ip mutex */
  91. ip_mutex_hdl_t** handle) /* out, own: handle to the
  92. opened mutex */
  93. {
  94. char* buf;
  95. os_event_t released;
  96. os_mutex_t exclude;
  97. buf = mem_alloc(strlen(name) + 20);
  98. strcpy(buf, name);
  99. strcpy(buf + strlen(name), "_IB_RELS");
  100. released = os_event_create(buf);
  101. if (released == NULL) {
  102. mem_free(buf);
  103. return(1);
  104. }
  105. strcpy(buf + strlen(name), "_IB_EXCL");
  106. exclude = os_mutex_create(buf);
  107. if (exclude == NULL) {
  108. os_event_free(released);
  109. mem_free(buf);
  110. return(1);
  111. }
  112. *handle = mem_alloc(sizeof(ip_mutex_hdl_t));
  113. (*handle)->ip_mutex = ip_mutex;
  114. (*handle)->released = released;
  115. (*handle)->exclude = exclude;
  116. mem_free(buf);
  117. return(0);
  118. }
  119. /**********************************************************************
  120. Closes an ip mutex. */
  121. void
  122. ip_mutex_close(
  123. /*===========*/
  124. ip_mutex_hdl_t* handle) /* in, own: ip mutex handle */
  125. {
  126. os_event_free(handle->released);
  127. os_mutex_free(handle->exclude);
  128. mem_free(handle);
  129. }