00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "db_config.h"
00011
00012 #ifndef NO_SYSTEM_INCLUDES
00013 #include <sys/types.h>
00014
00015 #include <string.h>
00016 #endif
00017
00018 #include "db_int.h"
00019 #include "dbinc/txn.h"
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 int
00033 __db_rmid_to_env(rmid, dbenvp)
00034 int rmid;
00035 DB_ENV **dbenvp;
00036 {
00037 DB_ENV *dbenv;
00038
00039 dbenv = TAILQ_FIRST(&DB_GLOBAL(db_envq));
00040 if (dbenv != NULL && dbenv->xa_rmid == rmid) {
00041 *dbenvp = dbenv;
00042 return (0);
00043 }
00044
00045
00046
00047
00048
00049
00050 for (; dbenv != NULL; dbenv = TAILQ_NEXT(dbenv, links))
00051 if (dbenv->xa_rmid == rmid) {
00052 TAILQ_REMOVE(&DB_GLOBAL(db_envq), dbenv, links);
00053 TAILQ_INSERT_HEAD(&DB_GLOBAL(db_envq), dbenv, links);
00054 *dbenvp = dbenv;
00055 return (0);
00056 }
00057
00058 return (1);
00059 }
00060
00061
00062
00063
00064
00065
00066
00067 int
00068 __db_xid_to_txn(dbenv, xid, offp)
00069 DB_ENV *dbenv;
00070 XID *xid;
00071 roff_t *offp;
00072 {
00073 struct __txn_detail *td;
00074
00075 return (__txn_map_gid(dbenv, (u_int8_t *)xid->data, &td, offp));
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 int
00085 __db_map_rmid(rmid, dbenv)
00086 int rmid;
00087 DB_ENV *dbenv;
00088 {
00089 dbenv->xa_rmid = rmid;
00090 TAILQ_INSERT_TAIL(&DB_GLOBAL(db_envq), dbenv, links);
00091 return (0);
00092 }
00093
00094
00095
00096
00097
00098
00099
00100 int
00101 __db_unmap_rmid(rmid)
00102 int rmid;
00103 {
00104 DB_ENV *e;
00105
00106 for (e = TAILQ_FIRST(&DB_GLOBAL(db_envq));
00107 e->xa_rmid != rmid;
00108 e = TAILQ_NEXT(e, links))
00109 ;
00110
00111 if (e == NULL)
00112 return (EINVAL);
00113
00114 TAILQ_REMOVE(&DB_GLOBAL(db_envq), e, links);
00115 return (0);
00116 }
00117
00118
00119
00120
00121
00122
00123
00124
00125 int
00126 __db_map_xid(dbenv, xid, td)
00127 DB_ENV *dbenv;
00128 XID *xid;
00129 TXN_DETAIL *td;
00130 {
00131 TXN_SYSTEM_LOCK(dbenv);
00132 memcpy(td->xid, xid->data, XIDDATASIZE);
00133 td->bqual = (u_int32_t)xid->bqual_length;
00134 td->gtrid = (u_int32_t)xid->gtrid_length;
00135 td->format = (int32_t)xid->formatID;
00136 TXN_SYSTEM_UNLOCK(dbenv);
00137
00138 return (0);
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148 void
00149 __db_unmap_xid(dbenv, xid, off)
00150 DB_ENV *dbenv;
00151 XID *xid;
00152 size_t off;
00153 {
00154 TXN_DETAIL *td;
00155
00156 COMPQUIET(xid, NULL);
00157
00158 td = R_ADDR(&((DB_TXNMGR *)dbenv->tx_handle)->reginfo, off);
00159 memset(td->xid, 0, sizeof(td->xid));
00160 }