summaryrefslogtreecommitdiff
path: root/storage/innobase/include/sync0types.h
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/include/sync0types.h')
-rw-r--r--storage/innobase/include/sync0types.h967
1 files changed, 0 insertions, 967 deletions
diff --git a/storage/innobase/include/sync0types.h b/storage/innobase/include/sync0types.h
deleted file mode 100644
index f8df704c9d9..00000000000
--- a/storage/innobase/include/sync0types.h
+++ /dev/null
@@ -1,967 +0,0 @@
-/*****************************************************************************
-
-Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, 2020, 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 include/sync0types.h
-Global types for sync
-
-Created 9/5/1995 Heikki Tuuri
-*******************************************************/
-
-#ifndef sync0types_h
-#define sync0types_h
-
-#include <vector>
-
-#include "ut0new.h"
-
-#ifdef _WIN32
-/** Native mutex */
-typedef CRITICAL_SECTION sys_mutex_t;
-#else
-/** Native mutex */
-typedef pthread_mutex_t sys_mutex_t;
-#endif /* _WIN32 */
-
-/** Mutex states. */
-enum mutex_state_t {
- /** Mutex is free */
- MUTEX_STATE_UNLOCKED = 0,
-
- /** Mutex is acquired by some thread. */
- MUTEX_STATE_LOCKED = 1,
-
- /** Mutex is contended and there are threads waiting on the lock. */
- MUTEX_STATE_WAITERS = 2
-};
-
-/*
- LATCHING ORDER WITHIN THE DATABASE
- ==================================
-
-The mutex or latch in the central memory object, for instance, a rollback
-segment object, must be acquired before acquiring the latch or latches to
-the corresponding file data structure. In the latching order below, these
-file page object latches are placed immediately below the corresponding
-central memory object latch or mutex.
-
-Synchronization object Notes
----------------------- -----
-
-Dictionary mutex If we have a pointer to a dictionary
-| object, e.g., a table, it can be
-| accessed without reserving the
-| dictionary mutex. We must have a
-| reservation, a memoryfix, to the
-| appropriate table object in this case,
-| and the table must be explicitly
-| released later.
-V
-Dictionary header
-|
-V
-Secondary index tree latch The tree latch protects also all
-| the B-tree non-leaf pages. These
-V can be read with the page only
-Secondary index non-leaf bufferfixed to save CPU time,
-| no s-latch is needed on the page.
-| Modification of a page requires an
-| x-latch on the page, however. If a
-| thread owns an x-latch to the tree,
-| it is allowed to latch non-leaf pages
-| even after it has acquired the fsp
-| latch.
-V
-Secondary index leaf The latch on the secondary index leaf
-| can be kept while accessing the
-| clustered index, to save CPU time.
-V
-Clustered index tree latch To increase concurrency, the tree
-| latch is usually released when the
-| leaf page latch has been acquired.
-V
-Clustered index non-leaf
-|
-V
-Clustered index leaf
-|
-V
-Transaction system header
-|
-V
-Rollback segment mutex The rollback segment mutex must be
-| reserved, if, e.g., a new page must
-| be added to an undo log. The rollback
-| segment and the undo logs in its
-| history list can be seen as an
-| analogue of a B-tree, and the latches
-| reserved similarly, using a version of
-| lock-coupling. If an undo log must be
-| extended by a page when inserting an
-| undo log record, this corresponds to
-| a pessimistic insert in a B-tree.
-V
-Rollback segment header
-|
-V
-Purge system latch
-|
-V
-Undo log pages If a thread owns the trx undo mutex,
-| or for a log in the history list, the
-| rseg mutex, it is allowed to latch
-| undo log pages in any order, and even
-| after it has acquired the fsp latch.
-| If a thread does not have the
-| appropriate mutex, it is allowed to
-| latch only a single undo log page in
-| a mini-transaction.
-V
-File space management latch If a mini-transaction must allocate
-| several file pages, it can do that,
-| because it keeps the x-latch to the
-| file space management in its memo.
-V
-File system pages
-|
-V
-lock_sys.wait_mutex Mutex protecting lock timeout data
-|
-V
-lock_sys.mutex Mutex protecting lock_sys_t
-|
-V
-trx_sys.mutex Mutex protecting trx_sys.trx_list
-|
-V
-Threads mutex Background thread scheduling mutex
-|
-V
-query_thr_mutex Mutex protecting query threads
-|
-V
-trx_mutex Mutex protecting trx_t fields
-|
-V
-Search system mutex
-|
-V
-Buffer pool mutex
-|
-V
-Log mutex
-|
-Any other latch
-|
-V
-Memory pool mutex */
-
-/** Latching order levels. If you modify these, you have to also update
-LatchDebug internals in sync0debug.cc */
-
-enum latch_level_t {
- SYNC_UNKNOWN = 0,
-
- RW_LOCK_SX,
- RW_LOCK_X_WAIT,
- RW_LOCK_S,
- RW_LOCK_X,
- RW_LOCK_NOT_LOCKED,
-
- SYNC_ANY_LATCH,
-
- SYNC_POOL,
- SYNC_POOL_MANAGER,
-
- SYNC_PURGE_QUEUE,
- SYNC_RW_TRX_HASH_ELEMENT,
- SYNC_READ_VIEW,
- SYNC_TRX_SYS,
-
- SYNC_INDEX_ONLINE_LOG,
-
- SYNC_IBUF_BITMAP_MUTEX,
-
- SYNC_IBUF_MUTEX,
-
- SYNC_NOREDO_RSEG,
- SYNC_REDO_RSEG,
- SYNC_IBUF_PESS_INSERT_MUTEX,
-
- SYNC_STATS_AUTO_RECALC,
- SYNC_DICT,
-
- /** This can be used to suppress order checking. */
- SYNC_NO_ORDER_CHECK,
-
- /** Maximum level value */
- SYNC_LEVEL_MAX = SYNC_NO_ORDER_CHECK
-};
-
-/** Each latch has an ID. This id is used for creating the latch and to look
-up its meta-data. See sync0debug.cc. */
-enum latch_id_t {
- LATCH_ID_NONE = 0,
- LATCH_ID_DICT_FOREIGN_ERR,
- LATCH_ID_DICT_SYS,
- LATCH_ID_FIL_SYSTEM,
- LATCH_ID_IBUF_BITMAP,
- LATCH_ID_IBUF,
- LATCH_ID_IBUF_PESSIMISTIC_INSERT,
- LATCH_ID_PURGE_SYS_PQ,
- LATCH_ID_RECALC_POOL,
- LATCH_ID_REDO_RSEG,
- LATCH_ID_NOREDO_RSEG,
- LATCH_ID_RTR_ACTIVE_MUTEX,
- LATCH_ID_RTR_MATCH_MUTEX,
- LATCH_ID_RTR_PATH_MUTEX,
- LATCH_ID_SRV_INNODB_MONITOR,
- LATCH_ID_SRV_MISC_TMPFILE,
- LATCH_ID_SRV_MONITOR_FILE,
- LATCH_ID_TRX_POOL,
- LATCH_ID_TRX_POOL_MANAGER,
- LATCH_ID_TRX_SYS,
- LATCH_ID_SRV_SYS_TASKS,
- LATCH_ID_PAGE_ZIP_STAT_PER_INDEX,
- LATCH_ID_SYNC_ARRAY_MUTEX,
- LATCH_ID_ROW_DROP_LIST,
- LATCH_ID_INDEX_ONLINE_LOG,
- LATCH_ID_DICT_TABLE_STATS,
- LATCH_ID_DEFRAGMENT_MUTEX,
- LATCH_ID_RW_TRX_HASH_ELEMENT,
- LATCH_ID_READ_VIEW,
- LATCH_ID_MAX = LATCH_ID_READ_VIEW
-};
-
-#ifndef UNIV_INNOCHECKSUM
-/** OS mutex, without any policy. It is a thin wrapper around the
-system mutexes. The interface is different from the policy mutexes,
-to ensure that it is called directly and not confused with the
-policy mutexes. */
-struct OSMutex {
-
- /** Constructor */
- OSMutex()
- UNIV_NOTHROW
- {
- ut_d(m_freed = true);
- }
-
- /** Create the mutex by calling the system functions. */
- void init()
- UNIV_NOTHROW
- {
- ut_ad(m_freed);
-
-#ifdef _WIN32
- InitializeCriticalSection((LPCRITICAL_SECTION) &m_mutex);
-#else
- {
- int ret = pthread_mutex_init(&m_mutex, NULL);
- ut_a(ret == 0);
- }
-#endif /* _WIN32 */
-
- ut_d(m_freed = false);
- }
-
- /** Destructor */
- ~OSMutex() { }
-
- /** Destroy the mutex */
- void destroy()
- UNIV_NOTHROW
- {
- ut_ad(!m_freed);
-#ifdef _WIN32
- DeleteCriticalSection((LPCRITICAL_SECTION) &m_mutex);
-#else
- int ret;
-
- ret = pthread_mutex_destroy(&m_mutex);
-
- if (ret != 0) {
-
- ib::error()
- << "Return value " << ret << " when calling "
- << "pthread_mutex_destroy().";
- }
-#endif /* _WIN32 */
- ut_d(m_freed = true);
- }
-
- /** Release the mutex. */
- void exit()
- UNIV_NOTHROW
- {
- ut_ad(!m_freed);
-#ifdef _WIN32
- LeaveCriticalSection(&m_mutex);
-#else
- int ret = pthread_mutex_unlock(&m_mutex);
- ut_a(ret == 0);
-#endif /* _WIN32 */
- }
-
- /** Acquire the mutex. */
- void enter()
- UNIV_NOTHROW
- {
- ut_ad(!m_freed);
-#ifdef _WIN32
- EnterCriticalSection((LPCRITICAL_SECTION) &m_mutex);
-#else
- int ret = pthread_mutex_lock(&m_mutex);
- ut_a(ret == 0);
-#endif /* _WIN32 */
- }
-
- /** @return true if locking succeeded */
- bool try_lock()
- UNIV_NOTHROW
- {
- ut_ad(!m_freed);
-#ifdef _WIN32
- return(TryEnterCriticalSection(&m_mutex) != 0);
-#else
- return(pthread_mutex_trylock(&m_mutex) == 0);
-#endif /* _WIN32 */
- }
-
- /** Required for os_event_t */
- operator sys_mutex_t*()
- UNIV_NOTHROW
- {
- return(&m_mutex);
- }
-
-private:
-#ifdef DBUG_ASSERT_EXISTS
- /** true if the mutex has been freed/destroyed. */
- bool m_freed;
-#endif /* DBUG_ASSERT_EXISTS */
-
- sys_mutex_t m_mutex;
-};
-
-#ifdef UNIV_PFS_MUTEX
-/** Latch element.
-Used for mutexes which have PFS keys defined under UNIV_PFS_MUTEX.
-@param[in] id Latch id
-@param[in] level Latch level
-@param[in] key PFS key */
-# define LATCH_ADD_MUTEX(id, level, key) latch_meta[LATCH_ID_ ## id] =\
- UT_NEW_NOKEY(latch_meta_t(LATCH_ID_ ## id, #id, level, #level, key))
-
-#ifdef UNIV_PFS_RWLOCK
-/** Latch element.
-Used for rwlocks which have PFS keys defined under UNIV_PFS_RWLOCK.
-@param[in] id Latch id
-@param[in] level Latch level
-@param[in] key PFS key */
-# define LATCH_ADD_RWLOCK(id, level, key) latch_meta[LATCH_ID_ ## id] =\
- UT_NEW_NOKEY(latch_meta_t(LATCH_ID_ ## id, #id, level, #level, key))
-#else
-# define LATCH_ADD_RWLOCK(id, level, key) latch_meta[LATCH_ID_ ## id] =\
- UT_NEW_NOKEY(latch_meta_t(LATCH_ID_ ## id, #id, level, #level, \
- PSI_NOT_INSTRUMENTED))
-#endif /* UNIV_PFS_RWLOCK */
-
-#else
-# define LATCH_ADD_MUTEX(id, level, key) latch_meta[LATCH_ID_ ## id] =\
- UT_NEW_NOKEY(latch_meta_t(LATCH_ID_ ## id, #id, level, #level))
-# define LATCH_ADD_RWLOCK(id, level, key) latch_meta[LATCH_ID_ ## id] =\
- UT_NEW_NOKEY(latch_meta_t(LATCH_ID_ ## id, #id, level, #level))
-#endif /* UNIV_PFS_MUTEX */
-
-/** Default latch counter */
-class LatchCounter {
-
-public:
- /** The counts we collect for a mutex */
- struct Count {
-
- /** Constructor */
- Count()
- UNIV_NOTHROW
- :
- m_spins(),
- m_waits(),
- m_calls(),
- m_enabled()
- {
- /* No op */
- }
-
- /** Rest the values to zero */
- void reset()
- UNIV_NOTHROW
- {
- m_spins = 0;
- m_waits = 0;
- m_calls = 0;
- }
-
- /** Number of spins trying to acquire the latch. */
- uint32_t m_spins;
-
- /** Number of waits trying to acquire the latch */
- uint32_t m_waits;
-
- /** Number of times it was called */
- uint32_t m_calls;
-
- /** true if enabled */
- bool m_enabled;
- };
-
- /** Constructor */
- LatchCounter()
- UNIV_NOTHROW
- :
- m_active(false)
- {
- m_mutex.init();
- }
-
- /** Destructor */
- ~LatchCounter()
- UNIV_NOTHROW
- {
- m_mutex.destroy();
-
- for (Counters::iterator it = m_counters.begin();
- it != m_counters.end();
- ++it) {
-
- Count* count = *it;
-
- UT_DELETE(count);
- }
- }
-
- /** Reset all counters to zero. It is not protected by any
- mutex and we don't care about atomicity. Unless it is a
- demonstrated problem. The information collected is not
- required for the correct functioning of the server. */
- void reset()
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- Counters::iterator end = m_counters.end();
-
- for (Counters::iterator it = m_counters.begin();
- it != end;
- ++it) {
-
- (*it)->reset();
- }
-
- m_mutex.exit();
- }
-
- /** @return the aggregate counter */
- Count* sum_register()
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- Count* count;
-
- if (m_counters.empty()) {
- count = UT_NEW_NOKEY(Count());
- m_counters.push_back(count);
- } else {
- ut_a(m_counters.size() == 1);
- count = m_counters[0];
- }
-
- m_mutex.exit();
-
- return(count);
- }
-
- /** Register a single instance counter */
- void single_register(Count* count)
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- m_counters.push_back(count);
-
- m_mutex.exit();
- }
-
- /** Deregister a single instance counter
- @param[in] count The count instance to deregister */
- void single_deregister(Count* count)
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- m_counters.erase(
- std::remove(
- m_counters.begin(),
- m_counters.end(), count),
- m_counters.end());
-
- m_mutex.exit();
- }
-
- /** Iterate over the counters */
- template<typename C> void iterate(const C& callback) UNIV_NOTHROW
- {
- m_mutex.enter();
-
- Counters::const_iterator end = m_counters.end();
-
- for (Counters::const_iterator it = m_counters.begin();
- it != end;
- ++it) {
-
- callback(*it);
- }
-
- m_mutex.exit();
- }
-
- /** Disable the monitoring */
- void enable()
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- Counters::const_iterator end = m_counters.end();
-
- for (Counters::const_iterator it = m_counters.begin();
- it != end;
- ++it) {
-
- (*it)->m_enabled = true;
- }
-
- m_active = true;
-
- m_mutex.exit();
- }
-
- /** Disable the monitoring */
- void disable()
- UNIV_NOTHROW
- {
- m_mutex.enter();
-
- Counters::const_iterator end = m_counters.end();
-
- for (Counters::const_iterator it = m_counters.begin();
- it != end;
- ++it) {
-
- (*it)->m_enabled = false;
- }
-
- m_active = false;
-
- m_mutex.exit();
- }
-
- /** @return if monitoring is active */
- bool is_enabled() const
- UNIV_NOTHROW
- {
- return(m_active);
- }
-
-private:
- /* Disable copying */
- LatchCounter(const LatchCounter&);
- LatchCounter& operator=(const LatchCounter&);
-
-private:
- typedef OSMutex Mutex;
- typedef std::vector<Count*> Counters;
-
- /** Mutex protecting m_counters */
- Mutex m_mutex;
-
- /** Counters for the latches */
- Counters m_counters;
-
- /** if true then we collect the data */
- bool m_active;
-};
-
-/** Latch meta data */
-template <typename Counter = LatchCounter>
-class LatchMeta {
-
-public:
- typedef Counter CounterType;
-
-#ifdef UNIV_PFS_MUTEX
- typedef mysql_pfs_key_t pfs_key_t;
-#endif /* UNIV_PFS_MUTEX */
-
- /** Constructor */
- LatchMeta()
- :
- m_id(LATCH_ID_NONE),
- m_name(),
- m_level(SYNC_UNKNOWN),
- m_level_name()
-#ifdef UNIV_PFS_MUTEX
- ,m_pfs_key()
-#endif /* UNIV_PFS_MUTEX */
- {
- }
-
- /** Destructor */
- ~LatchMeta() { }
-
- /** Constructor
- @param[in] id Latch id
- @param[in] name Latch name
- @param[in] level Latch level
- @param[in] level_name Latch level text representation
- @param[in] key PFS key */
- LatchMeta(
- latch_id_t id,
- const char* name,
- latch_level_t level,
- const char* level_name
-#ifdef UNIV_PFS_MUTEX
- ,pfs_key_t key
-#endif /* UNIV_PFS_MUTEX */
- )
- :
- m_id(id),
- m_name(name),
- m_level(level),
- m_level_name(level_name)
-#ifdef UNIV_PFS_MUTEX
- ,m_pfs_key(key)
-#endif /* UNIV_PFS_MUTEX */
- {
- /* No op */
- }
-
- /* Less than operator.
- @param[in] rhs Instance to compare against
- @return true if this.get_id() < rhs.get_id() */
- bool operator<(const LatchMeta& rhs) const
- {
- return(get_id() < rhs.get_id());
- }
-
- /** @return the latch id */
- latch_id_t get_id() const
- {
- return(m_id);
- }
-
- /** @return the latch name */
- const char* get_name() const
- {
- return(m_name);
- }
-
- /** @return the latch level */
- latch_level_t get_level() const
- {
- return(m_level);
- }
-
- /** @return the latch level name */
- const char* get_level_name() const
- {
- return(m_level_name);
- }
-
-#ifdef UNIV_PFS_MUTEX
- /** @return the PFS key for the latch */
- pfs_key_t get_pfs_key() const
- {
- return(m_pfs_key);
- }
-#endif /* UNIV_PFS_MUTEX */
-
- /** @return the counter instance */
- Counter* get_counter()
- {
- return(&m_counter);
- }
-
-private:
- /** Latch id */
- latch_id_t m_id;
-
- /** Latch name */
- const char* m_name;
-
- /** Latch level in the ordering */
- latch_level_t m_level;
-
- /** Latch level text representation */
- const char* m_level_name;
-
-#ifdef UNIV_PFS_MUTEX
- /** PFS key */
- pfs_key_t m_pfs_key;
-#endif /* UNIV_PFS_MUTEX */
-
- /** For gathering latch statistics */
- Counter m_counter;
-};
-
-typedef LatchMeta<LatchCounter> latch_meta_t;
-typedef std::vector<latch_meta_t*, ut_allocator<latch_meta_t*> > LatchMetaData;
-
-/** Note: This is accessed without any mutex protection. It is initialised
-at startup and elements should not be added to or removed from it after
-that. See sync_latch_meta_init() */
-extern LatchMetaData latch_meta;
-
-/** Get the latch meta-data from the latch ID
-@param[in] id Latch ID
-@return the latch meta data */
-inline
-latch_meta_t&
-sync_latch_get_meta(latch_id_t id)
-{
- ut_ad(static_cast<size_t>(id) < latch_meta.size());
- ut_ad(id == latch_meta[id]->get_id());
-
- return(*latch_meta[id]);
-}
-
-/** Fetch the counter for the latch
-@param[in] id Latch ID
-@return the latch counter */
-inline
-latch_meta_t::CounterType*
-sync_latch_get_counter(latch_id_t id)
-{
- latch_meta_t& meta = sync_latch_get_meta(id);
-
- return(meta.get_counter());
-}
-
-/** Get the latch name from the latch ID
-@param[in] id Latch ID
-@return the name, will assert if not found */
-inline
-const char*
-sync_latch_get_name(latch_id_t id)
-{
- const latch_meta_t& meta = sync_latch_get_meta(id);
-
- return(meta.get_name());
-}
-
-/** Get the latch ordering level
-@param[in] id Latch id to lookup
-@return the latch level */
-inline
-latch_level_t
-sync_latch_get_level(latch_id_t id)
-{
- const latch_meta_t& meta = sync_latch_get_meta(id);
-
- return(meta.get_level());
-}
-
-#ifdef UNIV_PFS_MUTEX
-/** Get the latch PFS key from the latch ID
-@param[in] id Latch ID
-@return the PFS key */
-inline
-mysql_pfs_key_t
-sync_latch_get_pfs_key(latch_id_t id)
-{
- const latch_meta_t& meta = sync_latch_get_meta(id);
-
- return(meta.get_pfs_key());
-}
-#endif
-
-/** String representation of the filename and line number where the
-latch was created
-@param[in] id Latch ID
-@param[in] created Filename and line number where it was crated
-@return the string representation */
-std::string
-sync_mutex_to_string(
- latch_id_t id,
- const std::string& created);
-
-/** Get the latch name from a sync level
-@param[in] level Latch level to lookup
-@return 0 if not found. */
-const char*
-sync_latch_get_name(latch_level_t level);
-
-/** Print the filename "basename"
-@return the basename */
-const char*
-sync_basename(const char* filename);
-
-#ifdef UNIV_DEBUG
-
-/** All (ordered) latches, used in debugging, must derive from this class. */
-struct latch_t {
-
- /** Constructor
- @param[in] id The latch ID */
- explicit latch_t(latch_id_t id = LATCH_ID_NONE)
- UNIV_NOTHROW
- : m_id(id) {}
-
- /** Destructor */
- virtual ~latch_t() UNIV_NOTHROW { }
-
- /** @return the latch ID */
- latch_id_t get_id() const
- {
- return(m_id);
- }
-
- /** Print the latch context
- @return the string representation */
- virtual std::string to_string() const = 0;
-
- /** @return the latch level */
- latch_level_t get_level() const
- UNIV_NOTHROW
- {
- ut_a(m_id != LATCH_ID_NONE);
-
- return(sync_latch_get_level(m_id));
- }
-
- /** @return the latch name, m_id must be set */
- const char* get_name() const
- UNIV_NOTHROW
- {
- ut_a(m_id != LATCH_ID_NONE);
-
- return(sync_latch_get_name(m_id));
- }
-
- /** Latch ID */
- latch_id_t m_id;
-};
-
-/** Subclass this to iterate over a thread's acquired latch levels. */
-struct sync_check_functor_t {
- virtual ~sync_check_functor_t() { }
- virtual bool operator()(const latch_level_t) const = 0;
-};
-
-/** Check that no latch is being held.
-@tparam some_allowed whether some latches are allowed to be held */
-template<bool some_allowed = false>
-struct sync_checker : public sync_check_functor_t
-{
- /** Check the latching constraints
- @param[in] level The level held by the thread
- @return whether a latch violation was detected */
- bool operator()(const latch_level_t level) const override
- {
- if (some_allowed) {
- switch (level) {
- case SYNC_DICT:
- case SYNC_NO_ORDER_CHECK:
- return(false);
- default:
- return(true);
- }
- }
-
- return(true);
- }
-};
-
-/** The strict latch checker (no InnoDB latches may be held) */
-typedef struct sync_checker<false> sync_check;
-/** The sloppy latch checker (can hold InnoDB dictionary or SQL latches) */
-typedef struct sync_checker<true> dict_sync_check;
-
-/** Functor to check for given latching constraints. */
-struct sync_allowed_latches : public sync_check_functor_t {
-
- /** Constructor
- @param[in] from first element in an array of latch_level_t
- @param[in] to last element in an array of latch_level_t */
- sync_allowed_latches(
- const latch_level_t* from,
- const latch_level_t* to)
- : begin(from), end(to) { }
-
- /** Checks whether the given latch_t violates the latch constraint.
- This object maintains a list of allowed latch levels, and if the given
- latch belongs to a latch level that is not there in the allowed list,
- then it is a violation.
-
- @param[in] latch The latch level to check
- @return true if there is a latch violation */
- bool operator()(const latch_level_t level) const override
- {
- return(std::find(begin, end, level) == end);
- }
-
-private:
- /** First element in an array of allowed latch levels */
- const latch_level_t* const begin;
- /** First element after the end of the array of allowed latch levels */
- const latch_level_t* const end;
-};
-
-/** Get the latch id from a latch name.
-@param[in] id Latch name
-@return LATCH_ID_NONE. */
-latch_id_t
-sync_latch_get_id(const char* name);
-#endif /* UNIV_DBEUG */
-
-#endif /* UNIV_INNOCHECKSUM */
-
-/** Simple non-atomic counter aligned to CACHE_LINE_SIZE
-@tparam Type the integer type of the counter */
-template <typename Type>
-struct MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) simple_counter
-{
- /** Increment the counter */
- Type inc() { return add(1); }
- /** Decrement the counter */
- Type dec() { return add(Type(~0)); }
-
- /** Add to the counter
- @param[in] i amount to be added
- @return the value of the counter after adding */
- Type add(Type i) { return m_counter += i; }
-
- /** @return the value of the counter */
- operator Type() const { return m_counter; }
-
-private:
- /** The counter */
- Type m_counter;
-};
-#endif /* sync0types_h */