mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge a193-229-222-105.elisa-laajakaista.fi:/home/my/bk/mysql-5.0
into a193-229-222-105.elisa-laajakaista.fi:/home/my/bk/mysql-5.1-new mysql-test/mysql-test-run.pl: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/grant.result: Auto merged mysql-test/r/heap_btree.result: Auto merged mysql-test/r/information_schema_db.result: Auto merged mysql-test/r/lock_multi.result: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/r/view_grant.result: Auto merged mysql-test/t/lock_multi.test: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/view_grant.test: Auto merged mysys/default.c: Auto merged server-tools/instance-manager/guardian.cc: Auto merged sql/field.h: Auto merged sql/item.h: Auto merged sql/item_subselect.cc: Auto merged sql/item_timefunc.cc: Auto merged sql/lock.cc: Auto merged sql/mysql_priv.h: Auto merged sql/sql_acl.cc: Auto merged sql/sql_delete.cc: Auto merged sql/sql_insert.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_load.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_show.cc: Auto merged sql/sql_update.cc: Auto merged sql/table.cc: Auto merged storage/heap/hp_write.c: Auto merged storage/ndb/src/ndbapi/DictCache.cpp: Auto merged storage/ndb/src/ndbapi/DictCache.hpp: Auto merged client/mysqlbinlog.cc: Manual merge from 5.0 client/mysqldump.c: Manual merge from 5.0 configure.in: Manual merge from 5.0 mysql-test/r/mysqldump.result: Manual merge from 5.0 mysql-test/t/mysqldump.test: Manual merge from 5.0 mysql-test/t/rpl_insert_id.test: Manual merge from 5.0 server-tools/instance-manager/manager.cc: Manual merge from 5.0 sql/field.cc: Manual merge from 5.0 sql/ha_ndbcluster.cc: Manual merge from 5.0 sql/mysqld.cc: Manual merge from 5.0 sql/sql_base.cc: Manual merge from 5.0 sql/sql_lex.cc: Manual merge from 5.0 sql/sql_select.cc: Manual merge from 5.0 sql/sql_table.cc: Manual merge from 5.0
This commit is contained in:
34
sql/lock.cc
34
sql/lock.cc
@@ -1174,16 +1174,17 @@ bool lock_global_read_lock(THD *thd)
|
||||
|
||||
if (!thd->global_read_lock)
|
||||
{
|
||||
const char *old_message;
|
||||
(void) pthread_mutex_lock(&LOCK_global_read_lock);
|
||||
const char *old_message=thd->enter_cond(&COND_refresh, &LOCK_global_read_lock,
|
||||
"Waiting to get readlock");
|
||||
old_message=thd->enter_cond(&COND_global_read_lock, &LOCK_global_read_lock,
|
||||
"Waiting to get readlock");
|
||||
DBUG_PRINT("info",
|
||||
("waiting_for: %d protect_against: %d",
|
||||
waiting_for_read_lock, protect_against_global_read_lock));
|
||||
|
||||
waiting_for_read_lock++;
|
||||
while (protect_against_global_read_lock && !thd->killed)
|
||||
pthread_cond_wait(&COND_refresh, &LOCK_global_read_lock);
|
||||
pthread_cond_wait(&COND_global_read_lock, &LOCK_global_read_lock);
|
||||
waiting_for_read_lock--;
|
||||
if (thd->killed)
|
||||
{
|
||||
@@ -1205,9 +1206,15 @@ bool lock_global_read_lock(THD *thd)
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
void unlock_global_read_lock(THD *thd)
|
||||
{
|
||||
uint tmp;
|
||||
DBUG_ENTER("unlock_global_read_lock");
|
||||
DBUG_PRINT("info",
|
||||
("global_read_lock: %u global_read_lock_blocks_commit: %u",
|
||||
global_read_lock, global_read_lock_blocks_commit));
|
||||
|
||||
pthread_mutex_lock(&LOCK_global_read_lock);
|
||||
tmp= --global_read_lock;
|
||||
if (thd->global_read_lock == MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT)
|
||||
@@ -1215,8 +1222,13 @@ void unlock_global_read_lock(THD *thd)
|
||||
pthread_mutex_unlock(&LOCK_global_read_lock);
|
||||
/* Send the signal outside the mutex to avoid a context switch */
|
||||
if (!tmp)
|
||||
pthread_cond_broadcast(&COND_refresh);
|
||||
{
|
||||
DBUG_PRINT("signal", ("Broadcasting COND_global_read_lock"));
|
||||
pthread_cond_broadcast(&COND_global_read_lock);
|
||||
}
|
||||
thd->global_read_lock= 0;
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
#define must_wait (global_read_lock && \
|
||||
@@ -1254,11 +1266,15 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh,
|
||||
*/
|
||||
DBUG_RETURN(is_not_commit);
|
||||
}
|
||||
old_message=thd->enter_cond(&COND_refresh, &LOCK_global_read_lock,
|
||||
old_message=thd->enter_cond(&COND_global_read_lock, &LOCK_global_read_lock,
|
||||
"Waiting for release of readlock");
|
||||
while (must_wait && ! thd->killed &&
|
||||
(!abort_on_refresh || thd->version == refresh_version))
|
||||
(void) pthread_cond_wait(&COND_refresh,&LOCK_global_read_lock);
|
||||
{
|
||||
DBUG_PRINT("signal", ("Waiting for COND_global_read_lock"));
|
||||
(void) pthread_cond_wait(&COND_global_read_lock, &LOCK_global_read_lock);
|
||||
DBUG_PRINT("signal", ("Got COND_global_read_lock"));
|
||||
}
|
||||
if (thd->killed)
|
||||
result=1;
|
||||
}
|
||||
@@ -1287,7 +1303,7 @@ void start_waiting_global_read_lock(THD *thd)
|
||||
(waiting_for_read_lock || global_read_lock_blocks_commit));
|
||||
(void) pthread_mutex_unlock(&LOCK_global_read_lock);
|
||||
if (tmp)
|
||||
pthread_cond_broadcast(&COND_refresh);
|
||||
pthread_cond_broadcast(&COND_global_read_lock);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@@ -1309,10 +1325,10 @@ bool make_global_read_lock_block_commit(THD *thd)
|
||||
/* For testing we set up some blocking, to see if we can be killed */
|
||||
DBUG_EXECUTE_IF("make_global_read_lock_block_commit_loop",
|
||||
protect_against_global_read_lock++;);
|
||||
old_message= thd->enter_cond(&COND_refresh, &LOCK_global_read_lock,
|
||||
old_message= thd->enter_cond(&COND_global_read_lock, &LOCK_global_read_lock,
|
||||
"Waiting for all running commits to finish");
|
||||
while (protect_against_global_read_lock && !thd->killed)
|
||||
pthread_cond_wait(&COND_refresh, &LOCK_global_read_lock);
|
||||
pthread_cond_wait(&COND_global_read_lock, &LOCK_global_read_lock);
|
||||
DBUG_EXECUTE_IF("make_global_read_lock_block_commit_loop",
|
||||
protect_against_global_read_lock--;);
|
||||
if ((error= test(thd->killed)))
|
||||
|
Reference in New Issue
Block a user