List:Commits« Previous MessageNext Message »
From:ingo Date:February 20 2006 11:28am
Subject:bk commit into 4.0 tree (ingo:1.2173) BUG#5390
View as plain text  
Below is the list of changes that have just been committed into a local
4.0 repository of mydev. When mydev does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.2173 06/02/20 12:28:07 ingo@stripped +1 -0
  BUG#5390 - problems with merge tables
  This fix is necessary because thr_multi_lock()
  reorderes the lock data references array.

  sql/lock.cc
    1.57 06/02/20 12:28:05 ingo@stripped +16 -4
    BUG#5390 - problems with merge tables
    This fix is necessary because thr_multi_lock()
    reorderes the lock data references array.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	ingo
# Host:	chilla.local
# Root:	/home/mydev/mysql-4.0-bug5390

--- 1.56/sql/lock.cc	2006-01-23 19:12:27 +01:00
+++ 1.57/sql/lock.cc	2006-02-20 12:28:05 +01:00
@@ -141,7 +141,12 @@
     }
     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
@@ -602,13 +607,20 @@
     }
   }
 
+  /*
+    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;
 
Thread
bk commit into 4.0 tree (ingo:1.2173) BUG#5390ingo20 Feb