~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/include/trx0rseg.ic

  • Committer: Lee
  • Date: 2008-10-30 22:02:01 UTC
  • mto: (572.1.2 devel)
  • mto: This revision was merged to the branch mainline in revision 573.
  • Revision ID: lbieber@lbieber-desktop-20081030220201-elb6qprbzpn7c5a4
add my name to the AUTHORS file

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************
 
2
Rollback segment
 
3
 
 
4
(c) 1996 Innobase Oy
 
5
 
 
6
Created 3/26/1996 Heikki Tuuri
 
7
*******************************************************/
 
8
 
 
9
#include "srv0srv.h"
 
10
 
 
11
/**********************************************************************
 
12
Gets a rollback segment header. */
 
13
UNIV_INLINE
 
14
trx_rsegf_t*
 
15
trx_rsegf_get(
 
16
/*==========*/
 
17
                                /* out: rollback segment header, page
 
18
                                x-latched */
 
19
        ulint   space,          /* in: space where placed */
 
20
        ulint   zip_size,       /* in: compressed page size in bytes
 
21
                                or 0 for uncompressed pages */
 
22
        ulint   page_no,        /* in: page number of the header */
 
23
        mtr_t*  mtr)            /* in: mtr */
 
24
{
 
25
        buf_block_t*    block;
 
26
        trx_rsegf_t*    header;
 
27
 
 
28
        block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
 
29
#ifdef UNIV_SYNC_DEBUG
 
30
        buf_block_dbg_add_level(block, SYNC_RSEG_HEADER);
 
31
#endif /* UNIV_SYNC_DEBUG */
 
32
        header = TRX_RSEG + buf_block_get_frame(block);
 
33
 
 
34
        return(header);
 
35
}
 
36
 
 
37
/**********************************************************************
 
38
Gets a newly created rollback segment header. */
 
39
UNIV_INLINE
 
40
trx_rsegf_t*
 
41
trx_rsegf_get_new(
 
42
/*==============*/
 
43
                                /* out: rollback segment header, page
 
44
                                x-latched */
 
45
        ulint   space,          /* in: space where placed */
 
46
        ulint   zip_size,       /* in: compressed page size in bytes
 
47
                                or 0 for uncompressed pages */
 
48
        ulint   page_no,        /* in: page number of the header */
 
49
        mtr_t*  mtr)            /* in: mtr */
 
50
{
 
51
        buf_block_t*    block;
 
52
        trx_rsegf_t*    header;
 
53
 
 
54
        block = buf_page_get(space, zip_size, page_no, RW_X_LATCH, mtr);
 
55
#ifdef UNIV_SYNC_DEBUG
 
56
        buf_block_dbg_add_level(block, SYNC_RSEG_HEADER_NEW);
 
57
#endif /* UNIV_SYNC_DEBUG */
 
58
        header = TRX_RSEG + buf_block_get_frame(block);
 
59
 
 
60
        return(header);
 
61
}
 
62
 
 
63
/*******************************************************************
 
64
Gets the file page number of the nth undo log slot. */
 
65
UNIV_INLINE
 
66
ulint
 
67
trx_rsegf_get_nth_undo(
 
68
/*===================*/
 
69
                                /* out: page number of the undo log segment */
 
70
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
71
        ulint           n,      /* in: index of slot */
 
72
        mtr_t*          mtr)    /* in: mtr */
 
73
{
 
74
        if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) {
 
75
                fprintf(stderr,
 
76
                        "InnoDB: Error: trying to get slot %lu of rseg\n",
 
77
                        (ulong) n);
 
78
                ut_error;
 
79
        }
 
80
 
 
81
        return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS
 
82
                              + n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr));
 
83
}
 
84
 
 
85
/*******************************************************************
 
86
Sets the file page number of the nth undo log slot. */
 
87
UNIV_INLINE
 
88
void
 
89
trx_rsegf_set_nth_undo(
 
90
/*===================*/
 
91
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
92
        ulint           n,      /* in: index of slot */
 
93
        ulint           page_no,/* in: page number of the undo log segment */
 
94
        mtr_t*          mtr)    /* in: mtr */
 
95
{
 
96
        if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) {
 
97
                fprintf(stderr,
 
98
                        "InnoDB: Error: trying to set slot %lu of rseg\n",
 
99
                        (ulong) n);
 
100
                ut_error;
 
101
        }
 
102
 
 
103
        mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE,
 
104
                         page_no, MLOG_4BYTES, mtr);
 
105
}
 
106
 
 
107
/********************************************************************
 
108
Looks for a free slot for an undo log segment. */
 
109
UNIV_INLINE
 
110
ulint
 
111
trx_rsegf_undo_find_free(
 
112
/*=====================*/
 
113
                                /* out: slot index or ULINT_UNDEFINED if not
 
114
                                found */
 
115
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
116
        mtr_t*          mtr)    /* in: mtr */
 
117
{
 
118
        ulint           i;
 
119
        ulint           page_no;
 
120
 
 
121
        for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
 
122
 
 
123
                page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
 
124
 
 
125
                if (page_no == FIL_NULL) {
 
126
 
 
127
                        return(i);
 
128
                }
 
129
        }
 
130
 
 
131
        return(ULINT_UNDEFINED);
 
132
}