mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge 10.4 into 10.5
This commit is contained in:
@ -7211,7 +7211,7 @@ wait_for_commit::reinit()
|
||||
{
|
||||
subsequent_commits_list= NULL;
|
||||
next_subsequent_commit= NULL;
|
||||
waitee= NULL;
|
||||
waitee.store(NULL, std::memory_order_relaxed);
|
||||
opaque_pointer= NULL;
|
||||
wakeup_error= 0;
|
||||
wakeup_subsequent_commits_running= false;
|
||||
@ -7289,8 +7289,9 @@ wait_for_commit::wakeup(int wakeup_error)
|
||||
|
||||
*/
|
||||
mysql_mutex_lock(&LOCK_wait_commit);
|
||||
waitee= NULL;
|
||||
this->wakeup_error= wakeup_error;
|
||||
/* Memory barrier to make wakeup_error visible to the waiter thread. */
|
||||
waitee.store(NULL, std::memory_order_release);
|
||||
/*
|
||||
Note that it is critical that the mysql_cond_signal() here is done while
|
||||
still holding the mutex. As soon as we release the mutex, the waiter might
|
||||
@ -7321,9 +7322,10 @@ wait_for_commit::wakeup(int wakeup_error)
|
||||
void
|
||||
wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee)
|
||||
{
|
||||
DBUG_ASSERT(!this->waitee /* No prior registration allowed */);
|
||||
DBUG_ASSERT(!this->waitee.load(std::memory_order_relaxed)
|
||||
/* No prior registration allowed */);
|
||||
wakeup_error= 0;
|
||||
this->waitee= waitee;
|
||||
this->waitee.store(waitee, std::memory_order_relaxed);
|
||||
|
||||
mysql_mutex_lock(&waitee->LOCK_wait_commit);
|
||||
/*
|
||||
@ -7332,7 +7334,7 @@ wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee)
|
||||
see comments on wakeup_subsequent_commits2() for details.
|
||||
*/
|
||||
if (waitee->wakeup_subsequent_commits_running)
|
||||
this->waitee= NULL;
|
||||
this->waitee.store(NULL, std::memory_order_relaxed);
|
||||
else
|
||||
{
|
||||
/*
|
||||
@ -7362,7 +7364,8 @@ wait_for_commit::wait_for_prior_commit2(THD *thd)
|
||||
thd->ENTER_COND(&COND_wait_commit, &LOCK_wait_commit,
|
||||
&stage_waiting_for_prior_transaction_to_commit,
|
||||
&old_stage);
|
||||
while ((loc_waitee= this->waitee) && likely(!thd->check_killed(1)))
|
||||
while ((loc_waitee= this->waitee.load(std::memory_order_relaxed)) &&
|
||||
likely(!thd->check_killed(1)))
|
||||
mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit);
|
||||
if (!loc_waitee)
|
||||
{
|
||||
@ -7385,14 +7388,14 @@ wait_for_commit::wait_for_prior_commit2(THD *thd)
|
||||
do
|
||||
{
|
||||
mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit);
|
||||
} while (this->waitee);
|
||||
} while (this->waitee.load(std::memory_order_relaxed));
|
||||
if (wakeup_error)
|
||||
my_error(ER_PRIOR_COMMIT_FAILED, MYF(0));
|
||||
goto end;
|
||||
}
|
||||
remove_from_list(&loc_waitee->subsequent_commits_list);
|
||||
mysql_mutex_unlock(&loc_waitee->LOCK_wait_commit);
|
||||
this->waitee= NULL;
|
||||
this->waitee.store(NULL, std::memory_order_relaxed);
|
||||
|
||||
wakeup_error= thd->killed_errno();
|
||||
if (!wakeup_error)
|
||||
@ -7494,7 +7497,7 @@ wait_for_commit::unregister_wait_for_prior_commit2()
|
||||
wait_for_commit *loc_waitee;
|
||||
|
||||
mysql_mutex_lock(&LOCK_wait_commit);
|
||||
if ((loc_waitee= this->waitee))
|
||||
if ((loc_waitee= this->waitee.load(std::memory_order_relaxed)))
|
||||
{
|
||||
mysql_mutex_lock(&loc_waitee->LOCK_wait_commit);
|
||||
if (loc_waitee->wakeup_subsequent_commits_running)
|
||||
@ -7507,7 +7510,7 @@ wait_for_commit::unregister_wait_for_prior_commit2()
|
||||
See comments on wakeup_subsequent_commits2() for more details.
|
||||
*/
|
||||
mysql_mutex_unlock(&loc_waitee->LOCK_wait_commit);
|
||||
while (this->waitee)
|
||||
while (this->waitee.load(std::memory_order_relaxed))
|
||||
mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit);
|
||||
}
|
||||
else
|
||||
@ -7515,7 +7518,7 @@ wait_for_commit::unregister_wait_for_prior_commit2()
|
||||
/* Remove ourselves from the list in the waitee. */
|
||||
remove_from_list(&loc_waitee->subsequent_commits_list);
|
||||
mysql_mutex_unlock(&loc_waitee->LOCK_wait_commit);
|
||||
this->waitee= NULL;
|
||||
this->waitee.store(NULL, std::memory_order_relaxed);
|
||||
}
|
||||
}
|
||||
wakeup_error= 0;
|
||||
|
Reference in New Issue
Block a user