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

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.  * $Id: lock.h,v 11.20 2000/12/12 17:43:56 bostic Exp $
  8.  */
  9. #define DB_LOCK_DEFAULT_N 1000 /* Default # of locks in region. */
  10. /*
  11.  * Out of band value for a lock.  Locks contain an offset into a lock region,
  12.  * so we use an invalid region offset to indicate an invalid or unset lock.
  13.  */
  14. #define LOCK_INVALID INVALID_ROFF
  15. /*
  16.  * The locker id space is divided between the transaction manager and the lock
  17.  * manager.  Lock IDs start at 0 and go to DB_LOCK_MAXID.  Txn IDs start at
  18.  * DB_LOCK_MAXID + 1 and go up to TXN_INVALID.
  19.  */
  20. #define DB_LOCK_MAXID 0x7fffffff
  21. /*
  22.  * DB_LOCKREGION --
  23.  * The lock shared region.
  24.  */
  25. typedef struct __db_lockregion {
  26. u_int32_t id; /* unique id generator */
  27. u_int32_t need_dd; /* flag for deadlock detector */
  28. u_int32_t detect; /* run dd on every conflict */
  29. /* free lock header */
  30. SH_TAILQ_HEAD(__flock) free_locks;
  31. /* free obj header */
  32. SH_TAILQ_HEAD(__fobj) free_objs;
  33. /* free locker header */
  34. SH_TAILQ_HEAD(__flocker) free_lockers;
  35. SH_TAILQ_HEAD(__dobj) dd_objs; /* objects with waiters */
  36. u_int32_t maxlocks; /* maximum number of locks in table */
  37. u_int32_t maxlockers; /* maximum number of lockers in table */
  38. u_int32_t maxobjects; /* maximum number of objects in table */
  39. u_int32_t locker_t_size; /* size of locker hash table */
  40. u_int32_t object_t_size; /* size of object hash table */
  41. u_int32_t nmodes; /* number of lock modes */
  42. u_int32_t nlocks; /* current number of locks */
  43. u_int32_t maxnlocks; /* maximum number of locks so far*/
  44. u_int32_t nlockers; /* current number of lockers */
  45. u_int32_t maxnlockers; /* maximum number of lockers so far */
  46. u_int32_t nobjects; /* current number of objects */
  47. u_int32_t maxnobjects; /* maximum number of objects so far */
  48. roff_t conf_off; /* offset of conflicts array */
  49. roff_t obj_off; /* offset of object hash table */
  50. roff_t osynch_off; /* offset of the object mutex table */
  51. roff_t locker_off; /* offset of locker hash table */
  52. roff_t lsynch_off; /* offset of the locker mutex table */
  53. u_int32_t nconflicts; /* number of lock conflicts */
  54. u_int32_t nrequests; /* number of lock gets */
  55. u_int32_t nreleases; /* number of lock puts */
  56. u_int32_t nnowaits; /* number of lock requests that would
  57.    have waited without nowait */
  58. u_int32_t ndeadlocks; /* number of deadlocks */
  59. #ifdef MUTEX_SYSTEM_RESOURCES
  60. roff_t maint_off; /* offset of region maintenance info */
  61. #endif
  62. } DB_LOCKREGION;
  63. /*
  64.  * Since we will store DBTs in shared memory, we need the equivalent of a
  65.  * DBT that will work in shared memory.
  66.  */
  67. typedef struct __sh_dbt {
  68. u_int32_t size; /* Byte length. */
  69. ssize_t   off; /* Region offset. */
  70. } SH_DBT;
  71. #define SH_DBT_PTR(p) ((void *)(((u_int8_t *)(p)) + (p)->off))
  72. /*
  73.  * Object structures;  these live in the object hash table.
  74.  */
  75. typedef struct __db_lockobj {
  76. SH_DBT lockobj; /* Identifies object locked. */
  77. SH_TAILQ_ENTRY links; /* Links for free list or hash list. */
  78. SH_TAILQ_ENTRY dd_links; /* Links for dd list. */
  79. SH_TAILQ_HEAD(__wait) waiters; /* List of waiting locks. */
  80. SH_TAILQ_HEAD(__hold) holders; /* List of held locks. */
  81. /* Declare room in the object to hold
  82.  * typical DB lock structures so that
  83.  * we do not have to allocate them from
  84.  * shalloc at run-time. */
  85. u_int8_t objdata[sizeof(struct __db_ilock)];
  86. } DB_LOCKOBJ;
  87. /*
  88.  * Locker structures; these live in the locker hash table.
  89.  */
  90. typedef struct __db_locker {
  91. u_int32_t id; /* Locker id. */
  92. u_int32_t dd_id; /* Deadlock detector id. */
  93. size_t master_locker; /* Locker of master transaction. */
  94. size_t parent_locker; /* Parent of this child. */
  95. SH_LIST_HEAD(_child) child_locker; /* List of descendant txns;
  96.    only used in a "master"
  97.    txn. */
  98. SH_LIST_ENTRY child_link; /* Links transactions in the family;
  99.    elements of the child_locker
  100.    list. */
  101. SH_TAILQ_ENTRY links; /* Links for free list. */
  102. SH_LIST_HEAD(_held) heldby; /* Locks held by this locker. */
  103. #define DB_LOCKER_DELETED 0x0001
  104. u_int32_t flags;
  105. } DB_LOCKER;
  106. /*
  107.  * Lockers can be freed if they are not part of a transaction family.
  108.  * Members of a family either point at the master transaction or are
  109.  * the master transaction and have children lockers.
  110.  */
  111. #define LOCKER_FREEABLE(lp)
  112.     ((lp)->master_locker == TXN_INVALID_ID &&
  113.     SH_LIST_FIRST(&(lp)->child_locker, __db_locker) == NULL)
  114. /*
  115.  * DB_LOCKTAB --
  116.  * The primary library lock data structure (i.e., the one referenced
  117.  * by the environment, as opposed to the internal one laid out in the region.)
  118.  */
  119. typedef struct __db_locktab {
  120. DB_ENV *dbenv; /* Environment. */
  121. REGINFO  reginfo; /* Region information. */
  122. u_int8_t *conflicts; /* Pointer to conflict matrix. */
  123. DB_HASHTAB *obj_tab; /* Beginning of object hash table. */
  124. DB_HASHTAB *locker_tab; /* Beginning of locker hash table. */
  125. } DB_LOCKTAB;
  126. /* Test for conflicts. */
  127. #define CONFLICTS(T, R, HELD, WANTED) 
  128. (T)->conflicts[(HELD) * (R)->nmodes + (WANTED)]
  129. #define OBJ_LINKS_VALID(L) ((L)->links.stqe_prev != -1)
  130. struct __db_lock {
  131. /*
  132.  * Wait on mutex to wait on lock.  You reference your own mutex with
  133.  * ID 0 and others reference your mutex with ID 1.
  134.  */
  135. MUTEX mutex;
  136. u_int32_t holder; /* Who holds this lock. */
  137. u_int32_t gen; /* Generation count. */
  138. SH_TAILQ_ENTRY links; /* Free or holder/waiter list. */
  139. SH_LIST_ENTRY locker_links; /* List of locks held by a locker. */
  140. u_int32_t refcount; /* Reference count the lock. */
  141. db_lockmode_t mode; /* What sort of lock. */
  142. ssize_t obj; /* Relative offset of object struct. */
  143. db_status_t status; /* Status of this lock. */
  144. };
  145. /*
  146.  * Flag values for __lock_put_internal:
  147.  * DB_LOCK_DOALL:     Unlock all references in this lock (instead of only 1).
  148.  * DB_LOCK_FREE:      Free the lock (used in checklocker).
  149.  * DB_LOCK_IGNOREDEL: Remove from the locker hash table even if already
  150.       deleted (used in checklocker).
  151.  * DB_LOCK_NOPROMOTE: Don't bother running promotion when releasing locks
  152.  *       (used by __lock_put_internal).
  153.  * DB_LOCK_UNLINK:    Remove from the locker links (used in checklocker).
  154.  */
  155. #define DB_LOCK_DOALL 0x001
  156. #define DB_LOCK_FREE 0x002
  157. #define DB_LOCK_IGNOREDEL 0x004
  158. #define DB_LOCK_NOPROMOTE 0x008
  159. #define DB_LOCK_UNLINK 0x010
  160. #define DB_LOCK_NOWAITERS 0x020
  161. /*
  162.  * Macros to get/release different types of mutexes.
  163.  */
  164. #define OBJECT_LOCK(lt, reg, obj, ndx)
  165. ndx = __lock_ohash(obj) % (reg)->object_t_size
  166. #define SHOBJECT_LOCK(lt, reg, shobj, ndx)
  167. ndx = __lock_lhash(shobj) % (reg)->object_t_size
  168. #define LOCKER_LOCK(lt, reg, locker, ndx)
  169. ndx = __lock_locker_hash(locker) % (reg)->locker_t_size;
  170. #define LOCKREGION(dbenv, lt)  R_LOCK((dbenv), &(lt)->reginfo)
  171. #define UNLOCKREGION(dbenv, lt)  R_UNLOCK((dbenv), &(lt)->reginfo)
  172. #include "lock_ext.h"