summaryrefslogtreecommitdiffstats
path: root/storage/innobase/lock/lock0iter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/lock/lock0iter.cc')
-rw-r--r--storage/innobase/lock/lock0iter.cc88
1 files changed, 88 insertions, 0 deletions
diff --git a/storage/innobase/lock/lock0iter.cc b/storage/innobase/lock/lock0iter.cc
new file mode 100644
index 00000000..0cd271bf
--- /dev/null
+++ b/storage/innobase/lock/lock0iter.cc
@@ -0,0 +1,88 @@
+/*****************************************************************************
+
+Copyright (c) 2007, 2014, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2020, 2021, MariaDB Corporation.
+
+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, Fifth Floor, Boston, MA 02110-1335 USA
+
+*****************************************************************************/
+
+/**************************************************//**
+@file lock/lock0iter.cc
+Lock queue iterator. Can iterate over table and record
+lock queues.
+
+Created July 16, 2007 Vasil Dimov
+*******************************************************/
+
+#define LOCK_MODULE_IMPLEMENTATION
+
+#include "dict0mem.h"
+#include "lock0iter.h"
+#include "lock0lock.h"
+#include "lock0priv.h"
+
+/*******************************************************************//**
+Initialize lock queue iterator so that it starts to iterate from
+"lock". bit_no specifies the record number within the heap where the
+record is stored. It can be undefined (ULINT_UNDEFINED) in two cases:
+1. If the lock is a table lock, thus we have a table lock queue;
+2. If the lock is a record lock and it is a wait lock. In this case
+ bit_no is calculated in this function by using
+ lock_rec_find_set_bit(). There is exactly one bit set in the bitmap
+ of a wait lock. */
+void
+lock_queue_iterator_reset(
+/*======================*/
+ lock_queue_iterator_t* iter, /*!< out: iterator */
+ const lock_t* lock, /*!< in: lock to start from */
+ ulint bit_no) /*!< in: record number in the
+ heap */
+{
+ lock_sys.assert_locked(*lock);
+
+ iter->current_lock = lock;
+
+ if (bit_no != ULINT_UNDEFINED);
+ else if (lock->is_table())
+ bit_no= ULINT_UNDEFINED;
+ else
+ {
+ bit_no= lock_rec_find_set_bit(lock);
+ ut_ad(bit_no != ULINT_UNDEFINED);
+ }
+
+ iter->bit_no= bit_no;
+}
+
+/*******************************************************************//**
+Gets the previous lock in the lock queue, returns NULL if there are no
+more locks (i.e. the current lock is the first one). The iterator is
+receded (if not-NULL is returned).
+@return previous lock or NULL */
+const lock_t*
+lock_queue_iterator_get_prev(
+/*=========================*/
+ lock_queue_iterator_t* iter) /*!< in/out: iterator */
+{
+ lock_sys.assert_locked(*iter->current_lock);
+
+ const lock_t *prev_lock= !iter->current_lock->is_table()
+ ? lock_rec_get_prev(iter->current_lock, iter->bit_no)
+ : UT_LIST_GET_PREV(un_member.tab_lock.locks, iter->current_lock);
+
+ if (prev_lock)
+ iter->current_lock= prev_lock;
+
+ return prev_lock;
+}