diff options
Diffstat (limited to 'storage/innobase/include/read0read.ic')
-rw-r--r-- | storage/innobase/include/read0read.ic | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/storage/innobase/include/read0read.ic b/storage/innobase/include/read0read.ic new file mode 100644 index 00000000000..82c1028f12e --- /dev/null +++ b/storage/innobase/include/read0read.ic @@ -0,0 +1,148 @@ +/***************************************************************************** + +Copyright (c) 1997, 2012, Oracle and/or its affiliates. All Rights Reserved. + +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 +this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +/**************************************************//** +@file include/read0read.ic +Cursor read + +Created 2/16/1997 Heikki Tuuri +*******************************************************/ + +#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 */ + +/*********************************************************************//** +Checks if a read view sees the specified transaction. +@return true if sees */ +UNIV_INLINE +bool +read_view_sees_trx_id( +/*==================*/ + const read_view_t* view, /*!< in: read view */ + trx_id_t trx_id) /*!< in: trx id */ +{ + if (trx_id < view->up_limit_id) { + + return(true); + } else if (trx_id >= view->low_limit_id) { + + return(false); + } 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); + } + + 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); + } + } +} + |