f4e0999b36935bb344331007cbd9759ebf90129f
[kopensolaris-gnu/glibc.git] / db2 / include / txn.h
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1996, 1997
5  *      Sleepycat Software.  All rights reserved.
6  *
7  *      @(#)txn.h       10.6 (Sleepycat) 7/29/97
8  */
9 #ifndef _TXN_H_
10 #define _TXN_H_
11
12 /*
13  * The name of the transaction shared memory region is DEFAULT_TXN_FILE and
14  * the region is always created group RW of the group owning the directory.
15  */
16 #define DEFAULT_TXN_FILE        "__db_txn.share"
17 #define TXN_INVALID             0xffffffff /* Maximum number of txn ids. */
18 #define TXN_MINIMUM             0x80000000 /* First transaction id */
19
20 /*
21  * Transaction type declarations.
22  */
23
24 /*
25  * Internal data maintained in shared memory for each transaction.
26  */
27 typedef struct __txn_detail {
28         u_int32_t txnid;                /* current transaction id
29                                            used to link free list also */
30         DB_LSN  last_lsn;               /* last lsn written for this txn */
31         DB_LSN  begin_lsn;              /* lsn of begin record */
32         size_t  last_lock;              /* offset in lock region of last lock
33                                            for this transaction. */
34 #define TXN_UNALLOC     0
35 #define TXN_RUNNING     1
36 #define TXN_ABORTED     2
37 #define TXN_PREPARED    3
38         u_int32_t status;               /* status of the transaction */
39 } TXN_DETAIL;
40
41 /*
42  * The transaction manager encapsulates the transaction system.  It contains
43  * references to the log and lock managers as well as the state that keeps
44  * track of the shared memory region.
45  */
46 struct __db_txnmgr {
47 /* These fields need to be protected for multi-threaded support. */
48         db_mutex_t      mutex;          /* Synchronization. */
49                                         /* list of active transactions */
50         TAILQ_HEAD(_chain, __db_txn)    txn_chain;
51
52 /* These fields are not protected. */
53         DB_ENV          *dbenv;         /* Environment. */
54         int (*recover)                  /* Recovery dispatch routine */
55             __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
56         int              fd;            /* mapped file descriptor */
57         u_int            flags;         /* DB_TXN_NOSYNC, DB_THREAD */
58         size_t           reg_size;      /* how large we think the region is */
59         DB_TXNREGION    *region;        /* address of shared memory region */
60 };
61
62 /*
63  * Layout of the shared memory region.
64  *
65  */
66 struct __db_txnregion {
67         RLAYOUT         hdr;            /* Shared memory region header. */
68         u_int32_t       magic;          /* transaction magic number */
69         u_int32_t       version;        /* version number */
70         u_int32_t       maxtxns;        /* maximum number of active txns */
71         u_int32_t       last_txnid;     /* last transaction id given out */
72         u_int32_t       free_txn;       /* head of transaction free list */
73         DB_LSN          pending_ckp;    /* last checkpoint did not finish */
74         DB_LSN          last_ckp;       /* lsn of the last checkpoint */
75         time_t          time_ckp;       /* time of last checkpoint */
76         u_int32_t       logtype;        /* type of logging */
77         u_int32_t       locktype;       /* lock type */
78         u_int32_t       naborts;        /* number of aborted transactions */
79         u_int32_t       ncommits;       /* number of committed transactions */
80         u_int32_t       nbegins;        /* number of begun transactions */
81         TXN_DETAIL      table[1];       /* array of TXN structures */
82 };
83
84 #define TXN_REGION_SIZE(N)                                              \
85                         (sizeof(DB_TXNREGION) + N * sizeof(DB_TXN))
86
87 /* Macros to lock/unlock the region and threads. */
88 #define LOCK_TXNTHREAD(tmgrp)                                           \
89         if (F_ISSET(tmgrp, DB_THREAD))                                  \
90                 (void)__db_mutex_lock(&(tmgrp)->mutex, -1,              \
91                     (tmgrp)->dbenv == NULL ? NULL : (tmgrp)->dbenv->db_yield)
92 #define UNLOCK_TXNTHREAD(tmgrp)                                         \
93         if (F_ISSET(tmgrp, DB_THREAD))                                  \
94                 (void)__db_mutex_unlock(&(tmgrp)->mutex, -1)
95
96 #define LOCK_TXNREGION(tmgrp)                                           \
97         (void)__db_mutex_lock(&(tmgrp)->region->hdr.lock,(tmgrp)->fd,   \
98             (tmgrp)->dbenv == NULL ? NULL : (tmgrp)->dbenv->db_yield)
99 #define UNLOCK_TXNREGION(tmgrp)                                         \
100         (void)__db_mutex_unlock(&(tmgrp)->region->hdr.lock, (tmgrp)->fd)
101
102 /*
103  * Log record types.
104  */
105 #define TXN_BEGIN       1
106 #define TXN_COMMIT      2
107 #define TXN_PREPARE     3
108 #define TXN_CHECKPOINT  4
109
110 #include "txn_auto.h"
111 #include "txn_ext.h"
112 #endif /* !_TXN_H_ */