2009-05-27 11:45:59 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
|
2013-03-25 23:03:13 +01:00
|
|
|
Copyright (c) 1997, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
2009-05-27 11:45:59 +02:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; version 2 of the License.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
2012-08-01 16:27:34 +02:00
|
|
|
this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
2009-05-27 11:45:59 +02:00
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/**************************************************//**
|
|
|
|
@file include/read0read.ic
|
|
|
|
Cursor read
|
|
|
|
|
|
|
|
Created 2/16/1997 Heikki Tuuri
|
|
|
|
*******************************************************/
|
|
|
|
|
2013-03-25 23:03:13 +01:00
|
|
|
#include "trx0sys.h"
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/*********************************************************************//**
|
|
|
|
Validates a read view object. */
|
|
|
|
static
|
|
|
|
bool
|
|
|
|
read_view_validate(
|
|
|
|
/*===============*/
|
|
|
|
const read_view_t* view) /*!< in: view to validate */
|
|
|
|
{
|
|
|
|
ut_ad(mutex_own(&trx_sys->mutex));
|
|
|
|
|
|
|
|
/* Check that the view->trx_ids array is in descending order. */
|
|
|
|
for (ulint i = 1; i < view->n_trx_ids; ++i) {
|
|
|
|
|
|
|
|
ut_a(view->trx_ids[i] < view->trx_ids[i - 1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Functor to validate the view list. */
|
|
|
|
struct ViewCheck {
|
|
|
|
|
|
|
|
ViewCheck() : m_prev_view(0) { }
|
|
|
|
|
|
|
|
void operator()(const read_view_t* view)
|
|
|
|
{
|
|
|
|
ut_a(m_prev_view == NULL
|
|
|
|
|| m_prev_view->low_limit_no >= view->low_limit_no);
|
|
|
|
|
|
|
|
m_prev_view = view;
|
|
|
|
}
|
|
|
|
|
|
|
|
const read_view_t* m_prev_view;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Validates a read view list. */
|
|
|
|
static
|
|
|
|
bool
|
|
|
|
read_view_list_validate(void)
|
|
|
|
/*=========================*/
|
|
|
|
{
|
|
|
|
ut_ad(mutex_own(&trx_sys->mutex));
|
|
|
|
|
|
|
|
ut_list_map(trx_sys->view_list, &read_view_t::view_list, ViewCheck());
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
2009-05-27 11:45:59 +02:00
|
|
|
/*********************************************************************//**
|
|
|
|
Checks if a read view sees the specified transaction.
|
2013-03-25 23:03:13 +01:00
|
|
|
@return true if sees */
|
2009-05-27 11:45:59 +02:00
|
|
|
UNIV_INLINE
|
2013-03-25 23:03:13 +01:00
|
|
|
bool
|
2009-05-27 11:45:59 +02:00
|
|
|
read_view_sees_trx_id(
|
|
|
|
/*==================*/
|
|
|
|
const read_view_t* view, /*!< in: read view */
|
|
|
|
trx_id_t trx_id) /*!< in: trx id */
|
|
|
|
{
|
2010-06-23 13:06:59 +02:00
|
|
|
if (trx_id < view->up_limit_id) {
|
2009-05-27 11:45:59 +02:00
|
|
|
|
2013-03-25 23:03:13 +01:00
|
|
|
return(true);
|
2012-08-01 16:27:34 +02:00
|
|
|
} else if (trx_id >= view->low_limit_id) {
|
2009-05-27 11:45:59 +02:00
|
|
|
|
2013-03-25 23:03:13 +01:00
|
|
|
return(false);
|
2012-08-01 16:27:34 +02:00
|
|
|
} else {
|
|
|
|
ulint lower = 0;
|
|
|
|
ulint upper = view->n_trx_ids - 1;
|
|
|
|
|
|
|
|
ut_a(view->n_trx_ids > 0);
|
|
|
|
|
|
|
|
do {
|
|
|
|
ulint mid = (lower + upper) >> 1;
|
|
|
|
trx_id_t mid_id = view->trx_ids[mid];
|
|
|
|
|
|
|
|
if (mid_id == trx_id) {
|
|
|
|
return(FALSE);
|
|
|
|
} else if (mid_id < trx_id) {
|
|
|
|
if (mid > 0) {
|
|
|
|
upper = mid - 1;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
lower = mid + 1;
|
|
|
|
}
|
|
|
|
} while (lower <= upper);
|
2009-05-27 11:45:59 +02:00
|
|
|
}
|
|
|
|
|
2013-03-25 23:03:13 +01:00
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Remove a read view from the trx_sys->view_list. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
read_view_remove(
|
|
|
|
/*=============*/
|
|
|
|
read_view_t* view, /*!< in: read view, can be 0 */
|
|
|
|
bool own_mutex) /*!< in: true if caller owns the
|
|
|
|
trx_sys_t::mutex */
|
|
|
|
{
|
|
|
|
if (view != 0) {
|
|
|
|
if (!own_mutex) {
|
|
|
|
mutex_enter(&trx_sys->mutex);
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_ad(read_view_validate(view));
|
|
|
|
|
|
|
|
UT_LIST_REMOVE(view_list, trx_sys->view_list, view);
|
|
|
|
|
|
|
|
ut_ad(read_view_list_validate());
|
|
|
|
|
|
|
|
if (!own_mutex) {
|
|
|
|
mutex_exit(&trx_sys->mutex);
|
|
|
|
}
|
|
|
|
}
|
2009-05-27 11:45:59 +02:00
|
|
|
}
|
2013-03-25 23:03:13 +01:00
|
|
|
|