mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 12:01:42 +01:00
6ea41f1e84
The bug was that full memory barrier was missing in the code that ensures that a waiter on an InnoDB mutex will not go to sleep unless it is guaranteed to be woken up again by another thread currently holding the mutex. This made possible a race where a thread could get stuck waiting for a mutex that is in fact no longer locked. If that thread was also holding other critical locks, this could stall the entire server. There is an error monitor thread than can break the stall, it runs about once per second. But if the error monitor thread itself got stuck or was not running, then the entire server could hang infinitely. This was introduced on i386/amd64 platforms in 5.5.40 and 10.0.13 by an incorrect patch that tried to fix the similar problem for PowerPC. This commit reverts the incorrect PowerPC patch, and instead implements a fix for PowerPC that does not change i386/amd64 behaviour, making PowerPC work similarly to i386/amd64.
88 lines
2.8 KiB
Text
88 lines
2.8 KiB
Text
/*****************************************************************************
|
|
|
|
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
|
|
|
|
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 St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*****************************************************************************/
|
|
|
|
/**************************************************//**
|
|
@file include/os0sync.ic
|
|
The interface to the operating system synchronization primitives.
|
|
|
|
Created 9/6/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#ifdef __WIN__
|
|
#include <winbase.h>
|
|
#endif
|
|
|
|
/**********************************************************//**
|
|
Acquires ownership of a fast mutex.
|
|
@return 0 if success, != 0 if was reserved by another thread */
|
|
UNIV_INLINE
|
|
ulint
|
|
os_fast_mutex_trylock(
|
|
/*==================*/
|
|
os_fast_mutex_t* fast_mutex) /*!< in: mutex to acquire */
|
|
{
|
|
#ifdef __WIN__
|
|
if (TryEnterCriticalSection(fast_mutex)) {
|
|
|
|
return(0);
|
|
} else {
|
|
|
|
return(1);
|
|
}
|
|
#else
|
|
/* NOTE that the MySQL my_pthread.h redefines pthread_mutex_trylock
|
|
so that it returns 0 on success. In the operating system
|
|
libraries, HP-UX-10.20 follows the old Posix 1003.4a Draft 4 and
|
|
returns 1 on success (but MySQL remaps that to 0), while Linux,
|
|
FreeBSD, Solaris, AIX, Tru64 Unix, HP-UX-11.0 return 0 on success. */
|
|
|
|
return((ulint) pthread_mutex_trylock(fast_mutex));
|
|
#endif
|
|
}
|
|
|
|
/**********************************************************//**
|
|
Acquires ownership of a fast mutex. Implies a full memory barrier even on
|
|
platforms such as PowerPC where this is not normally required.
|
|
@return 0 if success, != 0 if was reserved by another thread */
|
|
UNIV_INLINE
|
|
ulint
|
|
os_fast_mutex_trylock_full_barrier(
|
|
/*==================*/
|
|
os_fast_mutex_t* fast_mutex) /*!< in: mutex to acquire */
|
|
{
|
|
#ifdef __WIN__
|
|
if (TryEnterCriticalSection(fast_mutex)) {
|
|
|
|
return(0);
|
|
} else {
|
|
|
|
return(1);
|
|
}
|
|
#else
|
|
/* NOTE that the MySQL my_pthread.h redefines pthread_mutex_trylock
|
|
so that it returns 0 on success. In the operating system
|
|
libraries, HP-UX-10.20 follows the old Posix 1003.4a Draft 4 and
|
|
returns 1 on success (but MySQL remaps that to 0), while Linux,
|
|
FreeBSD, Solaris, AIX, Tru64 Unix, HP-UX-11.0 return 0 on success. */
|
|
|
|
#ifdef __powerpc__
|
|
os_mb;
|
|
#endif
|
|
return((ulint) pthread_mutex_trylock(fast_mutex));
|
|
#endif
|
|
}
|