diff options
author | Vicențiu Ciorbaru <vicentiu@mariadb.org> | 2016-08-09 16:15:10 +0300 |
---|---|---|
committer | Vicențiu Ciorbaru <vicentiu@mariadb.org> | 2016-08-09 23:34:44 +0300 |
commit | 5ad02062d928cccbd29c0a2db6f0f7ceb33195d1 (patch) | |
tree | 811f647f7fd41190566370fa3b8bf793c4d8717c /storage/xtradb/include/sync0sync.ic | |
parent | 0098d789c9d8be15d62230289f603ac8f3d5b275 (diff) | |
download | mariadb-git-5ad02062d928cccbd29c0a2db6f0f7ceb33195d1.tar.gz |
MDEV-10341: InnoDB: Failing assertion: mutex_own(mutex) - mutex_exit_funcmariadb-5.5.51
Fix memory barrier issues on releasing mutexes. We must have a full
memory barrier between releasing a mutex lock and reading its waiters.
This prevents us from missing to release waiters due to reading the
number of waiters speculatively before releasing the lock. If threads
try and wait between us reading the waiters count and releasing the
lock, those threads might stall indefinitely.
Also, we must use proper ACQUIRE/RELEASE semantics for atomic
operations, not ACQUIRE/ACQUIRE.
Diffstat (limited to 'storage/xtradb/include/sync0sync.ic')
-rw-r--r-- | storage/xtradb/include/sync0sync.ic | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/storage/xtradb/include/sync0sync.ic b/storage/xtradb/include/sync0sync.ic index 48039c854d9..c733becf6df 100644 --- a/storage/xtradb/include/sync0sync.ic +++ b/storage/xtradb/include/sync0sync.ic @@ -178,6 +178,11 @@ mutex_exit_func( to wake up possible hanging threads if they are missed in mutex_signal_object. */ + /* We add a memory barrier to prevent reading of the + number of waiters before releasing the lock. */ + + os_mb; + if (mutex_get_waiters(mutex) != 0) { mutex_signal_object(mutex); |