Loading Docs/manual.texi +117 −51 Original line number Diff line number Diff line Loading @@ -8202,7 +8202,7 @@ If your client programs are using threads, you need to also compile a thread-safe version of the MySQL client library with the @code{--with-thread-safe-client} configure options. This will create a @code{libmysqlclient_r} library with which you should link your threaded applications. @xref{Thread-safe clients}. applications. @xref{Threaded clients}. @item Options that pertain to particular systems can be found in the Loading Loading @@ -38964,9 +38964,10 @@ likely it is that we can fix the problem! * C API datatypes:: C API Datatypes * C API function overview:: C API Function Overview * C API functions:: C API Function Descriptions * C Thread functions:: * C API problems:: Common questions and problems when using the C API * Building clients:: Building Client Programs * Thread-safe clients:: How to Make a Thread-safe Client * Threaded clients:: How to Make a Threaded Client @end menu The C API code is distributed with MySQL. It is included in the Loading Loading @@ -39007,7 +39008,7 @@ the buffer associated with a connection is not decreased until the connection is closed, at which time client memory is reclaimed. For programming with threads, consult the 'how to make a thread-safe client' chapter. @xref{Thread-safe clients}. client' chapter. @xref{Threaded clients}. @node C API datatypes, C API function overview, C, C Loading Loading @@ -39455,7 +39456,7 @@ recently invoked function that can succeed or fail, allowing you to determine when an error occurred and what it was. @node C API functions, C API problems, C API function overview, C @node C API functions, C Thread functions, C API function overview, C @subsection C API Function Descriptions @menu Loading Loading @@ -40373,7 +40374,7 @@ of @code{mysql_field_count()} whether or not the statement was a @code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)} * Thread-safe clients:: How to Make a Thread-safe Client * Threaded clients:: How to Make a Threaded Client @subsubheading Description Sets the field cursor to the given offset. The next call to Loading Loading @@ -41650,8 +41651,71 @@ The connection to the server was lost during the query. An unknown error occurred. @end table @node C Thread functions, C API problems, C API functions, C @subsection C Threaded Function Descriptions @node C API problems, Building clients, C API functions, C You need to use the following functions when you want to create a threaded client. @xref{Threaded clients}. @menu * my_init:: * my_thread_init():: * my_thread_end():: @end menu @node my_init, my_thread_init(), C Thread functions, C Thread functions @subsubsection @code{my_init()} @findex @code{my_init()} @subsubheading Description This function needs to be called once in the program before calling any MySQL function. This initializes some global variables that MySQL needs. If you are using a thread safe client library, this will also call @code{my_thread_init()} for this thread. This is automaticly called by @code{mysql_init()} and @code{mysql_connect()}. @subsubheading Return Values none. @node my_thread_init(), my_thread_end(), my_init, C Thread functions @subsubsection @code{my_thread_init()} @findex @code{my_thread_init()} @subsubheading Description This function needs to be called for each created thread to initialize thread specific variables. This is automaticly called by @code{my_init()} and @code{mysql_connect()}. @subsubheading Return Values none. @node my_thread_end(), , my_thread_init(), C Thread functions @subsubsection @code{my_thread_end()} @findex @code{my_thread_end()} @subsubheading Description This function needs to be called before calling @code{pthread_exit()} to freed memory allocated by @code{my_thread_init()}. Note that this function is NOT invoked automaticly be the client library! @subsubheading Return Values none. @node C API problems, Building clients, C Thread functions, C @subsection Common questions and problems when using the C API @tindex @code{mysql_query()} Loading Loading @@ -41806,7 +41870,7 @@ If this happens on your system, you must include the math library by adding @code{-lm} to the end of the compile/link line. @node Building clients, Thread-safe clients, C API problems, C @node Building clients, Threaded clients, C API problems, C @subsection Building Client Programs @cindex client programs, building Loading @@ -41827,11 +41891,11 @@ For clients that use MySQL header files, you may need to specify a files. @node Thread-safe clients, , Building clients, C @subsection How to Make a Thread-safe Client @node Threaded clients, , Building clients, C @subsection How to Make a Threaded Client @cindex clients, thread-safe @cindex thread-safe clients @cindex clients, threaded @cindex threaded clients The client library is almost thread safe. The biggest problem is that the subroutines in @file{net.c} that read from sockets are not Loading @@ -41846,20 +41910,21 @@ Windows binaries are by default compiled to be thread safe). Newer binary distributions should have both a normal and a thread-safe client library. To get a really thread-safe client where you can interrupt the client from other threads and set timeouts when talking with the MySQL server, you should use the @code{-lmysys}, @code{-lstring}, and @code{-ldbug} libraries and the @code{net_serv.o} code that the server uses. To get a threaded client where you can interrupt the client from other threads and set timeouts when talking with the MySQL server, you should use the @code{-lmysys}, @code{-lstring}, and @code{-ldbug} libraries and the @code{net_serv.o} code that the server uses. If you don't need interrupts or timeouts, you can just compile a thread safe client library @code{(mysqlclient_r)} and use this. @xref{C,, MySQL C API}. In this case you don't have to worry about the @code{net_serv.o} object file or the other MySQL libraries. When using a threaded client and you want to use timeouts and interrupts, you can make great use of the routines in the @file{thr_alarm.c} file. If you are using routines from the @code{mysys} library, the only thing you must remember is to call @code{my_init()} first! When using a threaded client and you want to use timeouts and interrupts, you can make great use of the routines in the @file{thr_alarm.c} file. If you are using routines from the @code{mysys} library, the only thing you must remember is to call @code{my_init()} first! @xref{C Thread functions}. All functions except @code{mysql_real_connect()} are by default thread safe. The following notes describe how to compile a thread safe Loading Loading @@ -41906,11 +41971,38 @@ If you program with POSIX threads, you can use establish and release a mutex lock. @end itemize You need to know the following if you have a thread that is calling MySQL functions, but that thread has not created the connection to the MySQL database: When you call @code{mysql_init()} or @code{mysql_connect()}, MySQL will create a thread specific variable for the thread that is used by the debug library (among other things). If you have in a thread call a MySQL function, before a thread has called @code{mysql_init()} or @code{mysql_connect()}, the thread will not have the necessary thread specific variables in place and you are likely to end up with a core dump sooner or later. The get things to work smoothly you have to do the following: @enumerate @item Call @code{my_init()} at the start of your program if it calls any other MySQL function before calling @code{mysql_real_connect()}. @item Call @code{my_thread_init()} in the thread handler before calling any MySQL function. @item In the thread, call @code{my_thread_end()} before calling @code{pthread_exit()}. This will free the memory used by MySQL thread specific variables. @end enumerate You may get some errors because of undefined symbols when linking your client with @code{mysqlclient_r}. In most cases this is because you haven't included the thread libraries on the link/compile line. @node Cplusplus, Java, C, Clients @section MySQL C++ APIs Loading Loading @@ -44221,34 +44313,6 @@ thread that is waiting on the disk-full condition will allow the other threads to continue. @end itemize You need to know the following if you have a thread that is calling MySQL functions, but that thread has not created the connection to the MySQL database: When you call @code{mysql_init()} or @code{mysql_connect()}, MySQL will create a thread specific variable for the thread that is used by the debug library (among other things). If you have in a thread call a MySQL function, before a thread has called @code{mysql_init()} or @code{mysql_connect()}, the thread will not have the necessary thread specific variables in place and you are likely to end up with a core dump sooner or later. The get things to work smoothly you have to do the following: @enumerate @item Call @code{my_init()} at the start of your program if it calls any other MySQL function before calling @code{mysql_real_connect()}. @item Call @code{my_thread_init()} in the thread handler before calling any MySQL function. @item In the thread, call @code{my_thread_end()} before calling @code{pthread_exit()}. This will free the memory used by MySQL thread specific variables. @end enumerate Exceptions to the above behaveour is when you use @code{REPAIR} or @code{OPTIMIZE} or when the indexes are created in a batch after an @code{LOAD DATA INFILE} or after an @code{ALTER TABLE} statement. Loading Loading @@ -46707,6 +46771,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.42 @itemize @bullet @item Fixed a problem when using @code{LOCK TABLES} and @code{BDB} tables. @item Fixed problem with @code{REPAIR TABLE} on MyISAM tables with row lengths between 65517 - 65520 bytes @item sql-bench/test-create.sh +10 −2 Original line number Diff line number Diff line Loading @@ -39,13 +39,21 @@ $opt_loop_count=10000; # Change this to make test harder/easier chomp($pwd = `pwd`); $pwd = "." if ($pwd eq ''); require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n"; $create_loop_count=$opt_loop_count; if ($opt_small_test) { $opt_loop_count/=100; $create_loop_count/=1000; } $max_tables=min($limits->{'max_tables'},$opt_loop_count); if ($opt_small_test) { $max_tables=10; } print "Testing the speed of creating and droping tables\n"; print "Testing with $max_tables tables and $opt_loop_count loop count\n\n"; Loading Loading @@ -177,7 +185,7 @@ print "Testing create+drop\n"; $loop_time=new Benchmark; for ($i=1 ; $i <= $opt_loop_count ; $i++) for ($i=1 ; $i <= $create_loop_count ; $i++) { do_many($dbh,$server->create("bench_$i", ["i int NOT NULL", Loading @@ -190,7 +198,7 @@ for ($i=1 ; $i <= $opt_loop_count ; $i++) } $end_time=new Benchmark; print "Time for create+drop ($opt_loop_count): " . print "Time for create+drop ($create_loop_count): " . timestr(timediff($end_time, $loop_time),"all") . "\n"; if ($opt_fast && defined($server->{vacuum})) Loading sql/sql_base.cc +3 −0 Original line number Diff line number Diff line Loading @@ -413,7 +413,10 @@ void close_thread_tables(THD *thd, bool locked) DBUG_ENTER("close_thread_tables"); if (thd->locked_tables) { ha_commit_stmt(thd); // If select statement DBUG_VOID_RETURN; // LOCK TABLES in use } TABLE *table,*next; bool found_old_table=0; Loading Loading
Docs/manual.texi +117 −51 Original line number Diff line number Diff line Loading @@ -8202,7 +8202,7 @@ If your client programs are using threads, you need to also compile a thread-safe version of the MySQL client library with the @code{--with-thread-safe-client} configure options. This will create a @code{libmysqlclient_r} library with which you should link your threaded applications. @xref{Thread-safe clients}. applications. @xref{Threaded clients}. @item Options that pertain to particular systems can be found in the Loading Loading @@ -38964,9 +38964,10 @@ likely it is that we can fix the problem! * C API datatypes:: C API Datatypes * C API function overview:: C API Function Overview * C API functions:: C API Function Descriptions * C Thread functions:: * C API problems:: Common questions and problems when using the C API * Building clients:: Building Client Programs * Thread-safe clients:: How to Make a Thread-safe Client * Threaded clients:: How to Make a Threaded Client @end menu The C API code is distributed with MySQL. It is included in the Loading Loading @@ -39007,7 +39008,7 @@ the buffer associated with a connection is not decreased until the connection is closed, at which time client memory is reclaimed. For programming with threads, consult the 'how to make a thread-safe client' chapter. @xref{Thread-safe clients}. client' chapter. @xref{Threaded clients}. @node C API datatypes, C API function overview, C, C Loading Loading @@ -39455,7 +39456,7 @@ recently invoked function that can succeed or fail, allowing you to determine when an error occurred and what it was. @node C API functions, C API problems, C API function overview, C @node C API functions, C Thread functions, C API function overview, C @subsection C API Function Descriptions @menu Loading Loading @@ -40373,7 +40374,7 @@ of @code{mysql_field_count()} whether or not the statement was a @code{MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)} * Thread-safe clients:: How to Make a Thread-safe Client * Threaded clients:: How to Make a Threaded Client @subsubheading Description Sets the field cursor to the given offset. The next call to Loading Loading @@ -41650,8 +41651,71 @@ The connection to the server was lost during the query. An unknown error occurred. @end table @node C Thread functions, C API problems, C API functions, C @subsection C Threaded Function Descriptions @node C API problems, Building clients, C API functions, C You need to use the following functions when you want to create a threaded client. @xref{Threaded clients}. @menu * my_init:: * my_thread_init():: * my_thread_end():: @end menu @node my_init, my_thread_init(), C Thread functions, C Thread functions @subsubsection @code{my_init()} @findex @code{my_init()} @subsubheading Description This function needs to be called once in the program before calling any MySQL function. This initializes some global variables that MySQL needs. If you are using a thread safe client library, this will also call @code{my_thread_init()} for this thread. This is automaticly called by @code{mysql_init()} and @code{mysql_connect()}. @subsubheading Return Values none. @node my_thread_init(), my_thread_end(), my_init, C Thread functions @subsubsection @code{my_thread_init()} @findex @code{my_thread_init()} @subsubheading Description This function needs to be called for each created thread to initialize thread specific variables. This is automaticly called by @code{my_init()} and @code{mysql_connect()}. @subsubheading Return Values none. @node my_thread_end(), , my_thread_init(), C Thread functions @subsubsection @code{my_thread_end()} @findex @code{my_thread_end()} @subsubheading Description This function needs to be called before calling @code{pthread_exit()} to freed memory allocated by @code{my_thread_init()}. Note that this function is NOT invoked automaticly be the client library! @subsubheading Return Values none. @node C API problems, Building clients, C Thread functions, C @subsection Common questions and problems when using the C API @tindex @code{mysql_query()} Loading Loading @@ -41806,7 +41870,7 @@ If this happens on your system, you must include the math library by adding @code{-lm} to the end of the compile/link line. @node Building clients, Thread-safe clients, C API problems, C @node Building clients, Threaded clients, C API problems, C @subsection Building Client Programs @cindex client programs, building Loading @@ -41827,11 +41891,11 @@ For clients that use MySQL header files, you may need to specify a files. @node Thread-safe clients, , Building clients, C @subsection How to Make a Thread-safe Client @node Threaded clients, , Building clients, C @subsection How to Make a Threaded Client @cindex clients, thread-safe @cindex thread-safe clients @cindex clients, threaded @cindex threaded clients The client library is almost thread safe. The biggest problem is that the subroutines in @file{net.c} that read from sockets are not Loading @@ -41846,20 +41910,21 @@ Windows binaries are by default compiled to be thread safe). Newer binary distributions should have both a normal and a thread-safe client library. To get a really thread-safe client where you can interrupt the client from other threads and set timeouts when talking with the MySQL server, you should use the @code{-lmysys}, @code{-lstring}, and @code{-ldbug} libraries and the @code{net_serv.o} code that the server uses. To get a threaded client where you can interrupt the client from other threads and set timeouts when talking with the MySQL server, you should use the @code{-lmysys}, @code{-lstring}, and @code{-ldbug} libraries and the @code{net_serv.o} code that the server uses. If you don't need interrupts or timeouts, you can just compile a thread safe client library @code{(mysqlclient_r)} and use this. @xref{C,, MySQL C API}. In this case you don't have to worry about the @code{net_serv.o} object file or the other MySQL libraries. When using a threaded client and you want to use timeouts and interrupts, you can make great use of the routines in the @file{thr_alarm.c} file. If you are using routines from the @code{mysys} library, the only thing you must remember is to call @code{my_init()} first! When using a threaded client and you want to use timeouts and interrupts, you can make great use of the routines in the @file{thr_alarm.c} file. If you are using routines from the @code{mysys} library, the only thing you must remember is to call @code{my_init()} first! @xref{C Thread functions}. All functions except @code{mysql_real_connect()} are by default thread safe. The following notes describe how to compile a thread safe Loading Loading @@ -41906,11 +41971,38 @@ If you program with POSIX threads, you can use establish and release a mutex lock. @end itemize You need to know the following if you have a thread that is calling MySQL functions, but that thread has not created the connection to the MySQL database: When you call @code{mysql_init()} or @code{mysql_connect()}, MySQL will create a thread specific variable for the thread that is used by the debug library (among other things). If you have in a thread call a MySQL function, before a thread has called @code{mysql_init()} or @code{mysql_connect()}, the thread will not have the necessary thread specific variables in place and you are likely to end up with a core dump sooner or later. The get things to work smoothly you have to do the following: @enumerate @item Call @code{my_init()} at the start of your program if it calls any other MySQL function before calling @code{mysql_real_connect()}. @item Call @code{my_thread_init()} in the thread handler before calling any MySQL function. @item In the thread, call @code{my_thread_end()} before calling @code{pthread_exit()}. This will free the memory used by MySQL thread specific variables. @end enumerate You may get some errors because of undefined symbols when linking your client with @code{mysqlclient_r}. In most cases this is because you haven't included the thread libraries on the link/compile line. @node Cplusplus, Java, C, Clients @section MySQL C++ APIs Loading Loading @@ -44221,34 +44313,6 @@ thread that is waiting on the disk-full condition will allow the other threads to continue. @end itemize You need to know the following if you have a thread that is calling MySQL functions, but that thread has not created the connection to the MySQL database: When you call @code{mysql_init()} or @code{mysql_connect()}, MySQL will create a thread specific variable for the thread that is used by the debug library (among other things). If you have in a thread call a MySQL function, before a thread has called @code{mysql_init()} or @code{mysql_connect()}, the thread will not have the necessary thread specific variables in place and you are likely to end up with a core dump sooner or later. The get things to work smoothly you have to do the following: @enumerate @item Call @code{my_init()} at the start of your program if it calls any other MySQL function before calling @code{mysql_real_connect()}. @item Call @code{my_thread_init()} in the thread handler before calling any MySQL function. @item In the thread, call @code{my_thread_end()} before calling @code{pthread_exit()}. This will free the memory used by MySQL thread specific variables. @end enumerate Exceptions to the above behaveour is when you use @code{REPAIR} or @code{OPTIMIZE} or when the indexes are created in a batch after an @code{LOAD DATA INFILE} or after an @code{ALTER TABLE} statement. Loading Loading @@ -46707,6 +46771,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.42 @itemize @bullet @item Fixed a problem when using @code{LOCK TABLES} and @code{BDB} tables. @item Fixed problem with @code{REPAIR TABLE} on MyISAM tables with row lengths between 65517 - 65520 bytes @item
sql-bench/test-create.sh +10 −2 Original line number Diff line number Diff line Loading @@ -39,13 +39,21 @@ $opt_loop_count=10000; # Change this to make test harder/easier chomp($pwd = `pwd`); $pwd = "." if ($pwd eq ''); require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!\n"; $create_loop_count=$opt_loop_count; if ($opt_small_test) { $opt_loop_count/=100; $create_loop_count/=1000; } $max_tables=min($limits->{'max_tables'},$opt_loop_count); if ($opt_small_test) { $max_tables=10; } print "Testing the speed of creating and droping tables\n"; print "Testing with $max_tables tables and $opt_loop_count loop count\n\n"; Loading Loading @@ -177,7 +185,7 @@ print "Testing create+drop\n"; $loop_time=new Benchmark; for ($i=1 ; $i <= $opt_loop_count ; $i++) for ($i=1 ; $i <= $create_loop_count ; $i++) { do_many($dbh,$server->create("bench_$i", ["i int NOT NULL", Loading @@ -190,7 +198,7 @@ for ($i=1 ; $i <= $opt_loop_count ; $i++) } $end_time=new Benchmark; print "Time for create+drop ($opt_loop_count): " . print "Time for create+drop ($create_loop_count): " . timestr(timediff($end_time, $loop_time),"all") . "\n"; if ($opt_fast && defined($server->{vacuum})) Loading
sql/sql_base.cc +3 −0 Original line number Diff line number Diff line Loading @@ -413,7 +413,10 @@ void close_thread_tables(THD *thd, bool locked) DBUG_ENTER("close_thread_tables"); if (thd->locked_tables) { ha_commit_stmt(thd); // If select statement DBUG_VOID_RETURN; // LOCK TABLES in use } TABLE *table,*next; bool found_old_table=0; Loading