From d050c30d422a81331ba3795bb48f2f1f9daaf317 Mon Sep 17 00:00:00 2001
From: "monty@mashka.mysql.fi" <>
Date: Mon, 5 Aug 2002 13:09:12 +0300
Subject: [PATCH]  Added some mutex locks to make SLAVE START and SLAVE STOP
 thread safe.

---
 Docs/manual.texi    |  2 ++
 sql/gen_lex_hash.cc | 12 +++++++++---
 sql/slave.cc        |  4 ++++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/Docs/manual.texi b/Docs/manual.texi
index 11140681ce..b4d39667ec 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -46928,6 +46928,8 @@ not yet 100% confident in this code.
 @appendixsubsec Changes in release 3.23.52
 @itemize @bullet
 @item
+Fixed thread bug in @code{SLAVE START} and @code{SLAVE STOP}.
+@item
 Added name of 'administrator command' logs.
 @item
 Fixed bug with creating an auto-increment value on second part of a
diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc
index d47019ee04..22e40ff283 100644
--- a/sql/gen_lex_hash.cc
+++ b/sql/gen_lex_hash.cc
@@ -216,7 +216,7 @@ you have to change 'main' to print out the new function\n");
     return(1);
   }
 
-  if (opt_verbose)
+  if (opt_verbose > 1)
     fprintf (stderr,"Info: Possible add values: %d\n",found-type_count);
 
   for (prime=primes; (function_mod=*prime) ; prime++)
@@ -385,7 +385,7 @@ static int get_options(int argc, char **argv)
       opt_search=1;
       break;
     case 'v':
-      opt_verbose=1;
+      opt_verbose++;
       break;
     case 'V': usage(1); exit(0);
     case 'I':
@@ -481,7 +481,7 @@ int main(int argc,char **argv)
   int error;
 
   MY_INIT(argv[0]);
-  start_value=7740512L; best_t1=7953583L;  best_t2=6918639L;  best_type=1; /* mode=5449  add=1  type: 0 */
+  start_value=2744811L; best_t1=5135075L;  best_t2=1719450L;  best_type=0; /* mode=4999  add=1  type: 0 */
   if (get_options(argc,(char **) argv))
     exit(1);
 
@@ -502,6 +502,7 @@ int main(int argc,char **argv)
 	   start_value, best_t1,best_t2,best_type,best_mod,best_add,
 	   best_functype);
 
+    best_start_value=start_value;
     for (uint i=1 ; i <= opt_count ; i++)
     {
       if (i % 10 == 0)
@@ -524,6 +525,11 @@ int main(int argc,char **argv)
 	       best_start_value,best_t1,best_t2,best_type,best_mod,best_add,
 	       best_functype);
       }
+      if (opt_verbose && (i % 20000) == 0)
+	printf("\nstart_value=%ldL; best_t1=%ldL;  best_t2=%ldL;  best_type=%d;
+/* mode=%d  add=%d  type: %d */\n",
+	       best_start_value,best_t1,best_t2,best_type,best_mod,best_add,
+	       best_functype);
     }
   }
 
diff --git a/sql/slave.cc b/sql/slave.cc
index adbf3c106c..6b79c56748 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1301,7 +1301,9 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused)))
     }
   thd->thread_stack = (char*)&thd; // remember where our stack is
   thd->temporary_tables = save_temporary_tables; // restore temp tables
+  (void) pthread_mutex_lock(&LOCK_thread_count);
   threads.append(thd);
+  (void) pthread_mutex_unlock(&LOCK_thread_count);
   glob_mi.pending = 0;  //this should always be set to 0 when the slave thread
   // is started
   
@@ -1501,7 +1503,9 @@ position %s",
   pthread_mutex_unlock(&LOCK_slave);
   net_end(&thd->net); // destructor will not free it, because we are weird
   slave_thd = 0;
+  (void) pthread_mutex_lock(&LOCK_thread_count);
   delete thd;
+  (void) pthread_mutex_unlock(&LOCK_thread_count);
   my_thread_end();
 #ifndef DBUG_OFF
   if(abort_slave_event_count && !events_till_abort)
-- 
2.30.9