mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
Merge a change from mysql-5.1-innodb:
------------------------------------------------------------ revno: 3491 revision-id: marko.makela@oracle.com-20100601134335-ccthwwru23kn09qw parent: marko.makela@oracle.com-20100601120751-1uq7bbta5n7ts0qr committer: Marko Mäkelä <marko.makela@oracle.com> branch nick: 5.1-innodb timestamp: Tue 2010-06-01 16:43:35 +0300 message: Bug#48197: Concurrent rw_lock_free may cause assertion failure rw_lock_t: Remove magic_n unless UNIV_DEBUG is defined. rw_lock_free(): Invalidate magic_n only after removing from rw_lock_list.
This commit is contained in:
parent
bf158eed83
commit
7d5e44460c
2 changed files with 13 additions and 16 deletions
|
@ -622,11 +622,12 @@ struct rw_lock_struct {
|
|||
unsigned cline:14; /*!< Line where created */
|
||||
unsigned last_s_line:14; /*!< Line number where last time s-locked */
|
||||
unsigned last_x_line:14; /*!< Line number where last time x-locked */
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint magic_n; /*!< RW_LOCK_MAGIC_N */
|
||||
};
|
||||
|
||||
/** Value of rw_lock_struct::magic_n */
|
||||
#define RW_LOCK_MAGIC_N 22643
|
||||
#endif /* UNIV_DEBUG */
|
||||
};
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/** The structure for storing debug info of an rw-lock */
|
||||
|
|
|
@ -278,7 +278,7 @@ rw_lock_create_func(
|
|||
lock->level = level;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
lock->magic_n = RW_LOCK_MAGIC_N;
|
||||
ut_d(lock->magic_n = RW_LOCK_MAGIC_N);
|
||||
|
||||
lock->cfile_name = cfile_name;
|
||||
lock->cline = (unsigned int) cline;
|
||||
|
@ -293,10 +293,8 @@ rw_lock_create_func(
|
|||
|
||||
mutex_enter(&rw_lock_list_mutex);
|
||||
|
||||
if (UT_LIST_GET_LEN(rw_lock_list) > 0) {
|
||||
ut_a(UT_LIST_GET_FIRST(rw_lock_list)->magic_n
|
||||
== RW_LOCK_MAGIC_N);
|
||||
}
|
||||
ut_ad(UT_LIST_GET_FIRST(rw_lock_list) == NULL
|
||||
|| UT_LIST_GET_FIRST(rw_lock_list)->magic_n == RW_LOCK_MAGIC_N);
|
||||
|
||||
UT_LIST_ADD_FIRST(list, rw_lock_list, lock);
|
||||
|
||||
|
@ -316,8 +314,6 @@ rw_lock_free_func(
|
|||
ut_ad(rw_lock_validate(lock));
|
||||
ut_a(lock->lock_word == X_LOCK_DECR);
|
||||
|
||||
lock->magic_n = 0;
|
||||
|
||||
#ifndef INNODB_RW_LOCKS_USE_ATOMICS
|
||||
mutex_free(rw_lock_get_mutex(lock));
|
||||
#endif /* INNODB_RW_LOCKS_USE_ATOMICS */
|
||||
|
@ -327,16 +323,16 @@ rw_lock_free_func(
|
|||
|
||||
os_event_free(lock->wait_ex_event);
|
||||
|
||||
if (UT_LIST_GET_PREV(list, lock)) {
|
||||
ut_a(UT_LIST_GET_PREV(list, lock)->magic_n == RW_LOCK_MAGIC_N);
|
||||
}
|
||||
if (UT_LIST_GET_NEXT(list, lock)) {
|
||||
ut_a(UT_LIST_GET_NEXT(list, lock)->magic_n == RW_LOCK_MAGIC_N);
|
||||
}
|
||||
ut_ad(UT_LIST_GET_PREV(list, lock) == NULL
|
||||
|| UT_LIST_GET_PREV(list, lock)->magic_n == RW_LOCK_MAGIC_N);
|
||||
ut_ad(UT_LIST_GET_NEXT(list, lock) == NULL
|
||||
|| UT_LIST_GET_NEXT(list, lock)->magic_n == RW_LOCK_MAGIC_N);
|
||||
|
||||
UT_LIST_REMOVE(list, rw_lock_list, lock);
|
||||
|
||||
mutex_exit(&rw_lock_list_mutex);
|
||||
|
||||
ut_d(lock->magic_n = 0);
|
||||
}
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
|
@ -358,7 +354,7 @@ rw_lock_validate(
|
|||
waiters = rw_lock_get_waiters(lock);
|
||||
lock_word = lock->lock_word;
|
||||
|
||||
ut_a(lock->magic_n == RW_LOCK_MAGIC_N);
|
||||
ut_ad(lock->magic_n == RW_LOCK_MAGIC_N);
|
||||
ut_a(waiters == 0 || waiters == 1);
|
||||
ut_a(lock_word > -X_LOCK_DECR ||(-lock_word) % X_LOCK_DECR == 0);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue