summaryrefslogtreecommitdiff
path: root/sql/lock.cc
diff options
context:
space:
mode:
authorunknown <ingo@mysql.com>2006-02-20 15:30:15 +0100
committerunknown <ingo@mysql.com>2006-02-20 15:30:15 +0100
commit5785c37e6e66b9778067b11be002f42826aa7a74 (patch)
tree0603ff34d3c6cc14db828ba76e06984b597ab0fb /sql/lock.cc
parentab16adb7dd56106bf73172799fdbe8ce6809adab (diff)
parent8c9ac3ecb42366c59321dc94c41331bcce122f58 (diff)
downloadmariadb-git-5785c37e6e66b9778067b11be002f42826aa7a74.tar.gz
Merge mysql.com:/home/mydev/mysql-4.1-bug5390
into mysql.com:/home/mydev/mysql-5.0-bug5390 sql/lock.cc: BUG#5390 - problems with merge tables Merge from 4.1
Diffstat (limited to 'sql/lock.cc')
-rw-r--r--sql/lock.cc22
1 files changed, 18 insertions, 4 deletions
diff --git a/sql/lock.cc b/sql/lock.cc
index bff7cfd6734..22c3b03f8c1 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -155,7 +155,14 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd, TABLE **tables, uint count,
}
thd->proc_info="Table lock";
thd->locked=1;
- rc= thr_lock_errno_to_mysql[(int) thr_multi_lock(sql_lock->locks,
+ /* 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))
+ rc= thr_lock_errno_to_mysql[(int) thr_multi_lock(sql_lock->locks +
+ sql_lock->lock_count,
sql_lock->lock_count,
thd->lock_id)];
if (rc > 1) /* a timeout or a deadlock */
@@ -659,13 +666,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;