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

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: xa_map.c,v 11.5 2000/11/30 00:58:46 ubell Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #endif
  15. #include "db_int.h"
  16. #include "txn.h"
  17. /*
  18.  * This file contains all the mapping information that we need to support
  19.  * the DB/XA interface.
  20.  */
  21. /*
  22.  * __db_rmid_to_env
  23.  * Return the environment associated with a given XA rmid.
  24.  *
  25.  * PUBLIC: int __db_rmid_to_env __P((int rmid, DB_ENV **envp));
  26.  */
  27. int
  28. __db_rmid_to_env(rmid, envp)
  29. int rmid;
  30. DB_ENV **envp;
  31. {
  32. DB_ENV *env;
  33. env = TAILQ_FIRST(&DB_GLOBAL(db_envq));
  34. if (env != NULL && env->xa_rmid == rmid) {
  35. *envp = env;
  36. return (0);
  37. }
  38. /*
  39.  * When we map an rmid, move that environment to be the first one in
  40.  * the list of environments, so we acquire the correct environment
  41.  * in DB->open.
  42.  */
  43. for (; env != NULL; env = TAILQ_NEXT(env, links))
  44. if (env->xa_rmid == rmid) {
  45. TAILQ_REMOVE(&DB_GLOBAL(db_envq), env, links);
  46. TAILQ_INSERT_HEAD(&DB_GLOBAL(db_envq), env, links);
  47. *envp = env;
  48. return (0);
  49. }
  50. return (1);
  51. }
  52. /*
  53.  * __db_xid_to_txn
  54.  * Return the txn that corresponds to this XID.
  55.  *
  56.  * PUBLIC: int __db_xid_to_txn __P((DB_ENV *, XID *, size_t *));
  57.  */
  58. int
  59. __db_xid_to_txn(dbenv, xid, offp)
  60. DB_ENV *dbenv;
  61. XID *xid;
  62. size_t *offp;
  63. {
  64. DB_TXNMGR *mgr;
  65. DB_TXNREGION *tmr;
  66. struct __txn_detail *td;
  67. mgr = dbenv->tx_handle;
  68. tmr = mgr->reginfo.primary;
  69. /*
  70.  * Search the internal active transaction table to find the
  71.  * matching xid.  If this is a performance hit, then we
  72.  * can create a hash table, but I doubt it's worth it.
  73.  */
  74. R_LOCK(dbenv, &mgr->reginfo);
  75. for (td = SH_TAILQ_FIRST(&tmr->active_txn, __txn_detail);
  76.     td != NULL;
  77.     td = SH_TAILQ_NEXT(td, links, __txn_detail))
  78. if (memcmp(xid->data, td->xid, XIDDATASIZE) == 0)
  79. break;
  80. R_UNLOCK(dbenv, &mgr->reginfo);
  81. if (td == NULL)
  82. return (EINVAL);
  83. *offp = R_OFFSET(&mgr->reginfo, td);
  84. return (0);
  85. }
  86. /*
  87.  * __db_map_rmid
  88.  * Create a mapping between the specified rmid and environment.
  89.  *
  90.  * PUBLIC: int __db_map_rmid __P((int, DB_ENV *));
  91.  */
  92. int
  93. __db_map_rmid(rmid, env)
  94. int rmid;
  95. DB_ENV *env;
  96. {
  97. env->xa_rmid = rmid;
  98. TAILQ_INSERT_TAIL(&DB_GLOBAL(db_envq), env, links);
  99. return (0);
  100. }
  101. /*
  102.  * __db_unmap_rmid
  103.  * Destroy the mapping for the given rmid.
  104.  *
  105.  * PUBLIC: int __db_unmap_rmid __P((int));
  106.  */
  107. int
  108. __db_unmap_rmid(rmid)
  109. int rmid;
  110. {
  111. DB_ENV *e;
  112. for (e = TAILQ_FIRST(&DB_GLOBAL(db_envq));
  113.     e->xa_rmid != rmid;
  114.     e = TAILQ_NEXT(e, links));
  115. if (e == NULL)
  116. return (EINVAL);
  117. TAILQ_REMOVE(&DB_GLOBAL(db_envq), e, links);
  118. return (0);
  119. }
  120. /*
  121.  * __db_map_xid
  122.  * Create a mapping between this XID and the transaction at
  123.  * "off" in the shared region.
  124.  *
  125.  * PUBLIC: int __db_map_xid __P((DB_ENV *, XID *, size_t));
  126.  */
  127. int
  128. __db_map_xid(env, xid, off)
  129. DB_ENV *env;
  130. XID *xid;
  131. size_t off;
  132. {
  133. REGINFO *infop;
  134. TXN_DETAIL *td;
  135. infop = &((DB_TXNMGR *)env->tx_handle)->reginfo;
  136. td = (TXN_DETAIL *)R_ADDR(infop, off);
  137. R_LOCK(env, infop);
  138. memcpy(td->xid, xid->data, XIDDATASIZE);
  139. td->bqual = (u_int32_t)xid->bqual_length;
  140. td->gtrid = (u_int32_t)xid->gtrid_length;
  141. td->format = (int32_t)xid->formatID;
  142. R_UNLOCK(env, infop);
  143. return (0);
  144. }
  145. /*
  146.  * __db_unmap_xid
  147.  * Destroy the mapping for the specified XID.
  148.  *
  149.  * PUBLIC: void __db_unmap_xid __P((DB_ENV *, XID *, size_t));
  150.  */
  151. void
  152. __db_unmap_xid(env, xid, off)
  153. DB_ENV *env;
  154. XID *xid;
  155. size_t off;
  156. {
  157. TXN_DETAIL *td;
  158. COMPQUIET(xid, NULL);
  159. td = (TXN_DETAIL *)R_ADDR(&((DB_TXNMGR *)env->tx_handle)->reginfo, off);
  160. memset(td->xid, 0, sizeof(td->xid));
  161. }