Loading include/thr_lock.h +1 −1 Original line number Diff line number Diff line Loading @@ -111,7 +111,7 @@ void thr_unlock(THR_LOCK_DATA *data); int thr_multi_lock(THR_LOCK_DATA **data,uint count); void thr_multi_unlock(THR_LOCK_DATA **data,uint count); void thr_abort_locks(THR_LOCK *lock); void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread); bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread); void thr_print_locks(void); /* For debugging */ my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data); my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data); Loading mysys/thr_lock.c +5 −2 Original line number Diff line number Diff line Loading @@ -966,9 +966,10 @@ void thr_abort_locks(THR_LOCK *lock) This is used to abort all locks for a specific thread */ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { THR_LOCK_DATA *data; bool found= FALSE; DBUG_ENTER("thr_abort_locks_for_thread"); pthread_mutex_lock(&lock->mutex); Loading @@ -978,6 +979,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { DBUG_PRINT("info",("Aborting read-wait lock")); data->type= TL_UNLOCK; /* Mark killed */ found= TRUE; pthread_cond_signal(data->cond); data->cond= 0; /* Removed from list */ Loading @@ -993,6 +995,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { DBUG_PRINT("info",("Aborting write-wait lock")); data->type= TL_UNLOCK; found= TRUE; pthread_cond_signal(data->cond); data->cond= 0; Loading @@ -1003,7 +1006,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) } } pthread_mutex_unlock(&lock->mutex); DBUG_VOID_RETURN; DBUG_RETURN(found); } Loading sql/handler.cc +2 −0 Original line number Diff line number Diff line Loading @@ -1514,6 +1514,8 @@ int ha_discover(THD *thd, const char *db, const char *name, int error= -1; // Table does not exist in any handler DBUG_ENTER("ha_discover"); DBUG_PRINT("enter", ("db: %s, name: %s", db, name)); if (is_prefix(name,tmp_file_prefix)) /* skip temporary tables */ DBUG_RETURN(error); #ifdef HAVE_NDBCLUSTER_DB if (have_ndbcluster == SHOW_OPTION_YES) error= ndbcluster_discover(thd, db, name, frmblob, frmlen); Loading sql/lock.cc +17 −6 Original line number Diff line number Diff line Loading @@ -337,20 +337,25 @@ void mysql_lock_abort(THD *thd, TABLE *table) /* Abort one thread / table combination */ void mysql_lock_abort_for_thread(THD *thd, TABLE *table) bool mysql_lock_abort_for_thread(THD *thd, TABLE *table) { MYSQL_LOCK *locked; TABLE *write_lock_used; bool result= FALSE; DBUG_ENTER("mysql_lock_abort_for_thread"); if ((locked = get_lock_data(thd,&table,1,1,&write_lock_used))) { for (uint i=0; i < locked->lock_count; i++) thr_abort_locks_for_thread(locked->locks[i]->lock, { bool found; found= thr_abort_locks_for_thread(locked->locks[i]->lock, table->in_use->real_id); result|= found; } my_free((gptr) locked,MYF(0)); } DBUG_VOID_RETURN; DBUG_RETURN(result); } Loading Loading @@ -578,8 +583,14 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) my_free((gptr) table,MYF(0)); DBUG_RETURN(-1); } if (remove_table_from_cache(thd, db, table_list->real_name)) { if (remove_table_from_cache(thd, db, table_list->real_name, RTFC_NO_FLAG)) { DBUG_RETURN(1); // Table is in use } } DBUG_RETURN(0); } Loading sql/mysql_priv.h +6 −2 Original line number Diff line number Diff line Loading @@ -763,8 +763,12 @@ bool rename_temporary_table(THD* thd, TABLE *table, const char *new_db, const char *table_name); void remove_db_from_cache(const char *db); void flush_tables(); #define RTFC_NO_FLAG 0x0000 #define RTFC_OWNED_BY_THD_FLAG 0x0001 #define RTFC_WAIT_OTHER_THREAD_FLAG 0x0002 #define RTFC_CHECK_KILLED_FLAG 0x0004 bool remove_table_from_cache(THD *thd, const char *db, const char *table, bool return_if_owned_by_thd=0); uint flags); bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables); void copy_field_from_tmp_record(Field *field,int offset); int fill_record(List<Item> &fields,List<Item> &values, bool ignore_errors); Loading Loading @@ -1000,7 +1004,7 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count); void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table); void mysql_lock_abort(THD *thd, TABLE *table); void mysql_lock_abort_for_thread(THD *thd, TABLE *table); bool mysql_lock_abort_for_thread(THD *thd, TABLE *table); MYSQL_LOCK *mysql_lock_merge(MYSQL_LOCK *a,MYSQL_LOCK *b); bool lock_global_read_lock(THD *thd); void unlock_global_read_lock(THD *thd); Loading Loading
include/thr_lock.h +1 −1 Original line number Diff line number Diff line Loading @@ -111,7 +111,7 @@ void thr_unlock(THR_LOCK_DATA *data); int thr_multi_lock(THR_LOCK_DATA **data,uint count); void thr_multi_unlock(THR_LOCK_DATA **data,uint count); void thr_abort_locks(THR_LOCK *lock); void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread); bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread); void thr_print_locks(void); /* For debugging */ my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data); my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data); Loading
mysys/thr_lock.c +5 −2 Original line number Diff line number Diff line Loading @@ -966,9 +966,10 @@ void thr_abort_locks(THR_LOCK *lock) This is used to abort all locks for a specific thread */ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) bool thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { THR_LOCK_DATA *data; bool found= FALSE; DBUG_ENTER("thr_abort_locks_for_thread"); pthread_mutex_lock(&lock->mutex); Loading @@ -978,6 +979,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { DBUG_PRINT("info",("Aborting read-wait lock")); data->type= TL_UNLOCK; /* Mark killed */ found= TRUE; pthread_cond_signal(data->cond); data->cond= 0; /* Removed from list */ Loading @@ -993,6 +995,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) { DBUG_PRINT("info",("Aborting write-wait lock")); data->type= TL_UNLOCK; found= TRUE; pthread_cond_signal(data->cond); data->cond= 0; Loading @@ -1003,7 +1006,7 @@ void thr_abort_locks_for_thread(THR_LOCK *lock, pthread_t thread) } } pthread_mutex_unlock(&lock->mutex); DBUG_VOID_RETURN; DBUG_RETURN(found); } Loading
sql/handler.cc +2 −0 Original line number Diff line number Diff line Loading @@ -1514,6 +1514,8 @@ int ha_discover(THD *thd, const char *db, const char *name, int error= -1; // Table does not exist in any handler DBUG_ENTER("ha_discover"); DBUG_PRINT("enter", ("db: %s, name: %s", db, name)); if (is_prefix(name,tmp_file_prefix)) /* skip temporary tables */ DBUG_RETURN(error); #ifdef HAVE_NDBCLUSTER_DB if (have_ndbcluster == SHOW_OPTION_YES) error= ndbcluster_discover(thd, db, name, frmblob, frmlen); Loading
sql/lock.cc +17 −6 Original line number Diff line number Diff line Loading @@ -337,20 +337,25 @@ void mysql_lock_abort(THD *thd, TABLE *table) /* Abort one thread / table combination */ void mysql_lock_abort_for_thread(THD *thd, TABLE *table) bool mysql_lock_abort_for_thread(THD *thd, TABLE *table) { MYSQL_LOCK *locked; TABLE *write_lock_used; bool result= FALSE; DBUG_ENTER("mysql_lock_abort_for_thread"); if ((locked = get_lock_data(thd,&table,1,1,&write_lock_used))) { for (uint i=0; i < locked->lock_count; i++) thr_abort_locks_for_thread(locked->locks[i]->lock, { bool found; found= thr_abort_locks_for_thread(locked->locks[i]->lock, table->in_use->real_id); result|= found; } my_free((gptr) locked,MYF(0)); } DBUG_VOID_RETURN; DBUG_RETURN(result); } Loading Loading @@ -578,8 +583,14 @@ int lock_table_name(THD *thd, TABLE_LIST *table_list) my_free((gptr) table,MYF(0)); DBUG_RETURN(-1); } if (remove_table_from_cache(thd, db, table_list->real_name)) { if (remove_table_from_cache(thd, db, table_list->real_name, RTFC_NO_FLAG)) { DBUG_RETURN(1); // Table is in use } } DBUG_RETURN(0); } Loading
sql/mysql_priv.h +6 −2 Original line number Diff line number Diff line Loading @@ -763,8 +763,12 @@ bool rename_temporary_table(THD* thd, TABLE *table, const char *new_db, const char *table_name); void remove_db_from_cache(const char *db); void flush_tables(); #define RTFC_NO_FLAG 0x0000 #define RTFC_OWNED_BY_THD_FLAG 0x0001 #define RTFC_WAIT_OTHER_THREAD_FLAG 0x0002 #define RTFC_CHECK_KILLED_FLAG 0x0004 bool remove_table_from_cache(THD *thd, const char *db, const char *table, bool return_if_owned_by_thd=0); uint flags); bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables); void copy_field_from_tmp_record(Field *field,int offset); int fill_record(List<Item> &fields,List<Item> &values, bool ignore_errors); Loading Loading @@ -1000,7 +1004,7 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock); void mysql_unlock_some_tables(THD *thd, TABLE **table,uint count); void mysql_lock_remove(THD *thd, MYSQL_LOCK *locked,TABLE *table); void mysql_lock_abort(THD *thd, TABLE *table); void mysql_lock_abort_for_thread(THD *thd, TABLE *table); bool mysql_lock_abort_for_thread(THD *thd, TABLE *table); MYSQL_LOCK *mysql_lock_merge(MYSQL_LOCK *a,MYSQL_LOCK *b); bool lock_global_read_lock(THD *thd); void unlock_global_read_lock(THD *thd); Loading