~stewart/drizzle/embedded-innodb-create-select-transaction-arrgh

« back to all changes in this revision

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

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

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