1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

Merge mysql.com:/home/gluh/MySQL/Merge/5.1

into  mysql.com:/home/gluh/MySQL/Merge/5.1-opt
This commit is contained in:
gluh@eagle.(none)
2007-01-12 14:47:11 +04:00
41 changed files with 490 additions and 308 deletions

View File

@ -177,8 +177,7 @@ check_cpu () {
touch __test.c touch __test.c
while [ "$cpu_arg" ] ; do while [ "$cpu_arg" ] ; do
# FIXME: echo -n isn't portable - see contortions autoconf goes through printf "testing $cpu_arg ... " >&2
echo -n testing $cpu_arg "... " >&2
# compile check # compile check
check_cpu_cflags=`eval echo $check_cpu_args` check_cpu_cflags=`eval echo $check_cpu_args`

View File

@ -6,7 +6,7 @@ AC_PREREQ(2.52)dnl Minimum Autoconf version required.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
# remember to also change ndb version below and update version.c in ndb # remember to also update version.c in ndb
AM_INIT_AUTOMAKE(mysql, 5.1.15-beta) AM_INIT_AUTOMAKE(mysql, 5.1.15-beta)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
@ -678,7 +678,22 @@ else
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
# If we should allow init-file, skip-grant-table and bootstrap options
AC_MSG_CHECKING(If we should should enable init-file, skip-grant-table options and bootstrap)
AC_ARG_ENABLE(grant-options,
[ --disable-grant-options Disables the use of --init-file, --skip-grant-tables and --bootstrap options],
[ mysql_grant_options_enabled=$enableval ],
[ mysql_grant_options_enabled=yes ]
)
if test "$mysql_grant_options_enabled" = "yes"
then
AC_MSG_RESULT([yes])
else
AC_DEFINE([DISABLE_GRANT_OPTIONS], [1],
[Disables the use of --init-file, --skip-grant-tables and --bootstrap options])
AC_MSG_RESULT([no])
fi
MYSQL_SYS_LARGEFILE MYSQL_SYS_LARGEFILE
# Types that must be checked AFTER large file support is checked # Types that must be checked AFTER large file support is checked
@ -963,6 +978,7 @@ case $SYSTEM_TYPE in
fi fi
;; ;;
*darwin*) *darwin*)
AC_DEFINE([DEFAULT_SKIP_THREAD_PRIORITY], [1], [default to skip thread priority])
if test "$ac_cv_prog_gcc" = "yes" if test "$ac_cv_prog_gcc" = "yes"
then then
FLAGS="-D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT" FLAGS="-D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT"
@ -2415,14 +2431,16 @@ thread_dirs=
dnl This probably should be cleaned up more - for now the threaded dnl This probably should be cleaned up more - for now the threaded
dnl client is just using plain-old libs. dnl client is just using plain-old libs.
sql_client_dirs="strings regex mysys libmysql client" sql_client_dirs=
linked_client_targets="linked_libmysql_sources" linked_client_targets="linked_libmysql_sources"
AM_CONDITIONAL(THREAD_SAFE_CLIENT, test "$THREAD_SAFE_CLIENT" != "no") AM_CONDITIONAL(THREAD_SAFE_CLIENT, test "$THREAD_SAFE_CLIENT" != "no")
if test "$THREAD_SAFE_CLIENT" != "no" if test "$THREAD_SAFE_CLIENT" = "no"
then then
sql_client_dirs="libmysql_r $sql_client_dirs" sql_client_dirs="strings regex mysys extra libmysql client"
else
sql_client_dirs="strings regex mysys extra libmysql libmysql_r client"
linked_client_targets="$linked_client_targets linked_libmysql_r_sources" linked_client_targets="$linked_client_targets linked_libmysql_r_sources"
AC_CONFIG_FILES(libmysql_r/Makefile) AC_CONFIG_FILES(libmysql_r/Makefile)
AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should the client be thread safe]) AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should the client be thread safe])
@ -2449,13 +2467,17 @@ AC_SUBST(netware_dir)
AC_SUBST(linked_netware_sources) AC_SUBST(linked_netware_sources)
AM_CONDITIONAL(HAVE_NETWARE, test "$netware_dir" = "netware") AM_CONDITIONAL(HAVE_NETWARE, test "$netware_dir" = "netware")
if test "$with_server" = "yes" -o "$THREAD_SAFE_CLIENT" != "no" if test "$with_server" != "no" -o "$THREAD_SAFE_CLIENT" != "no"
then then
AC_DEFINE([THREAD], [1], AC_DEFINE([THREAD], [1],
[Define if you want to have threaded code. This may be undef on client code]) [Define if you want to have threaded code. This may be undef on client code])
# Avoid _PROGRAMS names # Avoid _PROGRAMS names
THREAD_LOBJECTS="thr_alarm.o thr_lock.o thr_mutex.o thr_rwlock.o my_pthread.o my_thr_init.o mf_keycache.o" THREAD_LOBJECTS="thr_alarm.o thr_lock.o thr_mutex.o thr_rwlock.o my_pthread.o my_thr_init.o mf_keycache.o"
AC_SUBST(THREAD_LOBJECTS) AC_SUBST(THREAD_LOBJECTS)
fi
if test "$with_server" != "no"
then
server_scripts="mysqld_safe mysql_install_db" server_scripts="mysqld_safe mysql_install_db"
sql_server_dirs="strings mysys dbug extra regex" sql_server_dirs="strings mysys dbug extra regex"

View File

@ -92,6 +92,42 @@
#define NETWARE_SET_SCREEN_MODE(A) #define NETWARE_SET_SCREEN_MODE(A)
#endif #endif
/*
The macros below are used to allow build of Universal/fat binaries of
MySQL and MySQL applications under darwin.
*/
#ifdef TARGET_FAT_BINARY
# undef SIZEOF_CHARP
# undef SIZEOF_INT
# undef SIZEOF_LONG
# undef SIZEOF_LONG_LONG
# undef SIZEOF_OFF_T
# undef SIZEOF_SHORT
#if defined(__i386__)
# undef WORDS_BIGENDIAN
# define SIZEOF_CHARP 4
# define SIZEOF_INT 4
# define SIZEOF_LONG 4
# define SIZEOF_LONG_LONG 8
# define SIZEOF_OFF_T 8
# define SIZEOF_SHORT 2
#elif defined(__ppc__)
# define WORDS_BIGENDIAN
# define SIZEOF_CHARP 4
# define SIZEOF_INT 4
# define SIZEOF_LONG 4
# define SIZEOF_LONG_LONG 8
# define SIZEOF_OFF_T 8
# define SIZEOF_SHORT 2
#else
# error Building FAT binary for an unknown architecture.
#endif
#endif /* TARGET_FAT_BINARY */
/* /*
The macros below are borrowed from include/linux/compiler.h in the The macros below are borrowed from include/linux/compiler.h in the
Linux kernel. Use them to indicate the likelyhood of the truthfulness Linux kernel. Use them to indicate the likelyhood of the truthfulness

View File

@ -66,14 +66,17 @@ ldata=$fix_bin/$data
mdata=$data/mysql mdata=$data/mysql
EXTRA_ARG="" EXTRA_ARG=""
if test ! -x $execdir/mysqld mysqld=
if test -x $execdir/mysqld
then then
mysqld=$execdir/mysqld
else
if test ! -x $libexecdir/mysqld if test ! -x $libexecdir/mysqld
then then
echo "mysqld is missing - looked in $execdir and in $libexecdir" echo "mysqld is missing - looked in $execdir and in $libexecdir"
exit 1 exit 1
else else
execdir=$libexecdir mysqld=$libexecdir/mysqld
fi fi
fi fi
@ -99,7 +102,9 @@ basedir=.
EXTRA_ARG="--language=../sql/share/english/ --character-sets-dir=../sql/share/charsets/" EXTRA_ARG="--language=../sql/share/english/ --character-sets-dir=../sql/share/charsets/"
fi fi
mysqld_boot=" $execdir/mysqld --no-defaults --bootstrap --skip-grant-tables --basedir=$basedir --datadir=$ldata --skip-innodb --skip-ndbcluster --tmpdir=. $EXTRA_ARG" mysqld_boot="${MYSQLD_BOOTSTRAP-$mysqld}"
mysqld_boot="$mysqld_boot --no-defaults --bootstrap --skip-grant-tables --basedir=$basedir --datadir=$ldata --skip-innodb --skip-ndbcluster --tmpdir=. $EXTRA_ARG"
echo "running $mysqld_boot" echo "running $mysqld_boot"
if $scriptdir/mysql_create_system_tables test $mdata $hostname | $mysqld_boot if $scriptdir/mysql_create_system_tables test $mdata $hostname | $mysqld_boot

View File

@ -2873,12 +2873,19 @@ sub install_db ($$) {
mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir); mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
} }
# If DISABLE_GRANT_OPTIONS is defined when the server is compiled (e.g.,
# configure --disable-grant-options), mysqld will not recognize the
# --bootstrap or --skip-grant-tables options. The user can set
# MYSQLD_BOOTSTRAP to the full path to a mysqld which does accept
# --bootstrap, to accommodate this.
my $exe_mysqld_bootstrap = $ENV{'MYSQLD_BOOTSTRAP'} || $exe_mysqld;
# Log bootstrap command # Log bootstrap command
my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log"; my $path_bootstrap_log= "$opt_vardir/log/bootstrap.log";
mtr_tofile($path_bootstrap_log, mtr_tofile($path_bootstrap_log,
"$exe_mysqld " . join(" ", @$args) . "\n"); "$exe_mysqld_bootstrap " . join(" ", @$args) . "\n");
if ( mtr_run($exe_mysqld, $args, $init_db_sql_tmp, if ( mtr_run($exe_mysqld_bootstrap, $args, $init_db_sql_tmp,
$path_bootstrap_log, $path_bootstrap_log, $path_bootstrap_log, $path_bootstrap_log,
"", { append_log_file => 1 }) != 0 ) "", { append_log_file => 1 }) != 0 )

View File

@ -369,7 +369,7 @@ BASE=$BASE2
# #
if [ x"@GXX@" = x"yes" ] ; then if [ x"@GXX@" = x"yes" ] ; then
gcclib=`@CC@ --print-libgcc-file` gcclib=`@CC@ @CFLAGS@ --print-libgcc-file`
if [ $? -ne 0 ] ; then if [ $? -ne 0 ] ; then
echo "Warning: Couldn't find libgcc.a!" echo "Warning: Couldn't find libgcc.a!"
else else

View File

@ -236,7 +236,8 @@ if test "$in_rpm" -eq 0 -a "$windows" -eq 0
then then
echo "Installing all prepared tables" echo "Installing all prepared tables"
fi fi
mysqld_install_cmd_line="$mysqld $defaults $mysqld_opt --bootstrap \ mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
--skip-grant-tables --basedir=$basedir --datadir=$ldata --skip-innodb \ --skip-grant-tables --basedir=$basedir --datadir=$ldata --skip-innodb \
--skip-ndbcluster $args --max_allowed_packet=8M --net_buffer_length=16K" --skip-ndbcluster $args --max_allowed_packet=8M --net_buffer_length=16K"
if $scriptdir/mysql_create_system_tables $create_option $mdata $hostname $windows \ if $scriptdir/mysql_create_system_tables $create_option $mdata $hostname $windows \

View File

@ -21,6 +21,16 @@ command=".mysql.$$"
trap "interrupt" 2 trap "interrupt" 2
rootpass="" rootpass=""
echo_n=
echo_c=
set_echo_compat() {
case `echo "testing\c"`,`echo -n testing` in
*c*,-n*) echo_n= echo_c= ;;
*c*,*) echo_n=-n echo_c= ;;
*) echo_n= echo_c='\c' ;;
esac
}
prepare() { prepare() {
touch $config $command touch $config $command
@ -44,7 +54,7 @@ get_root_password() {
status=1 status=1
while [ $status -eq 1 ]; do while [ $status -eq 1 ]; do
stty -echo stty -echo
echo -n "Enter current password for root (enter for none): " echo $echo_n "Enter current password for root (enter for none): $echo_c"
read password read password
echo echo
stty echo stty echo
@ -64,10 +74,10 @@ get_root_password() {
set_root_password() { set_root_password() {
stty -echo stty -echo
echo -n "New password: " echo $echo_n "New password: $echo_c"
read password1 read password1
echo echo
echo -n "Re-enter new password: " echo $echo_n "Re-enter new password: $echo_c"
read password2 read password2
echo echo
stty echo stty echo
@ -172,6 +182,7 @@ cleanup() {
# The actual script starts here # The actual script starts here
prepare prepare
set_echo_compat
echo echo
echo echo
@ -200,11 +211,11 @@ echo "root user without the proper authorisation."
echo echo
if [ $hadpass -eq 0 ]; then if [ $hadpass -eq 0 ]; then
echo -n "Set root password? [Y/n] " echo $echo_n "Set root password? [Y/n] $echo_c"
else else
echo "You already have a root password set, so you can safely answer 'n'." echo "You already have a root password set, so you can safely answer 'n'."
echo echo
echo -n "Change the root password? [Y/n] " echo $echo_n "Change the root password? [Y/n] $echo_c"
fi fi
read reply read reply
@ -231,7 +242,7 @@ echo "go a bit smoother. You should remove them before moving into a"
echo "production environment." echo "production environment."
echo echo
echo -n "Remove anonymous users? [Y/n] " echo $echo_n "Remove anonymous users? [Y/n] $echo_c"
read reply read reply
if [ "$reply" = "n" ]; then if [ "$reply" = "n" ]; then
@ -250,7 +261,7 @@ echo "Normally, root should only be allowed to connect from 'localhost'. This"
echo "ensures that someone cannot guess at the root password from the network." echo "ensures that someone cannot guess at the root password from the network."
echo echo
echo -n "Disallow root login remotely? [Y/n] " echo $echo_n "Disallow root login remotely? [Y/n] $echo_c"
read reply read reply
if [ "$reply" = "n" ]; then if [ "$reply" = "n" ]; then
echo " ... skipping." echo " ... skipping."
@ -269,7 +280,7 @@ echo "access. This is also intended only for testing, and should be removed"
echo "before moving into a production environment." echo "before moving into a production environment."
echo echo
echo -n "Remove test database and access to it? [Y/n] " echo $echo_n "Remove test database and access to it? [Y/n] $echo_c"
read reply read reply
if [ "$reply" = "n" ]; then if [ "$reply" = "n" ]; then
echo " ... skipping." echo " ... skipping."
@ -287,7 +298,7 @@ echo "Reloading the privilege tables will ensure that all changes made so far"
echo "will take effect immediately." echo "will take effect immediately."
echo echo
echo -n "Reload privilege tables now? [Y/n] " echo $echo_n "Reload privilege tables now? [Y/n] $echo_c"
read reply read reply
if [ "$reply" = "n" ]; then if [ "$reply" = "n" ]; then
echo " ... skipping." echo " ... skipping."

View File

@ -60,7 +60,7 @@ client_settings.h:
libexec_PROGRAMS= mysqlmanager libexec_PROGRAMS= mysqlmanager
mysqlmanager_CXXFLAGS= mysqlmanager_CXXFLAGS=
mysqlmanager_SOURCES= command.cc command.h mysqlmanager.cc \ mysqlmanager_SOURCES= command.cc command.h mysqlmanager.cc \
manager.h manager.cc log.h log.cc \ manager.h manager.cc log.h log.cc \

View File

@ -49,6 +49,10 @@
#define OPT_NDBCLUSTER_DEFAULT 0 #define OPT_NDBCLUSTER_DEFAULT 0
#endif #endif
#ifndef DEFAULT_SKIP_THREAD_PRIORITY
#define DEFAULT_SKIP_THREAD_PRIORITY 0
#endif
#include <thr_alarm.h> #include <thr_alarm.h>
#include <ft_global.h> #include <ft_global.h>
#include <errmsg.h> #include <errmsg.h>
@ -4966,8 +4970,10 @@ struct my_option my_long_options[] =
/* app_type */ 0 /* app_type */ 0
}, },
#endif #endif
#ifndef DISABLE_GRANT_OPTIONS
{"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts.", 0, 0, 0, {"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts.", 0, 0, 0,
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
#endif
{"character-set-client-handshake", OPT_CHARACTER_SET_CLIENT_HANDSHAKE, {"character-set-client-handshake", OPT_CHARACTER_SET_CLIENT_HANDSHAKE,
"Don't ignore client side character set value sent during handshake.", "Don't ignore client side character set value sent during handshake.",
(gptr*) &opt_character_set_client_handshake, (gptr*) &opt_character_set_client_handshake,
@ -5090,9 +5096,11 @@ Disable with --skip-large-pages.",
{"init-connect", OPT_INIT_CONNECT, "Command(s) that are executed for each new connection", {"init-connect", OPT_INIT_CONNECT, "Command(s) that are executed for each new connection",
(gptr*) &opt_init_connect, (gptr*) &opt_init_connect, 0, GET_STR_ALLOC, (gptr*) &opt_init_connect, (gptr*) &opt_init_connect, 0, GET_STR_ALLOC,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
#ifndef DISABLE_GRANT_OPTIONS
{"init-file", OPT_INIT_FILE, "Read SQL commands from this file at startup.", {"init-file", OPT_INIT_FILE, "Read SQL commands from this file at startup.",
(gptr*) &opt_init_file, (gptr*) &opt_init_file, 0, GET_STR, REQUIRED_ARG, (gptr*) &opt_init_file, (gptr*) &opt_init_file, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
#endif
{"init-rpl-role", OPT_INIT_RPL_ROLE, "Set the replication role.", 0, 0, 0, {"init-rpl-role", OPT_INIT_RPL_ROLE, "Set the replication role.", 0, 0, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"init-slave", OPT_INIT_SLAVE, "Command(s) that are executed when a slave connects to this master", {"init-slave", OPT_INIT_SLAVE, "Command(s) that are executed when a slave connects to this master",
@ -5597,10 +5605,12 @@ Can't be set to 1 if --log-slave-updates is used.",
"Show user and password in SHOW SLAVE HOSTS on this master", "Show user and password in SHOW SLAVE HOSTS on this master",
(gptr*) &opt_show_slave_auth_info, (gptr*) &opt_show_slave_auth_info, 0, (gptr*) &opt_show_slave_auth_info, (gptr*) &opt_show_slave_auth_info, 0,
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
#ifndef DISABLE_GRANT_OPTIONS
{"skip-grant-tables", OPT_SKIP_GRANT, {"skip-grant-tables", OPT_SKIP_GRANT,
"Start without grant tables. This gives all users FULL ACCESS to all tables!", "Start without grant tables. This gives all users FULL ACCESS to all tables!",
(gptr*) &opt_noacl, (gptr*) &opt_noacl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, (gptr*) &opt_noacl, (gptr*) &opt_noacl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
0}, 0},
#endif
{"skip-host-cache", OPT_SKIP_HOST_CACHE, "Don't cache host names.", 0, 0, 0, {"skip-host-cache", OPT_SKIP_HOST_CACHE, "Don't cache host names.", 0, 0, 0,
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"skip-locking", OPT_SKIP_LOCK, {"skip-locking", OPT_SKIP_LOCK,
@ -5633,8 +5643,8 @@ Can't be set to 1 if --log-slave-updates is used.",
{"skip-symlink", OPT_SKIP_SYMLINKS, "Don't allow symlinking of tables. Deprecated option. Use --skip-symbolic-links instead.", {"skip-symlink", OPT_SKIP_SYMLINKS, "Don't allow symlinking of tables. Deprecated option. Use --skip-symbolic-links instead.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"skip-thread-priority", OPT_SKIP_PRIOR, {"skip-thread-priority", OPT_SKIP_PRIOR,
"Don't give threads different priorities.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, "Don't give threads different priorities.", 0, 0, 0, GET_NO_ARG, NO_ARG,
0, 0, 0, 0, 0}, DEFAULT_SKIP_THREAD_PRIORITY, 0, 0, 0, 0, 0},
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
{"slave-load-tmpdir", OPT_SLAVE_LOAD_TMPDIR, {"slave-load-tmpdir", OPT_SLAVE_LOAD_TMPDIR,
"The location where the slave should put its temporary files when \ "The location where the slave should put its temporary files when \

View File

@ -704,7 +704,7 @@ buf_pool_init(
} }
} }
buf_pool->page_hash = hash_create(2 * max_size); buf_pool->page_hash = hash0_create(2 * max_size);
buf_pool->n_pend_reads = 0; buf_pool->n_pend_reads = 0;
@ -1755,22 +1755,22 @@ buf_page_init_for_read(
if (*err == DB_TABLESPACE_DELETED if (*err == DB_TABLESPACE_DELETED
|| NULL != buf_page_hash_get(space, offset)) { || NULL != buf_page_hash_get(space, offset)) {
/* The page belongs to a space which has been /* The page belongs to a space which has been
deleted or is being deleted, or the page is deleted or is being deleted, or the page is
already in buf_pool, return */ already in buf_pool, return */
mutex_exit(&block->mutex); mutex_exit(&block->mutex);
mutex_exit(&(buf_pool->mutex)); mutex_exit(&(buf_pool->mutex));
buf_block_free(block); buf_block_free(block);
if (mode == BUF_READ_IBUF_PAGES_ONLY) { if (mode == BUF_READ_IBUF_PAGES_ONLY) {
mtr_commit(&mtr); mtr_commit(&mtr);
} }
return(NULL); return(NULL);
} }
ut_ad(block); ut_ad(block);

View File

@ -854,8 +854,10 @@ buf_flush_batch(
ut_ad((flush_type == BUF_FLUSH_LRU) ut_ad((flush_type == BUF_FLUSH_LRU)
|| (flush_type == BUF_FLUSH_LIST)); || (flush_type == BUF_FLUSH_LIST));
#ifdef UNIV_SYNC_DEBUG
ut_ad((flush_type != BUF_FLUSH_LIST) ut_ad((flush_type != BUF_FLUSH_LIST)
|| sync_thread_levels_empty_gen(TRUE)); || sync_thread_levels_empty_gen(TRUE));
#endif /* UNIV_SYNC_DEBUG */
mutex_enter(&(buf_pool->mutex)); mutex_enter(&(buf_pool->mutex));
if ((buf_pool->n_flush[flush_type] > 0) if ((buf_pool->n_flush[flush_type] > 0)

View File

@ -782,10 +782,10 @@ dict_init(void)
mutex_create(&dict_sys->mutex, SYNC_DICT); mutex_create(&dict_sys->mutex, SYNC_DICT);
dict_sys->table_hash = hash_create(buf_pool_get_max_size() dict_sys->table_hash = hash0_create(buf_pool_get_max_size()
/ (DICT_POOL_PER_TABLE_HASH / (DICT_POOL_PER_TABLE_HASH
* UNIV_WORD_SIZE)); * UNIV_WORD_SIZE));
dict_sys->table_id_hash = hash_create(buf_pool_get_max_size() dict_sys->table_id_hash = hash0_create(buf_pool_get_max_size()
/ (DICT_POOL_PER_TABLE_HASH / (DICT_POOL_PER_TABLE_HASH
* UNIV_WORD_SIZE)); * UNIV_WORD_SIZE));
dict_sys->size = 0; dict_sys->size = 0;
@ -801,16 +801,20 @@ dict_init(void)
} }
/************************************************************************** /**************************************************************************
Returns a table object. NOTE! This is a high-level function to be used Returns a table object and optionally increment its MySQL open handle count.
mainly from outside the 'dict' directory. Inside this directory NOTE! This is a high-level function to be used mainly from outside the
dict_table_get_low is usually the appropriate function. */ 'dict' directory. Inside this directory dict_table_get_low is usually the
appropriate function. */
dict_table_t* dict_table_t*
dict_table_get( dict_table_get(
/*===========*/ /*===========*/
/* out: table, NULL if /* out: table, NULL if
does not exist */ does not exist */
const char* table_name) /* in: table name */ const char* table_name, /* in: table name */
ibool inc_mysql_count)
/* in: whether to increment the open
handle count on the table */
{ {
dict_table_t* table; dict_table_t* table;
@ -818,42 +822,17 @@ dict_table_get(
table = dict_table_get_low(table_name); table = dict_table_get_low(table_name);
mutex_exit(&(dict_sys->mutex)); if (inc_mysql_count && table) {
if (table != NULL) {
if (!table->stat_initialized) {
dict_update_statistics(table);
}
}
return(table);
}
/**************************************************************************
Returns a table object and increments MySQL open handle count on the table. */
dict_table_t*
dict_table_get_and_increment_handle_count(
/*======================================*/
/* out: table, NULL if
does not exist */
const char* table_name) /* in: table name */
{
dict_table_t* table;
mutex_enter(&(dict_sys->mutex));
table = dict_table_get_low(table_name);
if (table != NULL) {
table->n_mysql_handles_opened++; table->n_mysql_handles_opened++;
} }
mutex_exit(&(dict_sys->mutex)); mutex_exit(&(dict_sys->mutex));
if (table != NULL) { if (table != NULL) {
if (!table->stat_initialized && !table->ibd_file_missing) { if (!table->stat_initialized) {
/* If table->ibd_file_missing == TRUE, this will
print an error message and return without doing
anything. */
dict_update_statistics(table); dict_update_statistics(table);
} }
} }

View File

@ -1323,8 +1323,8 @@ fil_system_create(
mutex_create(&system->mutex, SYNC_ANY_LATCH); mutex_create(&system->mutex, SYNC_ANY_LATCH);
system->spaces = hash_create(hash_size); system->spaces = hash0_create(hash_size);
system->name_hash = hash_create(hash_size); system->name_hash = hash0_create(hash_size);
UT_LIST_INIT(system->LRU); UT_LIST_INIT(system->LRU);

View File

@ -18,21 +18,23 @@ Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */ chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
ha_create( ha_create_func(
/*======*/ /*===========*/
/* out, own: created table */ /* out, own: created table */
ibool in_btr_search, /* in: TRUE if the hash table is used in ibool in_btr_search, /* in: TRUE if the hash table is used in
the btr_search module */ the btr_search module */
ulint n, /* in: number of array cells */ ulint n, /* in: number of array cells */
ulint n_mutexes, /* in: number of mutexes to protect the #ifdef UNIV_SYNC_DEBUG
hash table: must be a power of 2, or 0 */ ulint mutex_level, /* in: level of the mutexes in the latching
ulint mutex_level) /* in: level of the mutexes in the latching
order: this is used in the debug version */ order: this is used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
ulint n_mutexes) /* in: number of mutexes to protect the
hash table: must be a power of 2, or 0 */
{ {
hash_table_t* table; hash_table_t* table;
ulint i; ulint i;
table = hash_create(n); table = hash0_create(n);
if (in_btr_search) { if (in_btr_search) {
table->adaptive = TRUE; table->adaptive = TRUE;

View File

@ -74,7 +74,7 @@ Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */ chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
hash_create( hash0_create(
/*========*/ /*========*/
/* out, own: created table */ /* out, own: created table */
ulint n) /* in: number of array cells */ ulint n) /* in: number of array cells */
@ -129,13 +129,15 @@ hash_table_free(
Creates a mutex array to protect a hash table. */ Creates a mutex array to protect a hash table. */
void void
hash_create_mutexes( hash_create_mutexes_func(
/*================*/ /*=====================*/
hash_table_t* table, /* in: hash table */ hash_table_t* table, /* in: hash table */
ulint n_mutexes, /* in: number of mutexes, must be a #ifdef UNIV_SYNC_DEBUG
power of 2 */ ulint sync_level, /* in: latching order level of the
ulint sync_level) /* in: latching order level of the
mutexes: used in the debug version */ mutexes: used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
ulint n_mutexes) /* in: number of mutexes, must be a
power of 2 */
{ {
ulint i; ulint i;

View File

@ -39,9 +39,6 @@ have disables the InnoDB inlining in this file. */
#include <myisampack.h> #include <myisampack.h>
#include <mysys_err.h> #include <mysys_err.h>
#include <my_sys.h> #include <my_sys.h>
#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1))
#include "ha_innodb.h" #include "ha_innodb.h"
pthread_mutex_t innobase_share_mutex, /* to protect innobase_open_files */ pthread_mutex_t innobase_share_mutex, /* to protect innobase_open_files */
@ -1261,18 +1258,6 @@ trx_is_interrupted(
return(trx && trx->mysql_thd && ((THD*) trx->mysql_thd)->killed); return(trx && trx->mysql_thd && ((THD*) trx->mysql_thd)->killed);
} }
/**************************************************************************
Obtain a pointer to the MySQL THD object, as in current_thd(). This
definition must match the one in sql/ha_innodb.cc! */
extern "C"
void*
innobase_current_thd(void)
/*======================*/
/* out: MySQL THD object */
{
return(current_thd);
}
/********************************************************************* /*********************************************************************
Call this when you have opened a new table handle in HANDLER, before you Call this when you have opened a new table handle in HANDLER, before you
call index_read_idx() etc. Actually, we can let the cursor stay open even call index_read_idx() etc. Actually, we can let the cursor stay open even
@ -2354,7 +2339,7 @@ ha_innobase::open(
/* Get pointer to a table object in InnoDB dictionary cache */ /* Get pointer to a table object in InnoDB dictionary cache */
ib_table = dict_table_get_and_increment_handle_count(norm_name); ib_table = dict_table_get(norm_name, TRUE);
if (NULL == ib_table) { if (NULL == ib_table) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
@ -4451,7 +4436,7 @@ ha_innobase::rnd_pos(
} }
if (error) { if (error) {
DBUG_PRINT("error", ("Got error: %d", error)); DBUG_PRINT("error", ("Got error: %d", error));
DBUG_RETURN(error); DBUG_RETURN(error);
} }
@ -4932,7 +4917,7 @@ ha_innobase::create(
log_buffer_flush_to_disk(); log_buffer_flush_to_disk();
innobase_table = dict_table_get(norm_name); innobase_table = dict_table_get(norm_name, FALSE);
DBUG_ASSERT(innobase_table != 0); DBUG_ASSERT(innobase_table != 0);
@ -5543,16 +5528,10 @@ ha_innobase::info(
prebuilt->trx->op_info = (char*) prebuilt->trx->op_info = (char*)
"returning various info to MySQL"; "returning various info to MySQL";
if (ib_table->space != 0) { my_snprintf(path, sizeof(path), "%s/%s%s",
my_snprintf(path, sizeof(path), "%s/%s%s",
mysql_data_home, ib_table->name, ".ibd");
unpack_filename(path,path);
} else {
my_snprintf(path, sizeof(path), "%s/%s%s",
mysql_data_home, ib_table->name, reg_ext); mysql_data_home, ib_table->name, reg_ext);
unpack_filename(path,path); unpack_filename(path,path);
}
/* Note that we do not know the access time of the table, /* Note that we do not know the access time of the table,
nor the CHECK TABLE time, nor the UPDATE or INSERT time. */ nor the CHECK TABLE time, nor the UPDATE or INSERT time. */
@ -6617,22 +6596,23 @@ innodb_mutex_show_status(
{ {
char buf1[IO_SIZE], buf2[IO_SIZE]; char buf1[IO_SIZE], buf2[IO_SIZE];
mutex_t* mutex; mutex_t* mutex;
#ifdef UNIV_DEBUG
ulint rw_lock_count= 0; ulint rw_lock_count= 0;
ulint rw_lock_count_spin_loop= 0; ulint rw_lock_count_spin_loop= 0;
ulint rw_lock_count_spin_rounds= 0; ulint rw_lock_count_spin_rounds= 0;
ulint rw_lock_count_os_wait= 0; ulint rw_lock_count_os_wait= 0;
ulint rw_lock_count_os_yield= 0; ulint rw_lock_count_os_yield= 0;
ulonglong rw_lock_wait_time= 0; ulonglong rw_lock_wait_time= 0;
#endif /* UNIV_DEBUG */
uint hton_name_len= strlen(innobase_hton_name), buf1len, buf2len; uint hton_name_len= strlen(innobase_hton_name), buf1len, buf2len;
DBUG_ENTER("innodb_mutex_show_status"); DBUG_ENTER("innodb_mutex_show_status");
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER mutex_enter_noninline(&mutex_list_mutex);
mutex_enter(&mutex_list_mutex);
#endif
mutex = UT_LIST_GET_FIRST(mutex_list); mutex = UT_LIST_GET_FIRST(mutex_list);
while (mutex != NULL) { while (mutex != NULL) {
#ifdef UNIV_DEBUG
if (mutex->mutex_type != 1) { if (mutex->mutex_type != 1) {
if (mutex->count_using > 0) { if (mutex->count_using > 0) {
buf1len= my_snprintf(buf1, sizeof(buf1), buf1len= my_snprintf(buf1, sizeof(buf1),
@ -6648,14 +6628,13 @@ innodb_mutex_show_status(
mutex->count_spin_rounds, mutex->count_spin_rounds,
mutex->count_os_wait, mutex->count_os_wait,
mutex->count_os_yield, mutex->count_os_yield,
(ulong) (mutex->lspent_time/1000)); (ulong) (mutex->lspent_time/1000));
if (stat_print(thd, innobase_hton_name, if (stat_print(thd, innobase_hton_name,
hton_name_len, buf1, buf1len, hton_name_len, buf1, buf1len,
buf2, buf2len)) { buf2, buf2len)) {
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER mutex_exit_noninline(
mutex_exit(&mutex_list_mutex); &mutex_list_mutex);
#endif
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
@ -6668,26 +6647,39 @@ innodb_mutex_show_status(
rw_lock_count_os_yield += mutex->count_os_yield; rw_lock_count_os_yield += mutex->count_os_yield;
rw_lock_wait_time += mutex->lspent_time; rw_lock_wait_time += mutex->lspent_time;
} }
#else /* UNIV_DEBUG */
buf1len= my_snprintf(buf1, sizeof(buf1), "%s:%lu",
mutex->cfile_name, (ulong) mutex->cline);
buf2len= my_snprintf(buf2, sizeof(buf2), "os_waits=%lu",
mutex->count_os_wait);
if (stat_print(thd, innobase_hton_name,
hton_name_len, buf1, buf1len,
buf2, buf2len)) {
mutex_exit_noninline(&mutex_list_mutex);
DBUG_RETURN(1);
}
#endif /* UNIV_DEBUG */
mutex = UT_LIST_GET_NEXT(list, mutex); mutex = UT_LIST_GET_NEXT(list, mutex);
} }
mutex_exit_noninline(&mutex_list_mutex);
#ifdef UNIV_DEBUG
buf2len= my_snprintf(buf2, sizeof(buf2), buf2len= my_snprintf(buf2, sizeof(buf2),
"count=%lu, spin_waits=%lu, spin_rounds=%lu, " "count=%lu, spin_waits=%lu, spin_rounds=%lu, "
"os_waits=%lu, os_yields=%lu, os_wait_times=%lu", "os_waits=%lu, os_yields=%lu, os_wait_times=%lu",
rw_lock_count, rw_lock_count_spin_loop, rw_lock_count, rw_lock_count_spin_loop,
rw_lock_count_spin_rounds, rw_lock_count_spin_rounds,
rw_lock_count_os_wait, rw_lock_count_os_yield, rw_lock_count_os_wait, rw_lock_count_os_yield,
(ulong) (rw_lock_wait_time/1000)); (ulong) (rw_lock_wait_time/1000));
if (stat_print(thd, innobase_hton_name, hton_name_len, if (stat_print(thd, innobase_hton_name, hton_name_len,
STRING_WITH_LEN("rw_lock_mutexes"), buf2, buf2len)) { STRING_WITH_LEN("rw_lock_mutexes"), buf2, buf2len)) {
DBUG_RETURN(1); DBUG_RETURN(1);
} }
#endif /* UNIV_DEBUG */
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
mutex_exit(&mutex_list_mutex);
#endif
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
@ -7360,7 +7352,6 @@ innobase_get_at_most_n_mbchars(
} }
} }
extern "C" {
/********************************************************************** /**********************************************************************
This function returns true if This function returns true if
@ -7370,33 +7361,34 @@ is either REPLACE or LOAD DATA INFILE REPLACE.
2) SQL-query in the current thread 2) SQL-query in the current thread
is INSERT ON DUPLICATE KEY UPDATE. is INSERT ON DUPLICATE KEY UPDATE.
NOTE that /mysql/innobase/row/row0ins.c must contain the NOTE that storage/innobase/row/row0ins.c must contain the
prototype for this function ! */ prototype for this function ! */
extern "C"
ibool ibool
innobase_query_is_update(void) innobase_query_is_update(void)
/*==========================*/ /*==========================*/
{ {
THD* thd; THD* thd = current_thd;
thd = (THD *)innobase_current_thd(); if (!thd) {
/* InnoDB's internal threads may run InnoDB stored procedures
that call this function. Then current_thd is not defined
(it is probably NULL). */
if (thd->lex->sql_command == SQLCOM_REPLACE || return(FALSE);
thd->lex->sql_command == SQLCOM_REPLACE_SELECT ||
(thd->lex->sql_command == SQLCOM_LOAD &&
thd->lex->duplicates == DUP_REPLACE)) {
return(1);
} }
if (thd->lex->sql_command == SQLCOM_INSERT && switch (thd->lex->sql_command) {
thd->lex->duplicates == DUP_UPDATE) { case SQLCOM_REPLACE:
case SQLCOM_REPLACE_SELECT:
return(1); return(TRUE);
case SQLCOM_LOAD:
return(thd->lex->duplicates == DUP_REPLACE);
case SQLCOM_INSERT:
return(thd->lex->duplicates == DUP_UPDATE);
default:
return(FALSE);
} }
return(0);
}
} }
/*********************************************************************** /***********************************************************************

View File

@ -160,7 +160,7 @@ struct btr_search_struct{
number of full fields */ number of full fields */
ulint n_bytes; /* recommended prefix: number of bytes in ulint n_bytes; /* recommended prefix: number of bytes in
an incomplete field; an incomplete field;
cf. BTR_PAGE_MAX_REC_SIZE */ see also BTR_PAGE_MAX_REC_SIZE */
ibool left_side; /* TRUE or FALSE, depending on whether ibool left_side; /* TRUE or FALSE, depending on whether
the leftmost record of several records with the leftmost record of several records with
the same prefix should be indexed in the the same prefix should be indexed in the

View File

@ -625,8 +625,6 @@ buf_page_release(
RW_NO_LATCH */ RW_NO_LATCH */
mtr_t* mtr) /* in: mtr */ mtr_t* mtr) /* in: mtr */
{ {
ulint buf_fix_count;
ut_ad(block); ut_ad(block);
ut_a(block->state == BUF_BLOCK_FILE_PAGE); ut_a(block->state == BUF_BLOCK_FILE_PAGE);
@ -643,8 +641,7 @@ buf_page_release(
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
rw_lock_s_unlock(&(block->debug_latch)); rw_lock_s_unlock(&(block->debug_latch));
#endif #endif
buf_fix_count = block->buf_fix_count; block->buf_fix_count--;
block->buf_fix_count = buf_fix_count - 1;
mutex_exit(&block->mutex); mutex_exit(&block->mutex);

View File

@ -65,8 +65,8 @@ dtype_get_mblen(
innobase_get_cset_width(dtype_get_charset_coll(prtype), innobase_get_cset_width(dtype_get_charset_coll(prtype),
mbminlen, mbmaxlen); mbminlen, mbmaxlen);
ut_ad(*mbminlen <= *mbmaxlen); ut_ad(*mbminlen <= *mbmaxlen);
ut_ad(*mbminlen <= 2); /* cf. the bit-field in dtype_t */ ut_ad(*mbminlen <= 2); /* mbminlen in dtype_t is 0..3 */
ut_ad(*mbmaxlen < 1 << 3); /* cf. the bit-field in dtype_t */ ut_ad(*mbmaxlen < 1 << 3); /* mbmaxlen in dtype_t is 0..7 */
#else /* !UNIV_HOTBACKUP */ #else /* !UNIV_HOTBACKUP */
ut_a(mtype <= DATA_BINARY); ut_a(mtype <= DATA_BINARY);
*mbminlen = *mbmaxlen = 1; *mbminlen = *mbmaxlen = 1;

View File

@ -326,26 +326,20 @@ dict_foreign_parse_drop_constraints(
const char*** constraints_to_drop); /* out: id's of the const char*** constraints_to_drop); /* out: id's of the
constraints to drop */ constraints to drop */
/************************************************************************** /**************************************************************************
Returns a table object. NOTE! This is a high-level function to be used Returns a table object and optionally increment its MySQL open handle count.
mainly from outside the 'dict' directory. Inside this directory NOTE! This is a high-level function to be used mainly from outside the
dict_table_get_low is usually the appropriate function. */ 'dict' directory. Inside this directory dict_table_get_low is usually the
appropriate function. */
dict_table_t* dict_table_t*
dict_table_get( dict_table_get(
/*===========*/ /*===========*/
/* out: table, NULL if /* out: table, NULL if
does not exist */ does not exist */
const char* table_name); /* in: table name */ const char* table_name, /* in: table name */
/************************************************************************** ibool inc_mysql_count);
Returns a table object and increments MySQL open handle count on the table. /* in: whether to increment the open
*/ handle count on the table */
dict_table_t*
dict_table_get_and_increment_handle_count(
/*======================================*/
/* out: table, NULL if
does not exist */
const char* table_name); /* in: table name */
/************************************************************************** /**************************************************************************
Returns a table object based on table id. */ Returns a table object based on table id. */

View File

@ -41,16 +41,23 @@ Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */ chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
ha_create( ha_create_func(
/*======*/ /*===========*/
/* out, own: created table */ /* out, own: created table */
ibool in_btr_search, /* in: TRUE if the hash table is used in ibool in_btr_search, /* in: TRUE if the hash table is used in
the btr_search module */ the btr_search module */
ulint n, /* in: number of array cells */ ulint n, /* in: number of array cells */
ulint n_mutexes, /* in: number of mutexes to protect the #ifdef UNIV_SYNC_DEBUG
hash table: must be a power of 2 */ ulint mutex_level, /* in: level of the mutexes in the latching
ulint mutex_level); /* in: level of the mutexes in the latching
order: this is used in the debug version */ order: this is used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
ulint n_mutexes); /* in: number of mutexes to protect the
hash table: must be a power of 2 */
#ifdef UNIV_SYNC_DEBUG
# define ha_create(b,n_c,n_m,level) ha_create_func(b,n_c,level,n_m)
#else /* UNIV_SYNC_DEBUG */
# define ha_create(b,n_c,n_m,level) ha_create_func(b,n_c,n_m)
#endif /* UNIV_SYNC_DEBUG */
/***************************************************************** /*****************************************************************
Inserts an entry into a hash table. If an entry with the same fold number Inserts an entry into a hash table. If an entry with the same fold number
is found, its node is updated to point to the new data, and no new node is found, its node is updated to point to the new data, and no new node

View File

@ -23,7 +23,7 @@ Creates a hash table with >= n array cells. The actual number
of cells is chosen to be a prime number slightly bigger than n. */ of cells is chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
hash_create( hash0_create(
/*========*/ /*========*/
/* out, own: created table */ /* out, own: created table */
ulint n); /* in: number of array cells */ ulint n); /* in: number of array cells */
@ -31,12 +31,20 @@ hash_create(
Creates a mutex array to protect a hash table. */ Creates a mutex array to protect a hash table. */
void void
hash_create_mutexes( hash_create_mutexes_func(
/*================*/ /*=====================*/
hash_table_t* table, /* in: hash table */ hash_table_t* table, /* in: hash table */
ulint n_mutexes, /* in: number of mutexes */ #ifdef UNIV_SYNC_DEBUG
ulint sync_level); /* in: latching order level of the ulint sync_level, /* in: latching order level of the
mutexes: used in the debug version */ mutexes: used in the debug version */
#endif /* UNIV_SYNC_DEBUG */
ulint n_mutexes); /* in: number of mutexes */
#ifdef UNIV_SYNC_DEBUG
# define hash_create_mutexes(t,n,level) hash_create_mutexes_func(t,level,n)
#else /* UNIV_SYNC_DEBUG */
# define hash_create_mutexes(t,n,level) hash_create_mutexes_func(t,n)
#endif /* UNIV_SYNC_DEBUG */
/***************************************************************** /*****************************************************************
Frees a hash table. */ Frees a hash table. */

View File

@ -61,8 +61,18 @@ Creates, or rather, initializes an rw-lock object in a specified memory
location (which must be appropriately aligned). The rw-lock is initialized location (which must be appropriately aligned). The rw-lock is initialized
to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free to the non-locked state. Explicit freeing of the rw-lock with rw_lock_free
is necessary only if the memory block containing it is freed. */ is necessary only if the memory block containing it is freed. */
#define rw_lock_create(L, level) \ #ifdef UNIV_DEBUG
rw_lock_create_func((L), (level), __FILE__, __LINE__, #L) # ifdef UNIV_SYNC_DEBUG
# define rw_lock_create(L, level) \
rw_lock_create_func((L), (level), #L, __FILE__, __LINE__)
# else /* UNIV_SYNC_DEBUG */
# define rw_lock_create(L, level) \
rw_lock_create_func((L), #L, __FILE__, __LINE__)
# endif /* UNIV_SYNC_DEBUG */
#else /* UNIV_DEBUG */
# define rw_lock_create(L, level) \
rw_lock_create_func((L), __FILE__, __LINE__)
#endif /* UNIV_DEBUG */
/********************************************************************** /**********************************************************************
Creates, or rather, initializes an rw-lock object in a specified memory Creates, or rather, initializes an rw-lock object in a specified memory
@ -74,10 +84,14 @@ void
rw_lock_create_func( rw_lock_create_func(
/*================*/ /*================*/
rw_lock_t* lock, /* in: pointer to memory */ rw_lock_t* lock, /* in: pointer to memory */
#ifdef UNIV_DEBUG
# ifdef UNIV_SYNC_DEBUG
ulint level, /* in: level */ ulint level, /* in: level */
# endif /* UNIV_SYNC_DEBUG */
const char* cmutex_name, /* in: mutex name */
#endif /* UNIV_DEBUG */
const char* cfile_name, /* in: file name where created */ const char* cfile_name, /* in: file name where created */
ulint cline, /* in: file line where created */ ulint cline); /* in: file line where created */
const char* cmutex_name); /* in: mutex name */
/********************************************************************** /**********************************************************************
Calling this function is obligatory only if the memory buffer containing Calling this function is obligatory only if the memory buffer containing
the rw-lock is freed. Removes an rw-lock object from the global list. The the rw-lock is freed. Removes an rw-lock object from the global list. The

View File

@ -39,8 +39,18 @@ location (which must be appropriately aligned). The mutex is initialized
in the reset state. Explicit freeing of the mutex with mutex_free is in the reset state. Explicit freeing of the mutex with mutex_free is
necessary only if the memory block containing it is freed. */ necessary only if the memory block containing it is freed. */
#define mutex_create(M, level) \ #ifdef UNIV_DEBUG
mutex_create_func((M), (level), __FILE__, __LINE__, #M) # ifdef UNIV_SYNC_DEBUG
# define mutex_create(M, level) \
mutex_create_func((M), #M, (level), __FILE__, __LINE__)
# else
# define mutex_create(M, level) \
mutex_create_func((M), #M, __FILE__, __LINE__)
# endif
#else
# define mutex_create(M, level) \
mutex_create_func((M), __FILE__, __LINE__)
#endif
/********************************************************************** /**********************************************************************
Creates, or rather, initializes a mutex object in a specified memory Creates, or rather, initializes a mutex object in a specified memory
@ -52,10 +62,14 @@ void
mutex_create_func( mutex_create_func(
/*==============*/ /*==============*/
mutex_t* mutex, /* in: pointer to memory */ mutex_t* mutex, /* in: pointer to memory */
#ifdef UNIV_DEBUG
const char* cmutex_name, /* in: mutex name */
# ifdef UNIV_SYNC_DEBUG
ulint level, /* in: level */ ulint level, /* in: level */
# endif /* UNIV_SYNC_DEBUG */
#endif /* UNIV_DEBUG */
const char* cfile_name, /* in: file name where created */ const char* cfile_name, /* in: file name where created */
ulint cline, /* in: file line where created */ ulint cline); /* in: file line where created */
const char* cmutex_name); /* in: mutex name */
/********************************************************************** /**********************************************************************
Calling this function is obligatory only if the memory buffer containing Calling this function is obligatory only if the memory buffer containing
the mutex is freed. Removes a mutex object from the mutex list. The mutex the mutex is freed. Removes a mutex object from the mutex list. The mutex
@ -149,6 +163,7 @@ void
sync_print( sync_print(
/*=======*/ /*=======*/
FILE* file); /* in: file where to print */ FILE* file); /* in: file where to print */
#ifdef UNIV_DEBUG
/********************************************************************** /**********************************************************************
Checks that the mutex has been initialized. */ Checks that the mutex has been initialized. */
@ -156,6 +171,8 @@ ibool
mutex_validate( mutex_validate(
/*===========*/ /*===========*/
mutex_t* mutex); mutex_t* mutex);
#endif /* UNIV_DEBUG */
#ifdef UNIV_SYNC_DEBUG
/********************************************************************** /**********************************************************************
Adds a latch and its level in the thread level array. Allocates the memory Adds a latch and its level in the thread level array. Allocates the memory
for the array if called first time for this OS thread. Makes the checks for the array if called first time for this OS thread. Makes the checks
@ -197,7 +214,6 @@ sync_thread_levels_empty_gen(
allowed to be owned by the thread, allowed to be owned by the thread,
also purge_is_running mutex is also purge_is_running mutex is
allowed */ allowed */
#ifdef UNIV_SYNC_DEBUG
/********************************************************************** /**********************************************************************
Checks that the current thread owns the mutex. Works only Checks that the current thread owns the mutex. Works only
in the debug version. */ in the debug version. */
@ -465,26 +481,29 @@ struct mutex_struct {
ulint line; /* Line where the mutex was locked */ ulint line; /* Line where the mutex was locked */
os_thread_id_t thread_id; /* Debug version: The thread id of the os_thread_id_t thread_id; /* Debug version: The thread id of the
thread which locked the mutex. */ thread which locked the mutex. */
#endif /* UNIV_SYNC_DEBUG */
ulint level; /* Level in the global latching order */ ulint level; /* Level in the global latching order */
#endif /* UNIV_SYNC_DEBUG */
const char* cfile_name;/* File name where mutex created */ const char* cfile_name;/* File name where mutex created */
ulint cline; /* Line where created */ ulint cline; /* Line where created */
ulint magic_n; #ifdef UNIV_DEBUG
ulint magic_n;
# define MUTEX_MAGIC_N (ulint)979585
#endif /* UNIV_DEBUG */
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
ulong count_using; /* count of times mutex used */ ulong count_os_wait; /* count of os_wait */
ulong count_spin_loop; /* count of spin loops */ # ifdef UNIV_DEBUG
ulong count_spin_rounds; /* count of spin rounds */ ulong count_using; /* count of times mutex used */
ulong count_os_wait; /* count of os_wait */ ulong count_spin_loop; /* count of spin loops */
ulong count_os_yield; /* count of os_wait */ ulong count_spin_rounds; /* count of spin rounds */
ulonglong lspent_time; /* mutex os_wait timer msec */ ulong count_os_yield; /* count of os_wait */
ulonglong lmax_spent_time; /* mutex os_wait timer msec */ ulonglong lspent_time; /* mutex os_wait timer msec */
const char* cmutex_name;/* mutex name */ ulonglong lmax_spent_time; /* mutex os_wait timer msec */
ulint mutex_type;/* 0 - usual mutex 1 - rw_lock mutex */ const char* cmutex_name;/* mutex name */
ulint mutex_type;/* 0 - usual mutex 1 - rw_lock mutex */
# endif /* UNIV_DEBUG */
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
}; };
#define MUTEX_MAGIC_N (ulint)979585
/* The global array of wait cells for implementation of the databases own /* The global array of wait cells for implementation of the databases own
mutexes and read-write locks. Appears here for debugging purposes only! */ mutexes and read-write locks. Appears here for debugging purposes only! */
@ -496,20 +515,16 @@ to 20 microseconds. */
#define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds #define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds
#define SYNC_INFINITE_TIME ((ulint)(-1))
/* Means that a timeout elapsed when waiting */
#define SYNC_TIME_EXCEEDED (ulint)1
/* The number of system calls made in this module. Intended for performance /* The number of system calls made in this module. Intended for performance
monitoring. */ monitoring. */
extern ulint mutex_system_call_count; extern ulint mutex_system_call_count;
extern ulint mutex_exit_count; extern ulint mutex_exit_count;
#ifdef UNIV_SYNC_DEBUG
/* Latching order checks start when this is set TRUE */ /* Latching order checks start when this is set TRUE */
extern ibool sync_order_checks_on; extern ibool sync_order_checks_on;
#endif /* UNIV_SYNC_DEBUG */
/* This variable is set to TRUE when sync_init is called */ /* This variable is set to TRUE when sync_init is called */
extern ibool sync_initialized; extern ibool sync_initialized;

View File

@ -254,9 +254,9 @@ mutex_enter_func(
/* Note that we do not peek at the value of lock_word before trying /* Note that we do not peek at the value of lock_word before trying
the atomic test_and_set; we could peek, and possibly save time. */ the atomic test_and_set; we could peek, and possibly save time. */
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
mutex->count_using++; mutex->count_using++;
#endif /* UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
if (!mutex_test_and_set(mutex)) { if (!mutex_test_and_set(mutex)) {
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG

View File

@ -83,19 +83,27 @@ memory is read outside the allocated blocks. */
/* Make a non-inline debug version */ /* Make a non-inline debug version */
#if 0 #if 0
#define UNIV_DEBUG #define UNIV_DEBUG /* Enable ut_ad() assertions */
#define UNIV_MEM_DEBUG #define UNIV_LIST_DEBUG /* debug UT_LIST_ macros */
#define UNIV_IBUF_DEBUG #define UNIV_MEM_DEBUG /* detect memory leaks etc */
#define UNIV_SYNC_DEBUG #define UNIV_IBUF_DEBUG /* debug the insert buffer;
#define UNIV_SEARCH_DEBUG this limits the database to IBUF_COUNT_N_SPACES and IBUF_COUNT_N_PAGES,
#define UNIV_SYNC_PERF_STAT and the insert buffer must be empty when the database is started */
#define UNIV_SEARCH_PERF_STAT #define UNIV_SYNC_DEBUG /* debug mutex and latch
#define UNIV_SRV_PRINT_LATCH_WAITS operations (very slow); also UNIV_DEBUG must be defined */
#define UNIV_BTR_PRINT #define UNIV_SEARCH_DEBUG /* debug B-tree comparisons */
#define UNIV_SYNC_PERF_STAT /* operation counts for
rw-locks and mutexes */
#define UNIV_SEARCH_PERF_STAT /* statistics for the
adaptive hash index */
#define UNIV_SRV_PRINT_LATCH_WAITS /* enable diagnostic output
in sync0sync.c */
#define UNIV_BTR_PRINT /* enable functions for
printing B-trees */
#endif #endif
#define UNIV_BTR_DEBUG #define UNIV_BTR_DEBUG /* check B-tree links */
#define UNIV_LIGHT_MEM_DEBUG #define UNIV_LIGHT_MEM_DEBUG /* light memory debugging */
#ifdef HAVE_purify #ifdef HAVE_purify
/* The following sets all new allocated memory to zero before use: /* The following sets all new allocated memory to zero before use:

View File

@ -124,7 +124,7 @@ name, NODE1 and NODE2 are pointers to nodes. */
}\ }\
/* Invalidate the pointers in a list node. */ /* Invalidate the pointers in a list node. */
#ifdef UNIV_DEBUG #ifdef UNIV_LIST_DEBUG
# define UT_LIST_REMOVE_CLEAR(NAME, N) \ # define UT_LIST_REMOVE_CLEAR(NAME, N) \
((N)->NAME.prev = (N)->NAME.next = (void*) -1) ((N)->NAME.prev = (N)->NAME.next = (void*) -1)
#else #else

View File

@ -586,7 +586,7 @@ lock_sys_create(
{ {
lock_sys = mem_alloc(sizeof(lock_sys_t)); lock_sys = mem_alloc(sizeof(lock_sys_t));
lock_sys->rec_hash = hash_create(n_cells); lock_sys->rec_hash = hash0_create(n_cells);
/* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */ /* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */
@ -4391,10 +4391,6 @@ loop:
trx->read_view->up_limit_id)); trx->read_view->up_limit_id));
} }
fprintf(file,
"Trx has approximately %lu row locks\n",
(ulong) lock_number_of_rows_locked(trx));
if (trx->que_state == TRX_QUE_LOCK_WAIT) { if (trx->que_state == TRX_QUE_LOCK_WAIT) {
fprintf(file, fprintf(file,
"------- TRX HAS BEEN WAITING %lu SEC" "------- TRX HAS BEEN WAITING %lu SEC"

View File

@ -33,6 +33,7 @@ Created 9/20/1997 Heikki Tuuri
#include "btr0cur.h" #include "btr0cur.h"
#include "dict0boot.h" #include "dict0boot.h"
#include "fil0fil.h" #include "fil0fil.h"
#include "sync0sync.h"
#ifdef UNIV_HOTBACKUP #ifdef UNIV_HOTBACKUP
/* This is set to FALSE if the backup was originally taken with the /* This is set to FALSE if the backup was originally taken with the
@ -146,7 +147,7 @@ recv_sys_init(
recv_sys->len = 0; recv_sys->len = 0;
recv_sys->recovered_offset = 0; recv_sys->recovered_offset = 0;
recv_sys->addr_hash = hash_create(available_memory / 64); recv_sys->addr_hash = hash0_create(available_memory / 64);
recv_sys->n_addrs = 0; recv_sys->n_addrs = 0;
recv_sys->apply_log_recs = FALSE; recv_sys->apply_log_recs = FALSE;
@ -187,9 +188,10 @@ recv_sys_empty_hash(void)
hash_table_free(recv_sys->addr_hash); hash_table_free(recv_sys->addr_hash);
mem_heap_empty(recv_sys->heap); mem_heap_empty(recv_sys->heap);
recv_sys->addr_hash = hash_create(buf_pool_get_curr_size() / 256); recv_sys->addr_hash = hash0_create(buf_pool_get_curr_size() / 256);
} }
#ifndef UNIV_LOG_DEBUG
/************************************************************ /************************************************************
Frees the recovery system. */ Frees the recovery system. */
static static
@ -209,6 +211,7 @@ recv_sys_free(void)
mutex_exit(&(recv_sys->mutex)); mutex_exit(&(recv_sys->mutex));
} }
#endif /* UNIV_LOG_DEBUG */
/************************************************************ /************************************************************
Truncates possible corrupted or extra records from a log group. */ Truncates possible corrupted or extra records from a log group. */
@ -2855,6 +2858,15 @@ recv_recovery_from_checkpoint_finish(void)
#ifndef UNIV_LOG_DEBUG #ifndef UNIV_LOG_DEBUG
recv_sys_free(); recv_sys_free();
#endif #endif
#ifdef UNIV_SYNC_DEBUG
/* Wait for a while so that created threads have time to suspend
themselves before we switch the latching order checks on */
os_thread_sleep(1000000);
/* Switch latching order checks on in sync0sync.c */
sync_order_checks_on = TRUE;
#endif
if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) { if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) {
/* Rollback the uncommitted transactions which have no user /* Rollback the uncommitted transactions which have no user
session */ session */

View File

@ -1524,7 +1524,8 @@ row_ins_check_foreign_constraints(
if (foreign->foreign_index == index) { if (foreign->foreign_index == index) {
if (foreign->referenced_table == NULL) { if (foreign->referenced_table == NULL) {
dict_table_get(foreign->referenced_table_name); dict_table_get(foreign->referenced_table_name,
FALSE);
} }
if (0 == trx->dict_operation_lock_mode) { if (0 == trx->dict_operation_lock_mode) {

View File

@ -1831,7 +1831,9 @@ stop_for_a_while:
mtr_commit(&mtr); mtr_commit(&mtr);
#ifdef UNIV_SYNC_DEBUG
ut_ad(sync_thread_levels_empty_gen(TRUE)); ut_ad(sync_thread_levels_empty_gen(TRUE));
#endif /* UNIV_SYNC_DEBUG */
err = DB_SUCCESS; err = DB_SUCCESS;
goto func_exit; goto func_exit;
@ -1850,7 +1852,9 @@ commit_mtr_for_a_while:
leaf_contains_updates = FALSE; leaf_contains_updates = FALSE;
mtr_has_extra_clust_latch = FALSE; mtr_has_extra_clust_latch = FALSE;
#ifdef UNIV_SYNC_DEBUG
ut_ad(sync_thread_levels_empty_gen(TRUE)); ut_ad(sync_thread_levels_empty_gen(TRUE));
#endif /* UNIV_SYNC_DEBUG */
goto table_loop; goto table_loop;
@ -1866,7 +1870,9 @@ lock_wait_or_error:
mtr_commit(&mtr); mtr_commit(&mtr);
#ifdef UNIV_SYNC_DEBUG
ut_ad(sync_thread_levels_empty_gen(TRUE)); ut_ad(sync_thread_levels_empty_gen(TRUE));
#endif /* UNIV_SYNC_DEBUG */
func_exit: func_exit:
if (UNIV_LIKELY_NULL(heap)) { if (UNIV_LIKELY_NULL(heap)) {
@ -4447,7 +4453,7 @@ row_search_check_if_query_cache_permitted(
dict_table_t* table; dict_table_t* table;
ibool ret = FALSE; ibool ret = FALSE;
table = dict_table_get(norm_name); table = dict_table_get(norm_name, FALSE);
if (table == NULL) { if (table == NULL) {

View File

@ -202,7 +202,8 @@ row_upd_check_references_constraints(
foreign->n_fields))) { foreign->n_fields))) {
if (foreign->foreign_table == NULL) { if (foreign->foreign_table == NULL) {
dict_table_get(foreign->foreign_table_name); dict_table_get(foreign->foreign_table_name,
FALSE);
} }
if (foreign->foreign_table) { if (foreign->foreign_table) {

View File

@ -1601,17 +1601,6 @@ innobase_start_or_create_for_mysql(void)
srv_was_started = TRUE; srv_was_started = TRUE;
srv_is_being_started = FALSE; srv_is_being_started = FALSE;
#ifdef UNIV_DEBUG
/* Wait a while so that the created threads have time to suspend
themselves before we switch sync debugging on; otherwise a thread may
execute mutex_enter() before the checks are on, and mutex_exit() after
the checks are on, which will cause an assertion failure in sync
debug. */
os_thread_sleep(3000000);
#endif
sync_order_checks_on = TRUE;
if (trx_doublewrite == NULL) { if (trx_doublewrite == NULL) {
/* Create the doublewrite buffer to a new tablespace */ /* Create the doublewrite buffer to a new tablespace */

View File

@ -89,11 +89,14 @@ void
rw_lock_create_func( rw_lock_create_func(
/*================*/ /*================*/
rw_lock_t* lock, /* in: pointer to memory */ rw_lock_t* lock, /* in: pointer to memory */
ulint level __attribute__((unused)), #ifdef UNIV_DEBUG
/* in: level */ # ifdef UNIV_SYNC_DEBUG
ulint level, /* in: level */
# endif /* UNIV_SYNC_DEBUG */
const char* cmutex_name, /* in: mutex name */
#endif /* UNIV_DEBUG */
const char* cfile_name, /* in: file name where created */ const char* cfile_name, /* in: file name where created */
ulint cline, /* in: file line where created */ ulint cline) /* in: file line where created */
const char* cmutex_name) /* in: mutex name */
{ {
/* If this is the very first time a synchronization object is /* If this is the very first time a synchronization object is
created, then the following call initializes the sync system. */ created, then the following call initializes the sync system. */
@ -103,10 +106,10 @@ rw_lock_create_func(
lock->mutex.cfile_name = cfile_name; lock->mutex.cfile_name = cfile_name;
lock->mutex.cline = cline; lock->mutex.cline = cline;
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
lock->mutex.cmutex_name = cmutex_name; lock->mutex.cmutex_name = cmutex_name;
lock->mutex.mutex_type = 1; lock->mutex.mutex_type = 1;
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
rw_lock_set_waiters(lock, 0); rw_lock_set_waiters(lock, 0);
rw_lock_set_writer(lock, RW_LOCK_NOT_LOCKED); rw_lock_set_writer(lock, RW_LOCK_NOT_LOCKED);

View File

@ -108,8 +108,6 @@ will set the waiters field to 0 in mutex_exit, and then call
sync_array_signal_object with the mutex as an argument. sync_array_signal_object with the mutex as an argument.
Q.E.D. */ Q.E.D. */
ulint sync_dummy = 0;
/* The number of system calls made in this module. Intended for performance /* The number of system calls made in this module. Intended for performance
monitoring. */ monitoring. */
@ -133,6 +131,7 @@ ibool sync_initialized = FALSE;
typedef struct sync_level_struct sync_level_t; typedef struct sync_level_struct sync_level_t;
typedef struct sync_thread_struct sync_thread_t; typedef struct sync_thread_struct sync_thread_t;
#ifdef UNIV_SYNC_DEBUG
/* The latch levels currently owned by threads are stored in this data /* The latch levels currently owned by threads are stored in this data
structure; the size of this array is OS_THREAD_MAX_N */ structure; the size of this array is OS_THREAD_MAX_N */
@ -140,6 +139,7 @@ sync_thread_t* sync_thread_level_arrays;
/* Mutex protecting sync_thread_level_arrays */ /* Mutex protecting sync_thread_level_arrays */
mutex_t sync_thread_mutex; mutex_t sync_thread_mutex;
#endif /* UNIV_SYNC_DEBUG */
/* Global list of database mutexes (not OS mutexes) created. */ /* Global list of database mutexes (not OS mutexes) created. */
ut_list_base_node_t mutex_list; ut_list_base_node_t mutex_list;
@ -147,11 +147,10 @@ ut_list_base_node_t mutex_list;
/* Mutex protecting the mutex_list variable */ /* Mutex protecting the mutex_list variable */
mutex_t mutex_list_mutex; mutex_t mutex_list_mutex;
#ifdef UNIV_SYNC_DEBUG
/* Latching order checks start when this is set TRUE */ /* Latching order checks start when this is set TRUE */
ibool sync_order_checks_on = FALSE; ibool sync_order_checks_on = FALSE;
#endif /* UNIV_SYNC_DEBUG */
/* Dummy mutex used to implement mutex_fence */
mutex_t dummy_mutex_for_fence;
struct sync_thread_struct{ struct sync_thread_struct{
os_thread_id_t id; /* OS thread id */ os_thread_id_t id; /* OS thread id */
@ -202,10 +201,14 @@ void
mutex_create_func( mutex_create_func(
/*==============*/ /*==============*/
mutex_t* mutex, /* in: pointer to memory */ mutex_t* mutex, /* in: pointer to memory */
#ifdef UNIV_DEBUG
const char* cmutex_name, /* in: mutex name */
# ifdef UNIV_SYNC_DEBUG
ulint level, /* in: level */ ulint level, /* in: level */
# endif /* UNIV_SYNC_DEBUG */
#endif /* UNIV_DEBUG */
const char* cfile_name, /* in: file name where created */ const char* cfile_name, /* in: file name where created */
ulint cline, /* in: file line where created */ ulint cline) /* in: file line where created */
const char* cmutex_name) /* in: mutex name */
{ {
#if defined(_WIN32) && defined(UNIV_CAN_USE_X86_ASSEMBLER) #if defined(_WIN32) && defined(UNIV_CAN_USE_X86_ASSEMBLER)
mutex_reset_lock_word(mutex); mutex_reset_lock_word(mutex);
@ -214,15 +217,19 @@ mutex_create_func(
mutex->lock_word = 0; mutex->lock_word = 0;
#endif #endif
mutex_set_waiters(mutex, 0); mutex_set_waiters(mutex, 0);
#ifdef UNIV_DEBUG
mutex->magic_n = MUTEX_MAGIC_N; mutex->magic_n = MUTEX_MAGIC_N;
#endif /* UNIV_DEBUG */
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
mutex->line = 0; mutex->line = 0;
mutex->file_name = "not yet reserved"; mutex->file_name = "not yet reserved";
#endif /* UNIV_SYNC_DEBUG */
mutex->level = level; mutex->level = level;
#endif /* UNIV_SYNC_DEBUG */
mutex->cfile_name = cfile_name; mutex->cfile_name = cfile_name;
mutex->cline = cline; mutex->cline = cline;
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
mutex->count_os_wait = 0;
# ifdef UNIV_DEBUG
mutex->cmutex_name= cmutex_name; mutex->cmutex_name= cmutex_name;
mutex->count_using= 0; mutex->count_using= 0;
mutex->mutex_type= 0; mutex->mutex_type= 0;
@ -230,8 +237,8 @@ mutex_create_func(
mutex->lmax_spent_time= 0; mutex->lmax_spent_time= 0;
mutex->count_spin_loop= 0; mutex->count_spin_loop= 0;
mutex->count_spin_rounds= 0; mutex->count_spin_rounds= 0;
mutex->count_os_wait= 0;
mutex->count_os_yield= 0; mutex->count_os_yield= 0;
# endif /* UNIV_DEBUG */
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
/* Check that lock_word is aligned; this is important on Intel */ /* Check that lock_word is aligned; this is important on Intel */
@ -239,16 +246,19 @@ mutex_create_func(
/* NOTE! The very first mutexes are not put to the mutex list */ /* NOTE! The very first mutexes are not put to the mutex list */
if ((mutex == &mutex_list_mutex) || (mutex == &sync_thread_mutex)) { if ((mutex == &mutex_list_mutex)
#ifdef UNIV_SYNC_DEBUG
|| (mutex == &sync_thread_mutex)
#endif /* UNIV_SYNC_DEBUG */
) {
return; return;
} }
mutex_enter(&mutex_list_mutex); mutex_enter(&mutex_list_mutex);
if (UT_LIST_GET_LEN(mutex_list) > 0) { ut_ad(UT_LIST_GET_LEN(mutex_list) == 0
ut_a(UT_LIST_GET_FIRST(mutex_list)->magic_n == MUTEX_MAGIC_N); || UT_LIST_GET_FIRST(mutex_list)->magic_n == MUTEX_MAGIC_N);
}
UT_LIST_ADD_FIRST(list, mutex_list, mutex); UT_LIST_ADD_FIRST(list, mutex_list, mutex);
@ -265,24 +275,24 @@ mutex_free(
/*=======*/ /*=======*/
mutex_t* mutex) /* in: mutex */ mutex_t* mutex) /* in: mutex */
{ {
#ifdef UNIV_DEBUG ut_ad(mutex_validate(mutex));
ut_a(mutex_validate(mutex));
#endif /* UNIV_DEBUG */
ut_a(mutex_get_lock_word(mutex) == 0); ut_a(mutex_get_lock_word(mutex) == 0);
ut_a(mutex_get_waiters(mutex) == 0); ut_a(mutex_get_waiters(mutex) == 0);
if (mutex != &mutex_list_mutex && mutex != &sync_thread_mutex) { if (mutex != &mutex_list_mutex
#ifdef UNIV_SYNC_DEBUG
&& mutex != &sync_thread_mutex
#endif /* UNIV_SYNC_DEBUG */
) {
mutex_enter(&mutex_list_mutex); mutex_enter(&mutex_list_mutex);
if (UT_LIST_GET_PREV(list, mutex)) { ut_ad(!UT_LIST_GET_PREV(list, mutex)
ut_a(UT_LIST_GET_PREV(list, mutex)->magic_n || UT_LIST_GET_PREV(list, mutex)->magic_n
== MUTEX_MAGIC_N); == MUTEX_MAGIC_N);
} ut_ad(!UT_LIST_GET_NEXT(list, mutex)
if (UT_LIST_GET_NEXT(list, mutex)) { || UT_LIST_GET_NEXT(list, mutex)->magic_n
ut_a(UT_LIST_GET_NEXT(list, mutex)->magic_n == MUTEX_MAGIC_N);
== MUTEX_MAGIC_N);
}
UT_LIST_REMOVE(list, mutex_list, mutex); UT_LIST_REMOVE(list, mutex_list, mutex);
@ -295,8 +305,9 @@ mutex_free(
/* If we free the mutex protecting the mutex list (freeing is /* If we free the mutex protecting the mutex list (freeing is
not necessary), we have to reset the magic number AFTER removing not necessary), we have to reset the magic number AFTER removing
it from the list. */ it from the list. */
#ifdef UNIV_DEBUG
mutex->magic_n = 0; mutex->magic_n = 0;
#endif /* UNIV_DEBUG */
} }
/************************************************************************ /************************************************************************
@ -328,6 +339,7 @@ mutex_enter_nowait(
return(1); return(1);
} }
#ifdef UNIV_DEBUG
/********************************************************************** /**********************************************************************
Checks that the mutex has been initialized. */ Checks that the mutex has been initialized. */
@ -341,6 +353,7 @@ mutex_validate(
return(TRUE); return(TRUE);
} }
#endif /* UNIV_DEBUG */
/********************************************************************** /**********************************************************************
Sets the waiters field in a mutex. */ Sets the waiters field in a mutex. */
@ -376,13 +389,13 @@ mutex_spin_wait(
{ {
ulint index; /* index of the reserved wait cell */ ulint index; /* index of the reserved wait cell */
ulint i; /* spin round count */ ulint i; /* spin round count */
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
ib_longlong lstart_time = 0, lfinish_time; /* for timing os_wait */ ib_longlong lstart_time = 0, lfinish_time; /* for timing os_wait */
ulint ltime_diff; ulint ltime_diff;
ulint sec; ulint sec;
ulint ms; ulint ms;
uint timer_started = 0; uint timer_started = 0;
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
ut_ad(mutex); ut_ad(mutex);
mutex_loop: mutex_loop:
@ -396,10 +409,10 @@ mutex_loop:
a memory word. */ a memory word. */
spin_loop: spin_loop:
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
mutex_spin_wait_count++; mutex_spin_wait_count++;
mutex->count_spin_loop++; mutex->count_spin_loop++;
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
while (mutex_get_lock_word(mutex) != 0 && i < SYNC_SPIN_ROUNDS) { while (mutex_get_lock_word(mutex) != 0 && i < SYNC_SPIN_ROUNDS) {
if (srv_spin_wait_delay) { if (srv_spin_wait_delay) {
@ -410,14 +423,14 @@ spin_loop:
} }
if (i == SYNC_SPIN_ROUNDS) { if (i == SYNC_SPIN_ROUNDS) {
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
mutex->count_os_yield++; mutex->count_os_yield++;
if (timed_mutexes == 1 && timer_started==0) { if (timed_mutexes == 1 && timer_started==0) {
ut_usectime(&sec, &ms); ut_usectime(&sec, &ms);
lstart_time= (ib_longlong)sec * 1000000 + ms; lstart_time= (ib_longlong)sec * 1000000 + ms;
timer_started = 1; timer_started = 1;
} }
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
os_thread_yield(); os_thread_yield();
} }
@ -431,9 +444,9 @@ spin_loop:
mutex_spin_round_count += i; mutex_spin_round_count += i;
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
mutex->count_spin_rounds += i; mutex->count_spin_rounds += i;
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
if (mutex_test_and_set(mutex) == 0) { if (mutex_test_and_set(mutex) == 0) {
/* Succeeded! */ /* Succeeded! */
@ -514,6 +527,7 @@ spin_loop:
#ifndef UNIV_HOTBACKUP #ifndef UNIV_HOTBACKUP
mutex->count_os_wait++; mutex->count_os_wait++;
# ifdef UNIV_DEBUG
/* !!!!! Sometimes os_wait can be called without os_thread_yield */ /* !!!!! Sometimes os_wait can be called without os_thread_yield */
if (timed_mutexes == 1 && timer_started==0) { if (timed_mutexes == 1 && timer_started==0) {
@ -521,13 +535,14 @@ spin_loop:
lstart_time= (ib_longlong)sec * 1000000 + ms; lstart_time= (ib_longlong)sec * 1000000 + ms;
timer_started = 1; timer_started = 1;
} }
# endif /* UNIV_DEBUG */
#endif /* !UNIV_HOTBACKUP */ #endif /* !UNIV_HOTBACKUP */
sync_array_wait_event(sync_primary_wait_array, index); sync_array_wait_event(sync_primary_wait_array, index);
goto mutex_loop; goto mutex_loop;
finish_timing: finish_timing:
#ifndef UNIV_HOTBACKUP #if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
if (timed_mutexes == 1 && timer_started==1) { if (timed_mutexes == 1 && timer_started==1) {
ut_usectime(&sec, &ms); ut_usectime(&sec, &ms);
lfinish_time= (ib_longlong)sec * 1000000 + ms; lfinish_time= (ib_longlong)sec * 1000000 + ms;
@ -539,7 +554,7 @@ finish_timing:
mutex->lmax_spent_time= ltime_diff; mutex->lmax_spent_time= ltime_diff;
} }
} }
#endif /* !UNIV_HOTBACKUP */ #endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
return; return;
} }
@ -598,9 +613,7 @@ mutex_get_debug_info(
*line = mutex->line; *line = mutex->line;
*thread_id = mutex->thread_id; *thread_id = mutex->thread_id;
} }
#endif /* UNIV_SYNC_DEBUG */
#ifdef UNIV_SYNC_DEBUG
/********************************************************************** /**********************************************************************
Checks that the current thread owns the mutex. Works only in the debug Checks that the current thread owns the mutex. Works only in the debug
version. */ version. */
@ -611,7 +624,7 @@ mutex_own(
/* out: TRUE if owns */ /* out: TRUE if owns */
mutex_t* mutex) /* in: mutex */ mutex_t* mutex) /* in: mutex */
{ {
ut_a(mutex_validate(mutex)); ut_ad(mutex_validate(mutex));
if (mutex_get_lock_word(mutex) != 1) { if (mutex_get_lock_word(mutex) != 1) {
@ -710,7 +723,6 @@ sync_all_freed(void)
{ {
return(mutex_n_reserved() + rw_lock_n_locked() == 0); return(mutex_n_reserved() + rw_lock_n_locked() == 0);
} }
#endif /* UNIV_SYNC_DEBUG */
/********************************************************************** /**********************************************************************
Gets the value in the nth slot in the thread level arrays. */ Gets the value in the nth slot in the thread level arrays. */
@ -834,7 +846,6 @@ sync_thread_levels_g(
(ulong) mutex->cline); (ulong) mutex->cline);
if (mutex_get_lock_word(mutex) != 0) { if (mutex_get_lock_word(mutex) != 0) {
#ifdef UNIV_SYNC_DEBUG
const char* file_name; const char* file_name;
ulint line; ulint line;
os_thread_id_t thread_id; os_thread_id_t thread_id;
@ -852,19 +863,11 @@ sync_thread_levels_g(
thread_id), thread_id),
file_name, file_name,
(ulong) line); (ulong) line);
#else /* UNIV_SYNC_DEBUG */
fprintf(stderr,
"InnoDB: Locked mutex:"
" addr %p\n",
(void*) mutex);
#endif /* UNIV_SYNC_DEBUG */
} else { } else {
fputs("Not locked\n", stderr); fputs("Not locked\n", stderr);
} }
} else { } else {
#ifdef UNIV_SYNC_DEBUG
rw_lock_print(lock); rw_lock_print(lock);
#endif /* UNIV_SYNC_DEBUG */
} }
return(FALSE); return(FALSE);
@ -996,9 +999,7 @@ sync_thread_add_level(
if ((latch == (void*)&sync_thread_mutex) if ((latch == (void*)&sync_thread_mutex)
|| (latch == (void*)&mutex_list_mutex) || (latch == (void*)&mutex_list_mutex)
#ifdef UNIV_SYNC_DEBUG
|| (latch == (void*)&rw_lock_debug_mutex) || (latch == (void*)&rw_lock_debug_mutex)
#endif /* UNIV_SYNC_DEBUG */
|| (latch == (void*)&rw_lock_list_mutex)) { || (latch == (void*)&rw_lock_list_mutex)) {
return; return;
@ -1219,9 +1220,7 @@ sync_thread_reset_level(
if ((latch == (void*)&sync_thread_mutex) if ((latch == (void*)&sync_thread_mutex)
|| (latch == (void*)&mutex_list_mutex) || (latch == (void*)&mutex_list_mutex)
#ifdef UNIV_SYNC_DEBUG
|| (latch == (void*)&rw_lock_debug_mutex) || (latch == (void*)&rw_lock_debug_mutex)
#endif /* UNIV_SYNC_DEBUG */
|| (latch == (void*)&rw_lock_list_mutex)) { || (latch == (void*)&rw_lock_list_mutex)) {
return(FALSE); return(FALSE);
@ -1260,6 +1259,7 @@ sync_thread_reset_level(
return(FALSE); return(FALSE);
} }
#endif /* UNIV_SYNC_DEBUG */
/********************************************************************** /**********************************************************************
Initializes the synchronization data structures. */ Initializes the synchronization data structures. */
@ -1268,8 +1268,10 @@ void
sync_init(void) sync_init(void)
/*===========*/ /*===========*/
{ {
#ifdef UNIV_SYNC_DEBUG
sync_thread_t* thread_slot; sync_thread_t* thread_slot;
ulint i; ulint i;
#endif /* UNIV_SYNC_DEBUG */
ut_a(sync_initialized == FALSE); ut_a(sync_initialized == FALSE);
@ -1280,7 +1282,7 @@ sync_init(void)
sync_primary_wait_array = sync_array_create(OS_THREAD_MAX_N, sync_primary_wait_array = sync_array_create(OS_THREAD_MAX_N,
SYNC_ARRAY_OS_MUTEX); SYNC_ARRAY_OS_MUTEX);
#ifdef UNIV_SYNC_DEBUG
/* Create the thread latch level array where the latch levels /* Create the thread latch level array where the latch levels
are stored for each OS thread */ are stored for each OS thread */
@ -1291,13 +1293,14 @@ sync_init(void)
thread_slot = sync_thread_level_arrays_get_nth(i); thread_slot = sync_thread_level_arrays_get_nth(i);
thread_slot->levels = NULL; thread_slot->levels = NULL;
} }
#endif /* UNIV_SYNC_DEBUG */
/* Init the mutex list and create the mutex to protect it. */ /* Init the mutex list and create the mutex to protect it. */
UT_LIST_INIT(mutex_list); UT_LIST_INIT(mutex_list);
mutex_create(&mutex_list_mutex, SYNC_NO_ORDER_CHECK); mutex_create(&mutex_list_mutex, SYNC_NO_ORDER_CHECK);
#ifdef UNIV_SYNC_DEBUG
mutex_create(&sync_thread_mutex, SYNC_NO_ORDER_CHECK); mutex_create(&sync_thread_mutex, SYNC_NO_ORDER_CHECK);
#endif /* UNIV_SYNC_DEBUG */
/* Init the rw-lock list and create the mutex to protect it. */ /* Init the rw-lock list and create the mutex to protect it. */
@ -1332,7 +1335,9 @@ sync_close(void)
} }
mutex_free(&mutex_list_mutex); mutex_free(&mutex_list_mutex);
#ifdef UNIV_SYNC_DEBUG
mutex_free(&sync_thread_mutex); mutex_free(&sync_thread_mutex);
#endif /* UNIV_SYNC_DEBUG */
} }
/*********************************************************************** /***********************************************************************

View File

@ -224,7 +224,7 @@ thr_local_init(void)
ut_a(thr_local_hash == NULL); ut_a(thr_local_hash == NULL);
thr_local_hash = hash_create(OS_THREAD_MAX_N + 100); thr_local_hash = hash0_create(OS_THREAD_MAX_N + 100);
mutex_create(&thr_local_mutex, SYNC_THR_LOCAL); mutex_create(&thr_local_mutex, SYNC_THR_LOCAL);
} }

View File

@ -131,8 +131,26 @@ trx_rollback_for_mysql(
trx->op_info = "rollback"; trx->op_info = "rollback";
err = trx_general_rollback_for_mysql(trx, FALSE, NULL); /* If we are doing the XA recovery of prepared transactions, then
the transaction object does not have an InnoDB session object, and we
set a dummy session that we use for all MySQL transactions. */
mutex_enter(&kernel_mutex);
if (trx->sess == NULL) {
/* Open a dummy session */
if (!trx_dummy_sess) {
trx_dummy_sess = sess_open();
}
trx->sess = trx_dummy_sess;
}
mutex_exit(&kernel_mutex);
err = trx_general_rollback_for_mysql(trx, FALSE, NULL);
trx->op_info = ""; trx->op_info = "";
return(err); return(err);

View File

@ -1598,6 +1598,24 @@ trx_commit_for_mysql(
trx->op_info = "committing"; trx->op_info = "committing";
/* If we are doing the XA recovery of prepared transactions, then
the transaction object does not have an InnoDB session object, and we
set the dummy session that we use for all MySQL transactions. */
mutex_enter(&kernel_mutex);
if (trx->sess == NULL) {
/* Open a dummy session */
if (!trx_dummy_sess) {
trx_dummy_sess = sess_open();
}
trx->sess = trx_dummy_sess;
}
mutex_exit(&kernel_mutex);
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
mutex_enter(&kernel_mutex); mutex_enter(&kernel_mutex);
@ -1761,11 +1779,10 @@ trx_print(
|| mem_heap_get_size(trx->lock_heap) > 400) { || mem_heap_get_size(trx->lock_heap) > 400) {
newline = TRUE; newline = TRUE;
fprintf(f, "%lu lock struct(s), heap size %lu", fprintf(f, "%lu lock struct(s), heap size %lu,"
" %lu row lock(s)",
(ulong) UT_LIST_GET_LEN(trx->trx_locks), (ulong) UT_LIST_GET_LEN(trx->trx_locks),
(ulong) mem_heap_get_size(trx->lock_heap)); (ulong) mem_heap_get_size(trx->lock_heap),
fprintf(f, "%lu row lock(s)",
(ulong) lock_number_of_rows_locked(trx)); (ulong) lock_number_of_rows_locked(trx));
} }

View File

@ -29,7 +29,7 @@
# Change this to match the version of the shared libs you want to include # Change this to match the version of the shared libs you want to include
# #
%define version50 @MYSQL_NO_DASH_VERSION@ %define version50 @MYSQL_NO_DASH_VERSION@
%define version41 4.1.16 %define version41 4.1.17
%define version40 4.0.26 %define version40 4.0.26
%define version3 3.23.58 %define version3 3.23.58

View File

@ -369,6 +369,19 @@ cd ../..
############################################################################## ##############################################################################
# Include libgcc.a in the devel subpackage (BUG 4921)
if expr "$CC" : ".*gcc.*" > /dev/null ;
then
libgcc=`$CC $CFLAGS --print-libgcc-file`
if [ -f $libgcc ]
then
%define have_libgcc 1
install -m 644 $libgcc $RBR%{_libdir}/mysql/libmygcc.a
fi
fi
##############################################################################
%install %install
RBR=$RPM_BUILD_ROOT RBR=$RPM_BUILD_ROOT
MBD=$RPM_BUILD_DIR/mysql-%{mysql_version}/mysql-release-%{mysql_version} MBD=$RPM_BUILD_DIR/mysql-%{mysql_version}/mysql-release-%{mysql_version}
@ -654,6 +667,9 @@ fi
%{_includedir}/mysql/* %{_includedir}/mysql/*
%{_libdir}/mysql/libdbug.a %{_libdir}/mysql/libdbug.a
%{_libdir}/mysql/libheap.a %{_libdir}/mysql/libheap.a
%if %{have_libgcc}
%{_libdir}/mysql/libmygcc.a
%endif
%{_libdir}/mysql/libmyisam.a %{_libdir}/mysql/libmyisam.a
%{_libdir}/mysql/libmyisammrg.a %{_libdir}/mysql/libmyisammrg.a
%{_libdir}/mysql/libmysqlclient.a %{_libdir}/mysql/libmysqlclient.a
@ -689,6 +705,13 @@ fi
# itself - note that they must be ordered by date (important when # itself - note that they must be ordered by date (important when
# merging BK trees) # merging BK trees)
%changelog %changelog
* Fri Jan 05 2007 Kent Boortz <kent@mysql.com>
- Put back "libmygcc.a", found no real reason it was removed.
- Add CFLAGS to gcc call with --print-libgcc-file, to make sure the
correct "libgcc.a" path is returned for the 32/64 bit architecture.
* Mon Dec 18 2006 Joerg Bruehe <joerg@mysql.com> * Mon Dec 18 2006 Joerg Bruehe <joerg@mysql.com>
- Fix the move of "mysqlmanager" to section 8: Directory name was wrong. - Fix the move of "mysqlmanager" to section 8: Directory name was wrong.