diff options
author | ingo@mysql.com <> | 2006-02-20 12:28:58 +0100 |
---|---|---|
committer | ingo@mysql.com <> | 2006-02-20 12:28:58 +0100 |
commit | fdcac8147f07d0e27e8c74531506dee38ba9824b (patch) | |
tree | 690a9aaf84966bcc7a1c128ab4ec136619f0ea24 /sql/lock.cc | |
parent | 7e58102bfd69ff9c67ef5bb38ebaef7d59bebf32 (diff) | |
parent | ff01effb75cd6279f3f7095e9a8ea62faef6260a (diff) | |
download | mariadb-git-fdcac8147f07d0e27e8c74531506dee38ba9824b.tar.gz |
Merge mysql.com:/home/mydev/mysql-4.0-bug5390
into mysql.com:/home/mydev/mysql-4.1-bug5390
Diffstat (limited to 'sql/lock.cc')
-rw-r--r-- | sql/lock.cc | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/sql/lock.cc b/sql/lock.cc index 2db0538c139..fe59039dde3 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -141,7 +141,12 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count, uint flags) } thd->proc_info="Table lock"; thd->locked=1; - if (thr_multi_lock(sql_lock->locks,sql_lock->lock_count)) + /* Copy the lock data array. thr_multi_lock() reorders its contens. */ + memcpy(sql_lock->locks + sql_lock->lock_count, sql_lock->locks, + sql_lock->lock_count * sizeof(*sql_lock->locks)); + /* Lock on the copied half of the lock data array. */ + if (thr_multi_lock(sql_lock->locks + sql_lock->lock_count, + sql_lock->lock_count)) { thd->some_tables_deleted=1; // Try again sql_lock->lock_count=0; // Locks are alread freed @@ -603,13 +608,20 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, } } + /* + Allocating twice the number of pointers for lock data for use in + thr_mulit_lock(). This function reorders the lock data, but cannot + update the table values. So the second part of the array is copied + from the first part immediately before calling thr_multi_lock(). + */ if (!(sql_lock= (MYSQL_LOCK*) - my_malloc(sizeof(*sql_lock)+ - sizeof(THR_LOCK_DATA*)*tables+sizeof(table_ptr)*lock_count, + my_malloc(sizeof(*sql_lock) + + sizeof(THR_LOCK_DATA*) * tables * 2 + + sizeof(table_ptr) * lock_count, MYF(0)))) DBUG_RETURN(0); locks= locks_buf= sql_lock->locks= (THR_LOCK_DATA**) (sql_lock + 1); - to= table_buf= sql_lock->table= (TABLE**) (locks + tables); + to= table_buf= sql_lock->table= (TABLE**) (locks + tables * 2); sql_lock->table_count=lock_count; sql_lock->lock_count=tables; |