1
0
mirror of https://github.com/MariaDB/server.git synced 2025-12-24 11:21:21 +03:00
Bug #4810 "deadlock with KILL when the victim was in a wait state"
(I included mutex unlock into exit_cond() for future safety)
and BUG#4827 "KILL while START SLAVE may lead to replication slave crash"
This commit is contained in:
guilhem@mysql.com
2004-07-31 22:33:20 +02:00
parent ebd3745c8c
commit dd023bc878
6 changed files with 33 additions and 36 deletions

View File

@@ -537,12 +537,9 @@ public:
void awake(bool prepare_to_die);
/*
For enter_cond() / exit_cond() to work the mutex must be got before
enter_cond() but released before exit_cond() (in 4.1, assertions will soon
ensure this). Use must be:
lock mutex; enter_cond(); ...; unlock mutex; exit_cond().
If you don't do it this way, you will get a deadlock if another thread is
doing a THD::awake() on you.
enter_cond() (in 4.1 an assertion will soon ensure this); this mutex is
then released by exit_cond(). Use must be:
lock mutex; enter_cond(); your code; exit_cond().
*/
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
const char* msg)
@@ -555,6 +552,13 @@ public:
}
inline void exit_cond(const char* old_msg)
{
/*
Putting the mutex unlock in exit_cond() ensures that
mysys_var->current_mutex is always unlocked _before_ mysys_var->mutex is
locked (if that would not be the case, you'll get a deadlock if someone
does a THD::awake() on you).
*/
pthread_mutex_unlock(mysys_var->current_mutex);
pthread_mutex_lock(&mysys_var->mutex);
mysys_var->current_mutex = 0;
mysys_var->current_cond = 0;