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

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: lock_method.c,v 11.30 2002/03/27 04:32:20 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #ifdef HAVE_RPC
  14. #include <rpc/rpc.h>
  15. #endif
  16. #include <string.h>
  17. #endif
  18. #include "db_int.h"
  19. #include "dbinc/db_shash.h"
  20. #include "dbinc/lock.h"
  21. #ifdef HAVE_RPC
  22. #include "dbinc_auto/db_server.h"
  23. #include "dbinc_auto/rpc_client_ext.h"
  24. #endif
  25. static int __lock_set_lk_conflicts __P((DB_ENV *, u_int8_t *, int));
  26. static int __lock_set_lk_detect __P((DB_ENV *, u_int32_t));
  27. static int __lock_set_lk_max __P((DB_ENV *, u_int32_t));
  28. static int __lock_set_lk_max_lockers __P((DB_ENV *, u_int32_t));
  29. static int __lock_set_lk_max_locks __P((DB_ENV *, u_int32_t));
  30. static int __lock_set_lk_max_objects __P((DB_ENV *, u_int32_t));
  31. static int __lock_set_env_timeout __P((DB_ENV *, db_timeout_t, u_int32_t));
  32. /*
  33.  * __lock_dbenv_create --
  34.  * Lock specific creation of the DB_ENV structure.
  35.  *
  36.  * PUBLIC: void __lock_dbenv_create __P((DB_ENV *));
  37.  */
  38. void
  39. __lock_dbenv_create(dbenv)
  40. DB_ENV *dbenv;
  41. {
  42. /*
  43.  * !!!
  44.  * Our caller has not yet had the opportunity to reset the panic
  45.  * state or turn off mutex locking, and so we can neither check
  46.  * the panic state or acquire a mutex in the DB_ENV create path.
  47.  */
  48. dbenv->lk_max = DB_LOCK_DEFAULT_N;
  49. dbenv->lk_max_lockers = DB_LOCK_DEFAULT_N;
  50. dbenv->lk_max_objects = DB_LOCK_DEFAULT_N;
  51. #ifdef HAVE_RPC
  52. if (F_ISSET(dbenv, DB_ENV_RPCCLIENT)) {
  53. dbenv->set_lk_conflicts = __dbcl_set_lk_conflict;
  54. dbenv->set_lk_detect = __dbcl_set_lk_detect;
  55. dbenv->set_lk_max = __dbcl_set_lk_max;
  56. dbenv->set_lk_max_lockers = __dbcl_set_lk_max_lockers;
  57. dbenv->set_lk_max_locks = __dbcl_set_lk_max_locks;
  58. dbenv->set_lk_max_objects = __dbcl_set_lk_max_objects;
  59. dbenv->lock_detect = __dbcl_lock_detect;
  60. dbenv->lock_dump_region = NULL;
  61. dbenv->lock_get = __dbcl_lock_get;
  62. dbenv->lock_id = __dbcl_lock_id;
  63. dbenv->lock_id_free = __dbcl_lock_id_free;
  64. dbenv->lock_put = __dbcl_lock_put;
  65. dbenv->lock_stat = __dbcl_lock_stat;
  66. dbenv->lock_vec = __dbcl_lock_vec;
  67. } else
  68. #endif
  69. {
  70. dbenv->set_lk_conflicts = __lock_set_lk_conflicts;
  71. dbenv->set_lk_detect = __lock_set_lk_detect;
  72. dbenv->set_lk_max = __lock_set_lk_max;
  73. dbenv->set_lk_max_lockers = __lock_set_lk_max_lockers;
  74. dbenv->set_lk_max_locks = __lock_set_lk_max_locks;
  75. dbenv->set_lk_max_objects = __lock_set_lk_max_objects;
  76. dbenv->set_timeout = __lock_set_env_timeout;
  77. dbenv->lock_detect = __lock_detect;
  78. dbenv->lock_dump_region = __lock_dump_region;
  79. dbenv->lock_get = __lock_get;
  80. dbenv->lock_id = __lock_id;
  81. dbenv->lock_id_free = __lock_id_free;
  82. #ifdef CONFIG_TEST
  83. dbenv->lock_id_set = __lock_id_set;
  84. #endif
  85. dbenv->lock_put = __lock_put;
  86. dbenv->lock_stat = __lock_stat;
  87. dbenv->lock_vec = __lock_vec;
  88. dbenv->lock_downgrade = __lock_downgrade;
  89. }
  90. }
  91. /*
  92.  * __lock_dbenv_close --
  93.  * Lock specific destruction of the DB_ENV structure.
  94.  *
  95.  * PUBLIC: void __lock_dbenv_close __P((DB_ENV *));
  96.  */
  97. void
  98. __lock_dbenv_close(dbenv)
  99. DB_ENV *dbenv;
  100. {
  101. if (dbenv->lk_conflicts != NULL) {
  102. __os_free(dbenv, dbenv->lk_conflicts);
  103. dbenv->lk_conflicts = NULL;
  104. }
  105. }
  106. /*
  107.  * __lock_set_lk_conflicts
  108.  * Set the conflicts matrix.
  109.  */
  110. static int
  111. __lock_set_lk_conflicts(dbenv, lk_conflicts, lk_modes)
  112. DB_ENV *dbenv;
  113. u_int8_t *lk_conflicts;
  114. int lk_modes;
  115. {
  116. int ret;
  117. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_conflicts");
  118. if (dbenv->lk_conflicts != NULL) {
  119. __os_free(dbenv, dbenv->lk_conflicts);
  120. dbenv->lk_conflicts = NULL;
  121. }
  122. if ((ret = __os_malloc(dbenv,
  123.     lk_modes * lk_modes, &dbenv->lk_conflicts)) != 0)
  124. return (ret);
  125. memcpy(dbenv->lk_conflicts, lk_conflicts, lk_modes * lk_modes);
  126. dbenv->lk_modes = lk_modes;
  127. return (0);
  128. }
  129. /*
  130.  * __lock_set_lk_detect
  131.  * Set the automatic deadlock detection.
  132.  */
  133. static int
  134. __lock_set_lk_detect(dbenv, lk_detect)
  135. DB_ENV *dbenv;
  136. u_int32_t lk_detect;
  137. {
  138. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_detect");
  139. switch (lk_detect) {
  140. case DB_LOCK_DEFAULT:
  141. case DB_LOCK_EXPIRE:
  142. case DB_LOCK_MAXLOCKS:
  143. case DB_LOCK_MINLOCKS:
  144. case DB_LOCK_MINWRITE:
  145. case DB_LOCK_OLDEST:
  146. case DB_LOCK_RANDOM:
  147. case DB_LOCK_YOUNGEST:
  148. break;
  149. default:
  150. __db_err(dbenv,
  151.     "DB_ENV->set_lk_detect: unknown deadlock detection mode specified");
  152. return (EINVAL);
  153. }
  154. dbenv->lk_detect = lk_detect;
  155. return (0);
  156. }
  157. /*
  158.  * __lock_set_lk_max
  159.  * Set the lock table size.
  160.  */
  161. static int
  162. __lock_set_lk_max(dbenv, lk_max)
  163. DB_ENV *dbenv;
  164. u_int32_t lk_max;
  165. {
  166. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_max");
  167. dbenv->lk_max = lk_max;
  168. dbenv->lk_max_objects = lk_max;
  169. dbenv->lk_max_lockers = lk_max;
  170. return (0);
  171. }
  172. /*
  173.  * __lock_set_lk_max_locks
  174.  * Set the lock table size.
  175.  */
  176. static int
  177. __lock_set_lk_max_locks(dbenv, lk_max)
  178. DB_ENV *dbenv;
  179. u_int32_t lk_max;
  180. {
  181. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_max_locks");
  182. dbenv->lk_max = lk_max;
  183. return (0);
  184. }
  185. /*
  186.  * __lock_set_lk_max_lockers
  187.  * Set the lock table size.
  188.  */
  189. static int
  190. __lock_set_lk_max_lockers(dbenv, lk_max)
  191. DB_ENV *dbenv;
  192. u_int32_t lk_max;
  193. {
  194. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_max_lockers");
  195. dbenv->lk_max_lockers = lk_max;
  196. return (0);
  197. }
  198. /*
  199.  * __lock_set_lk_max_objects
  200.  * Set the lock table size.
  201.  */
  202. static int
  203. __lock_set_lk_max_objects(dbenv, lk_max)
  204. DB_ENV *dbenv;
  205. u_int32_t lk_max;
  206. {
  207. ENV_ILLEGAL_AFTER_OPEN(dbenv, "set_lk_max_objects");
  208. dbenv->lk_max_objects = lk_max;
  209. return (0);
  210. }
  211. /*
  212.  * __lock_set_env_timeout
  213.  * Set the lock environment timeout.
  214.  */
  215. static int
  216. __lock_set_env_timeout(dbenv, timeout, flags)
  217. DB_ENV *dbenv;
  218. db_timeout_t timeout;
  219. u_int32_t flags;
  220. {
  221. DB_LOCKREGION *region;
  222. region = NULL;
  223. if (F_ISSET(dbenv, DB_ENV_OPEN_CALLED)) {
  224. if (!LOCKING_ON(dbenv))
  225. return (__db_env_config(
  226.     dbenv, "set_timeout", DB_INIT_LOCK));
  227. region = ((DB_LOCKTAB *)dbenv->lk_handle)->reginfo.primary;
  228. }
  229. switch (flags) {
  230. case DB_SET_LOCK_TIMEOUT:
  231. dbenv->lk_timeout = timeout;
  232. if (region != NULL)
  233. region->lk_timeout = timeout;
  234. break;
  235. case DB_SET_TXN_TIMEOUT:
  236. dbenv->tx_timeout = timeout;
  237. if (region != NULL)
  238. region->tx_timeout = timeout;
  239. break;
  240. default:
  241. return (__db_ferr(dbenv, "DB_ENV->set_timeout", 0));
  242. /* NOTREACHED */
  243. }
  244. return (0);
  245. }