summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-07-23 13:31:10 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2018-07-23 17:49:01 +0300
commit73af07536612e4f76ca24974cfa17ddd282d50a1 (patch)
tree2faf4899917653c945ceea7d5418b6a2f07c5add
parentd0d073b1aaa30997307bc7aa686d3715f8c22da0 (diff)
downloadmariadb-git-73af07536612e4f76ca24974cfa17ddd282d50a1.tar.gz
Reduce the number of rw_lock_own() calls
Replace pairs of rw_lock_own() calls with calls to rw_lock_own_flagged(). These calls are only present in debug builds.
-rw-r--r--storage/innobase/btr/btr0sea.cc24
-rw-r--r--storage/innobase/buf/buf0buf.cc17
-rw-r--r--storage/innobase/buf/buf0lru.cc9
-rw-r--r--storage/innobase/gis/gis0sea.cc5
-rw-r--r--storage/innobase/include/ha0ha.ic8
-rw-r--r--storage/innobase/include/sync0rw.ic3
-rw-r--r--storage/innobase/row/row0log.cc4
-rw-r--r--storage/innobase/row/row0sel.cc4
-rw-r--r--storage/innobase/row/row0umod.cc4
-rw-r--r--storage/innobase/sync/sync0rw.cc8
-rw-r--r--storage/innobase/trx/trx0i_s.cc22
11 files changed, 49 insertions, 59 deletions
diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc
index 7419ed2bfd5..829e0c47e39 100644
--- a/storage/innobase/btr/btr0sea.cc
+++ b/storage/innobase/btr/btr0sea.cc
@@ -529,10 +529,10 @@ btr_search_update_block_hash_info(
buf_block_t* block,
const btr_cur_t* cursor)
{
- ut_ad(!rw_lock_own(btr_get_search_latch(cursor->index), RW_LOCK_S));
- ut_ad(!rw_lock_own(btr_get_search_latch(cursor->index), RW_LOCK_X));
- ut_ad(rw_lock_own(&block->lock, RW_LOCK_S)
- || rw_lock_own(&block->lock, RW_LOCK_X));
+ ut_ad(!rw_lock_own_flagged(btr_get_search_latch(cursor->index),
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
+ ut_ad(rw_lock_own_flagged(&block->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
info->last_hash_succ = FALSE;
@@ -607,8 +607,8 @@ btr_search_update_hash_ref(
ut_ad(cursor->flag == BTR_CUR_HASH_FAIL);
ut_ad(rw_lock_own(btr_get_search_latch(cursor->index), RW_LOCK_X));
- ut_ad(rw_lock_own(&(block->lock), RW_LOCK_S)
- || rw_lock_own(&(block->lock), RW_LOCK_X));
+ ut_ad(rw_lock_own_flagged(&block->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(page_align(btr_cur_get_rec(cursor)) == block->frame);
ut_ad(page_is_leaf(block->frame));
assert_block_ahi_valid(block);
@@ -667,8 +667,8 @@ btr_search_info_update_slow(
buf_block_t* block;
ibool build_index;
- ut_ad(!rw_lock_own(btr_get_search_latch(cursor->index), RW_LOCK_S));
- ut_ad(!rw_lock_own(btr_get_search_latch(cursor->index), RW_LOCK_X));
+ ut_ad(!rw_lock_own_flagged(btr_get_search_latch(cursor->index),
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
block = btr_cur_get_block(cursor);
@@ -1138,8 +1138,8 @@ retry:
ut_ad(block->page.buf_fix_count == 0
|| buf_block_get_state(block) == BUF_BLOCK_REMOVE_HASH
- || rw_lock_own(&block->lock, RW_LOCK_S)
- || rw_lock_own(&block->lock, RW_LOCK_X));
+ || rw_lock_own_flagged(&block->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(page_is_leaf(block->frame));
/* We must not dereference index here, because it could be freed
@@ -1393,8 +1393,8 @@ btr_search_build_page_hash_index(
ut_ad(page_is_leaf(block->frame));
ut_ad(!rw_lock_own(btr_get_search_latch(index), RW_LOCK_X));
- ut_ad(rw_lock_own(&(block->lock), RW_LOCK_S)
- || rw_lock_own(&(block->lock), RW_LOCK_X));
+ ut_ad(rw_lock_own_flagged(&block->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
btr_search_s_lock(index);
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index 30fe1f8f616..0a5a59c9829 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -4448,8 +4448,9 @@ loop:
case BUF_GET_IF_IN_POOL_OR_WATCH:
case BUF_PEEK_IF_IN_POOL:
case BUF_EVICT_IF_IN_POOL:
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
+ ut_ad(!rw_lock_own_flagged(
+ hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
return(NULL);
}
@@ -4785,8 +4786,8 @@ evict_from_pool:
ut_ad(block == fix_block);
ut_ad(fix_block->page.buf_fix_count > 0);
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
+ ut_ad(!rw_lock_own_flagged(hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(buf_block_get_state(fix_block) == BUF_BLOCK_FILE_PAGE);
@@ -4962,8 +4963,8 @@ evict_from_pool:
ut_a(ibuf_count_get(fix_block->page.id) == 0);
#endif
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
+ ut_ad(!rw_lock_own_flagged(hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
return(fix_block);
}
@@ -5639,8 +5640,8 @@ func_exit:
ibuf_mtr_commit(&mtr);
}
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X));
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_S));
+ ut_ad(!rw_lock_own_flagged(hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(!bpage || buf_page_in_file(bpage));
return(bpage);
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index 71144ee0f6e..d71d9d08511 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -1630,8 +1630,8 @@ func_exit:
}
/* buf_LRU_block_remove_hashed() releases the hash_lock */
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X)
- && !rw_lock_own(hash_lock, RW_LOCK_S));
+ ut_ad(!rw_lock_own_flagged(hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
/* We have just freed a BUF_BLOCK_FILE_PAGE. If b != NULL
then it was a compressed page with an uncompressed frame and
@@ -2184,9 +2184,8 @@ buf_LRU_free_one_page(
}
/* buf_LRU_block_remove_hashed() releases hash_lock and block_mutex */
- ut_ad(!rw_lock_own(hash_lock, RW_LOCK_X)
- && !rw_lock_own(hash_lock, RW_LOCK_S));
-
+ ut_ad(!rw_lock_own_flagged(hash_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(!mutex_own(block_mutex));
}
diff --git a/storage/innobase/gis/gis0sea.cc b/storage/innobase/gis/gis0sea.cc
index 173fc76ddfc..c45f2ecec59 100644
--- a/storage/innobase/gis/gis0sea.cc
+++ b/storage/innobase/gis/gis0sea.cc
@@ -258,9 +258,8 @@ rtr_pcur_getnext_from_path(
rtr_info->tree_savepoints[tree_idx] = mtr_set_savepoint(mtr);
#ifdef UNIV_RTR_DEBUG
- ut_ad(!(rw_lock_own(&btr_cur->page_cur.block->lock, RW_LOCK_X)
- ||
- rw_lock_own(&btr_cur->page_cur.block->lock, RW_LOCK_S))
+ ut_ad(!(rw_lock_own_flagged(&btr_cur->page_cur.block->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S))
|| my_latch_mode == BTR_MODIFY_TREE
|| my_latch_mode == BTR_CONT_MODIFY_TREE
|| !page_is_leaf(buf_block_get_frame(
diff --git a/storage/innobase/include/ha0ha.ic b/storage/innobase/include/ha0ha.ic
index 1513df209ad..3c699ab9b0c 100644
--- a/storage/innobase/include/ha0ha.ic
+++ b/storage/innobase/include/ha0ha.ic
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2018, 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
@@ -137,11 +138,8 @@ hash_assert_can_search(
if (table->type == HASH_TABLE_SYNC_MUTEX) {
ut_ad(mutex_own(hash_get_mutex(table, fold)));
} else if (table->type == HASH_TABLE_SYNC_RW_LOCK) {
-# ifdef UNIV_DEBUG
- rw_lock_t* lock = hash_get_lock(table, fold);
- ut_ad(rw_lock_own(lock, RW_LOCK_X)
- || rw_lock_own(lock, RW_LOCK_S));
-# endif
+ ut_ad(rw_lock_own_flagged(hash_get_lock(table, fold),
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
} else {
ut_ad(table->type == HASH_TABLE_SYNC_NONE);
}
diff --git a/storage/innobase/include/sync0rw.ic b/storage/innobase/include/sync0rw.ic
index 21872cc8bee..404c7cb9b86 100644
--- a/storage/innobase/include/sync0rw.ic
+++ b/storage/innobase/include/sync0rw.ic
@@ -281,8 +281,7 @@ rw_lock_s_lock_func(
the threads which have s-locked a latch. This would use some CPU
time. */
- ut_ad(!rw_lock_own(lock, RW_LOCK_S)); /* see NOTE above */
- ut_ad(!rw_lock_own(lock, RW_LOCK_X));
+ ut_ad(!rw_lock_own_flagged(lock, RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
if (!rw_lock_s_lock_low(lock, pass, file_name, line)) {
diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc
index 55500b9533d..7e6760da372 100644
--- a/storage/innobase/row/row0log.cc
+++ b/storage/innobase/row/row0log.cc
@@ -290,8 +290,8 @@ row_log_online_op(
ut_ad(dtuple_validate(tuple));
ut_ad(dtuple_get_n_fields(tuple) == dict_index_get_n_fields(index));
- ut_ad(rw_lock_own(dict_index_get_lock(index), RW_LOCK_S)
- || rw_lock_own(dict_index_get_lock(index), RW_LOCK_X));
+ ut_ad(rw_lock_own_flagged(&index->lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
if (index->is_corrupted()) {
return;
diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc
index 68a81615e88..d21fd4a10ed 100644
--- a/storage/innobase/row/row0sel.cc
+++ b/storage/innobase/row/row0sel.cc
@@ -1102,8 +1102,8 @@ sel_set_rtr_rec_lock(
rw_lock_x_lock(&(match->block.lock));
retry:
cur_block = btr_pcur_get_block(pcur);
- ut_ad(rw_lock_own(&(match->block.lock), RW_LOCK_X)
- || rw_lock_own(&(match->block.lock), RW_LOCK_S));
+ ut_ad(rw_lock_own_flagged(&match->block.lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
ut_ad(page_is_leaf(buf_block_get_frame(cur_block)));
err = lock_sec_rec_read_check_and_lock(
diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc
index 5f28f096286..b5c8d7c4ce2 100644
--- a/storage/innobase/row/row0umod.cc
+++ b/storage/innobase/row/row0umod.cc
@@ -265,8 +265,8 @@ row_undo_mod_clust(
ut_ad(thr_get_trx(thr) == node->trx);
ut_ad(node->trx->dict_operation_lock_mode);
ut_ad(node->trx->in_rollback);
- ut_ad(rw_lock_own(dict_operation_lock, RW_LOCK_S)
- || rw_lock_own(dict_operation_lock, RW_LOCK_X));
+ ut_ad(rw_lock_own_flagged(dict_operation_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
log_free_check();
pcur = &node->pcur;
diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc
index 37b64910713..c985cf9ee82 100644
--- a/storage/innobase/sync/sync0rw.cc
+++ b/storage/innobase/sync/sync0rw.cc
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc.
-Copyright (c) 2017, MariaDB Corporation.
+Copyright (c) 2017, 2018, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -1097,12 +1097,12 @@ rw_lock_own_flagged(
const rw_lock_debug_t* info = *it;
- ut_ad(os_thread_eq(info->thread_id, os_thread_get_curr_id()));
-
- if (info->pass != 0) {
+ if (info->pass) {
continue;
}
+ ut_ad(os_thread_eq(info->thread_id, os_thread_get_curr_id()));
+
switch (info->lock_type) {
case RW_LOCK_S:
diff --git a/storage/innobase/trx/trx0i_s.cc b/storage/innobase/trx/trx0i_s.cc
index f0dc2fb78bd..363b61b0cfe 100644
--- a/storage/innobase/trx/trx0i_s.cc
+++ b/storage/innobase/trx/trx0i_s.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2017, MariaDB Corporation.
+Copyright (c) 2017, 2018, 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
@@ -1510,26 +1510,20 @@ cache_select_table(
trx_i_s_cache_t* cache, /*!< in: whole cache */
enum i_s_table table) /*!< in: which table */
{
- i_s_table_cache_t* table_cache;
-
- ut_ad(rw_lock_own(cache->rw_lock, RW_LOCK_S)
- || rw_lock_own(cache->rw_lock, RW_LOCK_X));
+ ut_ad(rw_lock_own_flagged(cache->rw_lock,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
switch (table) {
case I_S_INNODB_TRX:
- table_cache = &cache->innodb_trx;
- break;
+ return &cache->innodb_trx;
case I_S_INNODB_LOCKS:
- table_cache = &cache->innodb_locks;
- break;
+ return &cache->innodb_locks;
case I_S_INNODB_LOCK_WAITS:
- table_cache = &cache->innodb_lock_waits;
- break;
- default:
- ut_error;
+ return &cache->innodb_lock_waits;
}
- return(table_cache);
+ ut_error;
+ return NULL;
}
/*******************************************************************//**