Loading sql/lock.cc +49 −2 Original line number Diff line number Diff line Loading @@ -82,7 +82,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count); static void print_lock_error(int error, const char *); MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count) MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, bool ignore_global_read_lock) { MYSQL_LOCK *sql_lock; TABLE *write_lock_used; Loading @@ -93,7 +94,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count) if (!(sql_lock = get_lock_data(thd,tables,count, 0,&write_lock_used))) break; if (global_read_lock && write_lock_used) if (global_read_lock && write_lock_used && ! ignore_global_read_lock) { /* Someone has issued LOCK ALL TABLES FOR READ and we want a write lock Loading Loading @@ -949,3 +950,49 @@ bool make_global_read_lock_block_commit(THD *thd) DBUG_RETURN(error); } /* Set protection against global read lock. SYNOPSIS set_protect_against_global_read_lock() void RETURN FALSE OK, no global read lock exists. TRUE Error, global read lock exists already. */ bool set_protect_against_global_read_lock(void) { bool global_read_lock_exists; pthread_mutex_lock(&LOCK_open); if (! (global_read_lock_exists= test(global_read_lock))) protect_against_global_read_lock++; pthread_mutex_unlock(&LOCK_open); return global_read_lock_exists; } /* Unset protection against global read lock. SYNOPSIS unset_protect_against_global_read_lock() void RETURN void */ void unset_protect_against_global_read_lock(void) { pthread_mutex_lock(&LOCK_open); protect_against_global_read_lock--; pthread_mutex_unlock(&LOCK_open); pthread_cond_broadcast(&COND_refresh); } sql/mysql_priv.h +4 −1 Original line number Diff line number Diff line Loading @@ -1151,7 +1151,8 @@ extern pthread_t signal_thread; extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; #endif /* HAVE_OPENSSL */ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **table,uint count); MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, bool ignore_global_read_lock= FALSE); void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count); Loading @@ -1165,6 +1166,8 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh, bool is_not_commit); void start_waiting_global_read_lock(THD *thd); bool make_global_read_lock_block_commit(THD *thd); bool set_protect_against_global_read_lock(void); void unset_protect_against_global_read_lock(void); /* Lock based on name */ int lock_and_wait_for_table_name(THD *thd, TABLE_LIST *table_list); Loading sql/sql_insert.cc +1 −1 File changed.Contains only whitespace changes. Show changes Loading
sql/lock.cc +49 −2 Original line number Diff line number Diff line Loading @@ -82,7 +82,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count); static void print_lock_error(int error, const char *); MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count) MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, bool ignore_global_read_lock) { MYSQL_LOCK *sql_lock; TABLE *write_lock_used; Loading @@ -93,7 +94,7 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count) if (!(sql_lock = get_lock_data(thd,tables,count, 0,&write_lock_used))) break; if (global_read_lock && write_lock_used) if (global_read_lock && write_lock_used && ! ignore_global_read_lock) { /* Someone has issued LOCK ALL TABLES FOR READ and we want a write lock Loading Loading @@ -949,3 +950,49 @@ bool make_global_read_lock_block_commit(THD *thd) DBUG_RETURN(error); } /* Set protection against global read lock. SYNOPSIS set_protect_against_global_read_lock() void RETURN FALSE OK, no global read lock exists. TRUE Error, global read lock exists already. */ bool set_protect_against_global_read_lock(void) { bool global_read_lock_exists; pthread_mutex_lock(&LOCK_open); if (! (global_read_lock_exists= test(global_read_lock))) protect_against_global_read_lock++; pthread_mutex_unlock(&LOCK_open); return global_read_lock_exists; } /* Unset protection against global read lock. SYNOPSIS unset_protect_against_global_read_lock() void RETURN void */ void unset_protect_against_global_read_lock(void) { pthread_mutex_lock(&LOCK_open); protect_against_global_read_lock--; pthread_mutex_unlock(&LOCK_open); pthread_cond_broadcast(&COND_refresh); }
sql/mysql_priv.h +4 −1 Original line number Diff line number Diff line Loading @@ -1151,7 +1151,8 @@ extern pthread_t signal_thread; extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd; #endif /* HAVE_OPENSSL */ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **table,uint count); MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **table, uint count, bool ignore_global_read_lock= FALSE); void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count); Loading @@ -1165,6 +1166,8 @@ bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh, bool is_not_commit); void start_waiting_global_read_lock(THD *thd); bool make_global_read_lock_block_commit(THD *thd); bool set_protect_against_global_read_lock(void); void unset_protect_against_global_read_lock(void); /* Lock based on name */ int lock_and_wait_for_table_name(THD *thd, TABLE_LIST *table_list); Loading