~mysql/mysql-server/mysql-6.0

« back to all changes in this revision

Viewing changes to innobase/include/trx0rseg.ic

  • Committer: monty at mysql
  • Date: 2001-02-17 12:19:19 UTC
  • mto: (554.1.1)
  • mto: This revision was merged to the branch mainline in revision 556.
  • Revision ID: sp1r-monty@donna.mysql.com-20010217121919-07904
Added Innobase to source distribution

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   page_no,        /* in: page number of the header */
 
21
        mtr_t*  mtr)            /* in: mtr */
 
22
{
 
23
        trx_rsegf_t*    header;
 
24
 
 
25
        header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr);
 
26
 
 
27
        buf_page_dbg_add_level(header, SYNC_RSEG_HEADER);
 
28
 
 
29
        return(header);
 
30
}
 
31
 
 
32
/**********************************************************************
 
33
Gets a newly created rollback segment header. */
 
34
UNIV_INLINE
 
35
trx_rsegf_t*
 
36
trx_rsegf_get_new(
 
37
/*==============*/
 
38
                                /* out: rollback segment header, page
 
39
                                x-latched */
 
40
        ulint   space,          /* in: space where placed */
 
41
        ulint   page_no,        /* in: page number of the header */
 
42
        mtr_t*  mtr)            /* in: mtr */
 
43
{
 
44
        trx_rsegf_t*    header;
 
45
 
 
46
        header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr);
 
47
 
 
48
        buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW);
 
49
 
 
50
        return(header);
 
51
}
 
52
 
 
53
/*******************************************************************
 
54
Gets the file page number of the nth undo log slot. */
 
55
UNIV_INLINE
 
56
ulint
 
57
trx_rsegf_get_nth_undo(
 
58
/*===================*/
 
59
                                /* out: page number of the undo log segment */
 
60
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
61
        ulint           n,      /* in: index of slot */
 
62
        mtr_t*          mtr)    /* in: mtr */
 
63
{
 
64
        ut_ad(n < TRX_RSEG_N_SLOTS);
 
65
 
 
66
        return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS +
 
67
                                n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr));
 
68
}
 
69
 
 
70
/*******************************************************************
 
71
Sets the file page number of the nth undo log slot. */
 
72
UNIV_INLINE
 
73
void
 
74
trx_rsegf_set_nth_undo(
 
75
/*===================*/
 
76
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
77
        ulint           n,      /* in: index of slot */
 
78
        ulint           page_no,/* in: page number of the undo log segment */
 
79
        mtr_t*          mtr)    /* in: mtr */
 
80
{
 
81
        ut_ad(n < TRX_RSEG_N_SLOTS);
 
82
 
 
83
        mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE,
 
84
                                                page_no, MLOG_4BYTES, mtr);
 
85
}
 
86
 
 
87
/********************************************************************
 
88
Looks for a free slot for an undo log segment. */
 
89
UNIV_INLINE
 
90
ulint
 
91
trx_rsegf_undo_find_free(
 
92
/*=====================*/
 
93
                                /* out: slot index or ULINT_UNDEFINED if not
 
94
                                found */
 
95
        trx_rsegf_t*    rsegf,  /* in: rollback segment header */
 
96
        mtr_t*          mtr)    /* in: mtr */
 
97
{
 
98
        ulint           i;
 
99
        ulint           page_no;
 
100
        
 
101
        for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
 
102
 
 
103
                page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
 
104
 
 
105
                if (page_no == FIL_NULL) {
 
106
 
 
107
                        return(i);
 
108
                }
 
109
        }
 
110
 
 
111
        return(ULINT_UNDEFINED);
 
112
}