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:
@ -177,8 +177,7 @@ check_cpu () {
|
||||
touch __test.c
|
||||
|
||||
while [ "$cpu_arg" ] ; do
|
||||
# FIXME: echo -n isn't portable - see contortions autoconf goes through
|
||||
echo -n testing $cpu_arg "... " >&2
|
||||
printf "testing $cpu_arg ... " >&2
|
||||
|
||||
# compile check
|
||||
check_cpu_cflags=`eval echo $check_cpu_args`
|
||||
|
32
configure.in
32
configure.in
@ -6,7 +6,7 @@ AC_PREREQ(2.52)dnl Minimum Autoconf version required.
|
||||
AC_INIT(sql/mysqld.cc)
|
||||
AC_CANONICAL_SYSTEM
|
||||
# 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_CONFIG_HEADER(config.h)
|
||||
|
||||
@ -678,6 +678,21 @@ else
|
||||
AC_MSG_RESULT([no])
|
||||
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
|
||||
|
||||
@ -963,6 +978,7 @@ case $SYSTEM_TYPE in
|
||||
fi
|
||||
;;
|
||||
*darwin*)
|
||||
AC_DEFINE([DEFAULT_SKIP_THREAD_PRIORITY], [1], [default to skip thread priority])
|
||||
if test "$ac_cv_prog_gcc" = "yes"
|
||||
then
|
||||
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 client is just using plain-old libs.
|
||||
sql_client_dirs="strings regex mysys libmysql client"
|
||||
sql_client_dirs=
|
||||
linked_client_targets="linked_libmysql_sources"
|
||||
|
||||
AM_CONDITIONAL(THREAD_SAFE_CLIENT, test "$THREAD_SAFE_CLIENT" != "no")
|
||||
|
||||
if test "$THREAD_SAFE_CLIENT" != "no"
|
||||
if test "$THREAD_SAFE_CLIENT" = "no"
|
||||
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"
|
||||
AC_CONFIG_FILES(libmysql_r/Makefile)
|
||||
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)
|
||||
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
|
||||
AC_DEFINE([THREAD], [1],
|
||||
[Define if you want to have threaded code. This may be undef on client code])
|
||||
# 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"
|
||||
AC_SUBST(THREAD_LOBJECTS)
|
||||
fi
|
||||
|
||||
if test "$with_server" != "no"
|
||||
then
|
||||
server_scripts="mysqld_safe mysql_install_db"
|
||||
sql_server_dirs="strings mysys dbug extra regex"
|
||||
|
||||
|
@ -92,6 +92,42 @@
|
||||
#define NETWARE_SET_SCREEN_MODE(A)
|
||||
#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
|
||||
Linux kernel. Use them to indicate the likelyhood of the truthfulness
|
||||
|
@ -66,14 +66,17 @@ ldata=$fix_bin/$data
|
||||
mdata=$data/mysql
|
||||
EXTRA_ARG=""
|
||||
|
||||
if test ! -x $execdir/mysqld
|
||||
mysqld=
|
||||
if test -x $execdir/mysqld
|
||||
then
|
||||
mysqld=$execdir/mysqld
|
||||
else
|
||||
if test ! -x $libexecdir/mysqld
|
||||
then
|
||||
echo "mysqld is missing - looked in $execdir and in $libexecdir"
|
||||
exit 1
|
||||
else
|
||||
execdir=$libexecdir
|
||||
mysqld=$libexecdir/mysqld
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -99,7 +102,9 @@ basedir=.
|
||||
EXTRA_ARG="--language=../sql/share/english/ --character-sets-dir=../sql/share/charsets/"
|
||||
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"
|
||||
|
||||
if $scriptdir/mysql_create_system_tables test $mdata $hostname | $mysqld_boot
|
||||
|
@ -2873,12 +2873,19 @@ sub install_db ($$) {
|
||||
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
|
||||
my $path_bootstrap_log= "$opt_vardir/log/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,
|
||||
"", { append_log_file => 1 }) != 0 )
|
||||
|
||||
|
@ -369,7 +369,7 @@ BASE=$BASE2
|
||||
#
|
||||
|
||||
if [ x"@GXX@" = x"yes" ] ; then
|
||||
gcclib=`@CC@ --print-libgcc-file`
|
||||
gcclib=`@CC@ @CFLAGS@ --print-libgcc-file`
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Warning: Couldn't find libgcc.a!"
|
||||
else
|
||||
|
@ -236,7 +236,8 @@ if test "$in_rpm" -eq 0 -a "$windows" -eq 0
|
||||
then
|
||||
echo "Installing all prepared tables"
|
||||
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-ndbcluster $args --max_allowed_packet=8M --net_buffer_length=16K"
|
||||
if $scriptdir/mysql_create_system_tables $create_option $mdata $hostname $windows \
|
||||
|
@ -21,6 +21,16 @@ command=".mysql.$$"
|
||||
trap "interrupt" 2
|
||||
|
||||
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() {
|
||||
touch $config $command
|
||||
@ -44,7 +54,7 @@ get_root_password() {
|
||||
status=1
|
||||
while [ $status -eq 1 ]; do
|
||||
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
|
||||
echo
|
||||
stty echo
|
||||
@ -64,10 +74,10 @@ get_root_password() {
|
||||
|
||||
set_root_password() {
|
||||
stty -echo
|
||||
echo -n "New password: "
|
||||
echo $echo_n "New password: $echo_c"
|
||||
read password1
|
||||
echo
|
||||
echo -n "Re-enter new password: "
|
||||
echo $echo_n "Re-enter new password: $echo_c"
|
||||
read password2
|
||||
echo
|
||||
stty echo
|
||||
@ -172,6 +182,7 @@ cleanup() {
|
||||
# The actual script starts here
|
||||
|
||||
prepare
|
||||
set_echo_compat
|
||||
|
||||
echo
|
||||
echo
|
||||
@ -200,11 +211,11 @@ echo "root user without the proper authorisation."
|
||||
echo
|
||||
|
||||
if [ $hadpass -eq 0 ]; then
|
||||
echo -n "Set root password? [Y/n] "
|
||||
echo $echo_n "Set root password? [Y/n] $echo_c"
|
||||
else
|
||||
echo "You already have a root password set, so you can safely answer 'n'."
|
||||
echo
|
||||
echo -n "Change the root password? [Y/n] "
|
||||
echo $echo_n "Change the root password? [Y/n] $echo_c"
|
||||
fi
|
||||
|
||||
read reply
|
||||
@ -231,7 +242,7 @@ echo "go a bit smoother. You should remove them before moving into a"
|
||||
echo "production environment."
|
||||
echo
|
||||
|
||||
echo -n "Remove anonymous users? [Y/n] "
|
||||
echo $echo_n "Remove anonymous users? [Y/n] $echo_c"
|
||||
|
||||
read reply
|
||||
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
|
||||
|
||||
echo -n "Disallow root login remotely? [Y/n] "
|
||||
echo $echo_n "Disallow root login remotely? [Y/n] $echo_c"
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
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
|
||||
|
||||
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
|
||||
if [ "$reply" = "n" ]; then
|
||||
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
|
||||
|
||||
echo -n "Reload privilege tables now? [Y/n] "
|
||||
echo $echo_n "Reload privilege tables now? [Y/n] $echo_c"
|
||||
read reply
|
||||
if [ "$reply" = "n" ]; then
|
||||
echo " ... skipping."
|
||||
|
@ -49,6 +49,10 @@
|
||||
#define OPT_NDBCLUSTER_DEFAULT 0
|
||||
#endif
|
||||
|
||||
#ifndef DEFAULT_SKIP_THREAD_PRIORITY
|
||||
#define DEFAULT_SKIP_THREAD_PRIORITY 0
|
||||
#endif
|
||||
|
||||
#include <thr_alarm.h>
|
||||
#include <ft_global.h>
|
||||
#include <errmsg.h>
|
||||
@ -4966,8 +4970,10 @@ struct my_option my_long_options[] =
|
||||
/* app_type */ 0
|
||||
},
|
||||
#endif
|
||||
#ifndef DISABLE_GRANT_OPTIONS
|
||||
{"bootstrap", OPT_BOOTSTRAP, "Used by mysql installation scripts.", 0, 0, 0,
|
||||
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"character-set-client-handshake", OPT_CHARACTER_SET_CLIENT_HANDSHAKE,
|
||||
"Don't ignore client side character set value sent during 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",
|
||||
(gptr*) &opt_init_connect, (gptr*) &opt_init_connect, 0, GET_STR_ALLOC,
|
||||
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.",
|
||||
(gptr*) &opt_init_file, (gptr*) &opt_init_file, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"init-rpl-role", OPT_INIT_RPL_ROLE, "Set the replication role.", 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",
|
||||
@ -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",
|
||||
(gptr*) &opt_show_slave_auth_info, (gptr*) &opt_show_slave_auth_info, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifndef DISABLE_GRANT_OPTIONS
|
||||
{"skip-grant-tables", OPT_SKIP_GRANT,
|
||||
"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,
|
||||
0},
|
||||
#endif
|
||||
{"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},
|
||||
{"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.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"skip-thread-priority", OPT_SKIP_PRIOR,
|
||||
"Don't give threads different priorities.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
"Don't give threads different priorities.", 0, 0, 0, GET_NO_ARG, NO_ARG,
|
||||
DEFAULT_SKIP_THREAD_PRIORITY, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_REPLICATION
|
||||
{"slave-load-tmpdir", OPT_SLAVE_LOAD_TMPDIR,
|
||||
"The location where the slave should put its temporary files when \
|
||||
|
@ -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;
|
||||
|
||||
|
@ -854,8 +854,10 @@ buf_flush_batch(
|
||||
|
||||
ut_ad((flush_type == BUF_FLUSH_LRU)
|
||||
|| (flush_type == BUF_FLUSH_LIST));
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad((flush_type != BUF_FLUSH_LIST)
|
||||
|| sync_thread_levels_empty_gen(TRUE));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
mutex_enter(&(buf_pool->mutex));
|
||||
|
||||
if ((buf_pool->n_flush[flush_type] > 0)
|
||||
|
@ -782,10 +782,10 @@ dict_init(void)
|
||||
|
||||
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
|
||||
* 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
|
||||
* UNIV_WORD_SIZE));
|
||||
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
|
||||
mainly from outside the 'dict' directory. Inside this directory
|
||||
dict_table_get_low is usually the appropriate function. */
|
||||
Returns a table object and optionally increment its MySQL open handle count.
|
||||
NOTE! This is a high-level function to be used mainly from outside the
|
||||
'dict' directory. Inside this directory dict_table_get_low is usually the
|
||||
appropriate function. */
|
||||
|
||||
dict_table_t*
|
||||
dict_table_get(
|
||||
/*===========*/
|
||||
/* out: table, NULL if
|
||||
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;
|
||||
|
||||
@ -818,42 +822,17 @@ dict_table_get(
|
||||
|
||||
table = dict_table_get_low(table_name);
|
||||
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
|
||||
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) {
|
||||
|
||||
if (inc_mysql_count && table) {
|
||||
table->n_mysql_handles_opened++;
|
||||
}
|
||||
|
||||
mutex_exit(&(dict_sys->mutex));
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -1323,8 +1323,8 @@ fil_system_create(
|
||||
|
||||
mutex_create(&system->mutex, SYNC_ANY_LATCH);
|
||||
|
||||
system->spaces = hash_create(hash_size);
|
||||
system->name_hash = hash_create(hash_size);
|
||||
system->spaces = hash0_create(hash_size);
|
||||
system->name_hash = hash0_create(hash_size);
|
||||
|
||||
UT_LIST_INIT(system->LRU);
|
||||
|
||||
|
@ -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. */
|
||||
|
||||
hash_table_t*
|
||||
ha_create(
|
||||
/*======*/
|
||||
ha_create_func(
|
||||
/*===========*/
|
||||
/* out, own: created table */
|
||||
ibool in_btr_search, /* in: TRUE if the hash table is used in
|
||||
the btr_search module */
|
||||
ulint n, /* in: number of array cells */
|
||||
ulint n_mutexes, /* in: number of mutexes to protect the
|
||||
hash table: must be a power of 2, or 0 */
|
||||
ulint mutex_level) /* in: level of the mutexes in the latching
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ulint mutex_level, /* in: level of the mutexes in the latching
|
||||
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;
|
||||
ulint i;
|
||||
|
||||
table = hash_create(n);
|
||||
table = hash0_create(n);
|
||||
|
||||
if (in_btr_search) {
|
||||
table->adaptive = TRUE;
|
||||
|
@ -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. */
|
||||
|
||||
hash_table_t*
|
||||
hash_create(
|
||||
hash0_create(
|
||||
/*========*/
|
||||
/* out, own: created table */
|
||||
ulint n) /* in: number of array cells */
|
||||
@ -129,13 +129,15 @@ hash_table_free(
|
||||
Creates a mutex array to protect a hash table. */
|
||||
|
||||
void
|
||||
hash_create_mutexes(
|
||||
/*================*/
|
||||
hash_create_mutexes_func(
|
||||
/*=====================*/
|
||||
hash_table_t* table, /* in: hash table */
|
||||
ulint n_mutexes, /* in: number of mutexes, must be a
|
||||
power of 2 */
|
||||
ulint sync_level) /* in: latching order level of the
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ulint sync_level, /* in: latching order level of the
|
||||
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;
|
||||
|
||||
|
@ -39,9 +39,6 @@ have disables the InnoDB inlining in this file. */
|
||||
#include <myisampack.h>
|
||||
#include <mysys_err.h>
|
||||
#include <my_sys.h>
|
||||
|
||||
#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1))
|
||||
|
||||
#include "ha_innodb.h"
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
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 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 */
|
||||
|
||||
ib_table = dict_table_get_and_increment_handle_count(norm_name);
|
||||
ib_table = dict_table_get(norm_name, TRUE);
|
||||
|
||||
if (NULL == ib_table) {
|
||||
ut_print_timestamp(stderr);
|
||||
@ -4932,7 +4917,7 @@ ha_innobase::create(
|
||||
|
||||
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);
|
||||
|
||||
@ -5543,16 +5528,10 @@ ha_innobase::info(
|
||||
prebuilt->trx->op_info = (char*)
|
||||
"returning various info to MySQL";
|
||||
|
||||
if (ib_table->space != 0) {
|
||||
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);
|
||||
|
||||
unpack_filename(path,path);
|
||||
}
|
||||
|
||||
/* Note that we do not know the access time of the table,
|
||||
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];
|
||||
mutex_t* mutex;
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint rw_lock_count= 0;
|
||||
ulint rw_lock_count_spin_loop= 0;
|
||||
ulint rw_lock_count_spin_rounds= 0;
|
||||
ulint rw_lock_count_os_wait= 0;
|
||||
ulint rw_lock_count_os_yield= 0;
|
||||
ulonglong rw_lock_wait_time= 0;
|
||||
#endif /* UNIV_DEBUG */
|
||||
uint hton_name_len= strlen(innobase_hton_name), buf1len, buf2len;
|
||||
DBUG_ENTER("innodb_mutex_show_status");
|
||||
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_enter(&mutex_list_mutex);
|
||||
#endif
|
||||
mutex_enter_noninline(&mutex_list_mutex);
|
||||
|
||||
mutex = UT_LIST_GET_FIRST(mutex_list);
|
||||
|
||||
while (mutex != NULL) {
|
||||
#ifdef UNIV_DEBUG
|
||||
if (mutex->mutex_type != 1) {
|
||||
if (mutex->count_using > 0) {
|
||||
buf1len= my_snprintf(buf1, sizeof(buf1),
|
||||
@ -6653,9 +6633,8 @@ innodb_mutex_show_status(
|
||||
if (stat_print(thd, innobase_hton_name,
|
||||
hton_name_len, buf1, buf1len,
|
||||
buf2, buf2len)) {
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_exit(&mutex_list_mutex);
|
||||
#endif
|
||||
mutex_exit_noninline(
|
||||
&mutex_list_mutex);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
@ -6668,10 +6647,26 @@ innodb_mutex_show_status(
|
||||
rw_lock_count_os_yield += mutex->count_os_yield;
|
||||
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_exit_noninline(&mutex_list_mutex);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
buf2len= my_snprintf(buf2, sizeof(buf2),
|
||||
"count=%lu, spin_waits=%lu, spin_rounds=%lu, "
|
||||
"os_waits=%lu, os_yields=%lu, os_wait_times=%lu",
|
||||
@ -6684,10 +6679,7 @@ innodb_mutex_show_status(
|
||||
STRING_WITH_LEN("rw_lock_mutexes"), buf2, buf2len)) {
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
#ifdef MUTEX_PROTECT_TO_BE_ADDED_LATER
|
||||
mutex_exit(&mutex_list_mutex);
|
||||
#endif
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
@ -7360,7 +7352,6 @@ innobase_get_at_most_n_mbchars(
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
/**********************************************************************
|
||||
This function returns true if
|
||||
|
||||
@ -7370,32 +7361,33 @@ is either REPLACE or LOAD DATA INFILE REPLACE.
|
||||
2) SQL-query in the current thread
|
||||
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 ! */
|
||||
|
||||
extern "C"
|
||||
ibool
|
||||
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 ||
|
||||
thd->lex->sql_command == SQLCOM_REPLACE_SELECT ||
|
||||
(thd->lex->sql_command == SQLCOM_LOAD &&
|
||||
thd->lex->duplicates == DUP_REPLACE)) {
|
||||
|
||||
return(1);
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
if (thd->lex->sql_command == SQLCOM_INSERT &&
|
||||
thd->lex->duplicates == DUP_UPDATE) {
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
switch (thd->lex->sql_command) {
|
||||
case SQLCOM_REPLACE:
|
||||
case SQLCOM_REPLACE_SELECT:
|
||||
return(TRUE);
|
||||
case SQLCOM_LOAD:
|
||||
return(thd->lex->duplicates == DUP_REPLACE);
|
||||
case SQLCOM_INSERT:
|
||||
return(thd->lex->duplicates == DUP_UPDATE);
|
||||
default:
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -160,7 +160,7 @@ struct btr_search_struct{
|
||||
number of full fields */
|
||||
ulint n_bytes; /* recommended prefix: number of bytes in
|
||||
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
|
||||
the leftmost record of several records with
|
||||
the same prefix should be indexed in the
|
||||
|
@ -625,8 +625,6 @@ buf_page_release(
|
||||
RW_NO_LATCH */
|
||||
mtr_t* mtr) /* in: mtr */
|
||||
{
|
||||
ulint buf_fix_count;
|
||||
|
||||
ut_ad(block);
|
||||
|
||||
ut_a(block->state == BUF_BLOCK_FILE_PAGE);
|
||||
@ -643,8 +641,7 @@ buf_page_release(
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
rw_lock_s_unlock(&(block->debug_latch));
|
||||
#endif
|
||||
buf_fix_count = block->buf_fix_count;
|
||||
block->buf_fix_count = buf_fix_count - 1;
|
||||
block->buf_fix_count--;
|
||||
|
||||
mutex_exit(&block->mutex);
|
||||
|
||||
|
@ -65,8 +65,8 @@ dtype_get_mblen(
|
||||
innobase_get_cset_width(dtype_get_charset_coll(prtype),
|
||||
mbminlen, mbmaxlen);
|
||||
ut_ad(*mbminlen <= *mbmaxlen);
|
||||
ut_ad(*mbminlen <= 2); /* cf. the bit-field in dtype_t */
|
||||
ut_ad(*mbmaxlen < 1 << 3); /* cf. the bit-field in dtype_t */
|
||||
ut_ad(*mbminlen <= 2); /* mbminlen in dtype_t is 0..3 */
|
||||
ut_ad(*mbmaxlen < 1 << 3); /* mbmaxlen in dtype_t is 0..7 */
|
||||
#else /* !UNIV_HOTBACKUP */
|
||||
ut_a(mtype <= DATA_BINARY);
|
||||
*mbminlen = *mbmaxlen = 1;
|
||||
|
@ -326,26 +326,20 @@ dict_foreign_parse_drop_constraints(
|
||||
const char*** constraints_to_drop); /* out: id's of the
|
||||
constraints to drop */
|
||||
/**************************************************************************
|
||||
Returns a table object. NOTE! This is a high-level function to be used
|
||||
mainly from outside the 'dict' directory. Inside this directory
|
||||
dict_table_get_low is usually the appropriate function. */
|
||||
Returns a table object and optionally increment its MySQL open handle count.
|
||||
NOTE! This is a high-level function to be used mainly from outside the
|
||||
'dict' directory. Inside this directory dict_table_get_low is usually the
|
||||
appropriate function. */
|
||||
|
||||
dict_table_t*
|
||||
dict_table_get(
|
||||
/*===========*/
|
||||
/* out: table, NULL if
|
||||
does not exist */
|
||||
const char* table_name); /* in: table name */
|
||||
/**************************************************************************
|
||||
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 */
|
||||
const char* table_name, /* in: table name */
|
||||
ibool inc_mysql_count);
|
||||
/* in: whether to increment the open
|
||||
handle count on the table */
|
||||
/**************************************************************************
|
||||
Returns a table object based on table id. */
|
||||
|
||||
|
@ -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. */
|
||||
|
||||
hash_table_t*
|
||||
ha_create(
|
||||
/*======*/
|
||||
ha_create_func(
|
||||
/*===========*/
|
||||
/* out, own: created table */
|
||||
ibool in_btr_search, /* in: TRUE if the hash table is used in
|
||||
the btr_search module */
|
||||
ulint n, /* in: number of array cells */
|
||||
ulint n_mutexes, /* in: number of mutexes to protect the
|
||||
hash table: must be a power of 2 */
|
||||
ulint mutex_level); /* in: level of the mutexes in the latching
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ulint mutex_level, /* in: level of the mutexes in the latching
|
||||
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
|
||||
is found, its node is updated to point to the new data, and no new node
|
||||
|
@ -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. */
|
||||
|
||||
hash_table_t*
|
||||
hash_create(
|
||||
hash0_create(
|
||||
/*========*/
|
||||
/* out, own: created table */
|
||||
ulint n); /* in: number of array cells */
|
||||
@ -31,12 +31,20 @@ hash_create(
|
||||
Creates a mutex array to protect a hash table. */
|
||||
|
||||
void
|
||||
hash_create_mutexes(
|
||||
/*================*/
|
||||
hash_create_mutexes_func(
|
||||
/*=====================*/
|
||||
hash_table_t* table, /* in: hash table */
|
||||
ulint n_mutexes, /* in: number of mutexes */
|
||||
ulint sync_level); /* in: latching order level of the
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ulint sync_level, /* in: latching order level of the
|
||||
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. */
|
||||
|
||||
|
@ -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
|
||||
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. */
|
||||
#ifdef UNIV_DEBUG
|
||||
# ifdef UNIV_SYNC_DEBUG
|
||||
# define rw_lock_create(L, level) \
|
||||
rw_lock_create_func((L), (level), __FILE__, __LINE__, #L)
|
||||
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
|
||||
@ -74,10 +84,14 @@ void
|
||||
rw_lock_create_func(
|
||||
/*================*/
|
||||
rw_lock_t* lock, /* in: pointer to memory */
|
||||
#ifdef UNIV_DEBUG
|
||||
# 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 */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name); /* in: mutex name */
|
||||
ulint cline); /* in: file line where created */
|
||||
/**********************************************************************
|
||||
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
|
||||
|
@ -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
|
||||
necessary only if the memory block containing it is freed. */
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
# ifdef UNIV_SYNC_DEBUG
|
||||
# define mutex_create(M, level) \
|
||||
mutex_create_func((M), (level), __FILE__, __LINE__, #M)
|
||||
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
|
||||
@ -52,10 +62,14 @@ void
|
||||
mutex_create_func(
|
||||
/*==============*/
|
||||
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 */
|
||||
# endif /* UNIV_SYNC_DEBUG */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name); /* in: mutex name */
|
||||
ulint cline); /* in: file line where created */
|
||||
/**********************************************************************
|
||||
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
|
||||
@ -149,6 +163,7 @@ void
|
||||
sync_print(
|
||||
/*=======*/
|
||||
FILE* file); /* in: file where to print */
|
||||
#ifdef UNIV_DEBUG
|
||||
/**********************************************************************
|
||||
Checks that the mutex has been initialized. */
|
||||
|
||||
@ -156,6 +171,8 @@ ibool
|
||||
mutex_validate(
|
||||
/*===========*/
|
||||
mutex_t* mutex);
|
||||
#endif /* UNIV_DEBUG */
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/**********************************************************************
|
||||
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
|
||||
@ -197,7 +214,6 @@ sync_thread_levels_empty_gen(
|
||||
allowed to be owned by the thread,
|
||||
also purge_is_running mutex is
|
||||
allowed */
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/**********************************************************************
|
||||
Checks that the current thread owns the mutex. Works only
|
||||
in the debug version. */
|
||||
@ -465,26 +481,29 @@ struct mutex_struct {
|
||||
ulint line; /* Line where the mutex was locked */
|
||||
os_thread_id_t thread_id; /* Debug version: The thread id of the
|
||||
thread which locked the mutex. */
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
ulint level; /* Level in the global latching order */
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
const char* cfile_name;/* File name where mutex created */
|
||||
ulint cline; /* Line where created */
|
||||
#ifdef UNIV_DEBUG
|
||||
ulint magic_n;
|
||||
# define MUTEX_MAGIC_N (ulint)979585
|
||||
#endif /* UNIV_DEBUG */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
ulong count_os_wait; /* count of os_wait */
|
||||
# ifdef UNIV_DEBUG
|
||||
ulong count_using; /* count of times mutex used */
|
||||
ulong count_spin_loop; /* count of spin loops */
|
||||
ulong count_spin_rounds; /* count of spin rounds */
|
||||
ulong count_os_wait; /* count of os_wait */
|
||||
ulong count_os_yield; /* count of os_wait */
|
||||
ulonglong lspent_time; /* mutex os_wait timer msec */
|
||||
ulonglong lmax_spent_time; /* mutex os_wait timer msec */
|
||||
const char* cmutex_name;/* mutex name */
|
||||
ulint mutex_type;/* 0 - usual mutex 1 - rw_lock mutex */
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
};
|
||||
|
||||
#define MUTEX_MAGIC_N (ulint)979585
|
||||
|
||||
/* The global array of wait cells for implementation of the databases own
|
||||
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_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
|
||||
monitoring. */
|
||||
|
||||
extern ulint mutex_system_call_count;
|
||||
extern ulint mutex_exit_count;
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/* Latching order checks start when this is set TRUE */
|
||||
extern ibool sync_order_checks_on;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
/* This variable is set to TRUE when sync_init is called */
|
||||
extern ibool sync_initialized;
|
||||
|
@ -254,9 +254,9 @@ mutex_enter_func(
|
||||
/* 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. */
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_using++;
|
||||
#endif /* UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
if (!mutex_test_and_set(mutex)) {
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|
@ -83,19 +83,27 @@ memory is read outside the allocated blocks. */
|
||||
/* Make a non-inline debug version */
|
||||
|
||||
#if 0
|
||||
#define UNIV_DEBUG
|
||||
#define UNIV_MEM_DEBUG
|
||||
#define UNIV_IBUF_DEBUG
|
||||
#define UNIV_SYNC_DEBUG
|
||||
#define UNIV_SEARCH_DEBUG
|
||||
#define UNIV_SYNC_PERF_STAT
|
||||
#define UNIV_SEARCH_PERF_STAT
|
||||
#define UNIV_SRV_PRINT_LATCH_WAITS
|
||||
#define UNIV_BTR_PRINT
|
||||
#define UNIV_DEBUG /* Enable ut_ad() assertions */
|
||||
#define UNIV_LIST_DEBUG /* debug UT_LIST_ macros */
|
||||
#define UNIV_MEM_DEBUG /* detect memory leaks etc */
|
||||
#define UNIV_IBUF_DEBUG /* debug the insert buffer;
|
||||
this limits the database to IBUF_COUNT_N_SPACES and IBUF_COUNT_N_PAGES,
|
||||
and the insert buffer must be empty when the database is started */
|
||||
#define UNIV_SYNC_DEBUG /* debug mutex and latch
|
||||
operations (very slow); also UNIV_DEBUG must be defined */
|
||||
#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
|
||||
|
||||
#define UNIV_BTR_DEBUG
|
||||
#define UNIV_LIGHT_MEM_DEBUG
|
||||
#define UNIV_BTR_DEBUG /* check B-tree links */
|
||||
#define UNIV_LIGHT_MEM_DEBUG /* light memory debugging */
|
||||
|
||||
#ifdef HAVE_purify
|
||||
/* The following sets all new allocated memory to zero before use:
|
||||
|
@ -124,7 +124,7 @@ name, NODE1 and NODE2 are pointers to nodes. */
|
||||
}\
|
||||
|
||||
/* Invalidate the pointers in a list node. */
|
||||
#ifdef UNIV_DEBUG
|
||||
#ifdef UNIV_LIST_DEBUG
|
||||
# define UT_LIST_REMOVE_CLEAR(NAME, N) \
|
||||
((N)->NAME.prev = (N)->NAME.next = (void*) -1)
|
||||
#else
|
||||
|
@ -586,7 +586,7 @@ lock_sys_create(
|
||||
{
|
||||
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); */
|
||||
|
||||
@ -4391,10 +4391,6 @@ loop:
|
||||
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) {
|
||||
fprintf(file,
|
||||
"------- TRX HAS BEEN WAITING %lu SEC"
|
||||
|
@ -33,6 +33,7 @@ Created 9/20/1997 Heikki Tuuri
|
||||
#include "btr0cur.h"
|
||||
#include "dict0boot.h"
|
||||
#include "fil0fil.h"
|
||||
#include "sync0sync.h"
|
||||
|
||||
#ifdef UNIV_HOTBACKUP
|
||||
/* 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->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->apply_log_recs = FALSE;
|
||||
@ -187,9 +188,10 @@ recv_sys_empty_hash(void)
|
||||
hash_table_free(recv_sys->addr_hash);
|
||||
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. */
|
||||
static
|
||||
@ -209,6 +211,7 @@ recv_sys_free(void)
|
||||
|
||||
mutex_exit(&(recv_sys->mutex));
|
||||
}
|
||||
#endif /* UNIV_LOG_DEBUG */
|
||||
|
||||
/************************************************************
|
||||
Truncates possible corrupted or extra records from a log group. */
|
||||
@ -2855,6 +2858,15 @@ recv_recovery_from_checkpoint_finish(void)
|
||||
#ifndef UNIV_LOG_DEBUG
|
||||
recv_sys_free();
|
||||
#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) {
|
||||
/* Rollback the uncommitted transactions which have no user
|
||||
session */
|
||||
|
@ -1524,7 +1524,8 @@ row_ins_check_foreign_constraints(
|
||||
if (foreign->foreign_index == index) {
|
||||
|
||||
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) {
|
||||
|
@ -1831,7 +1831,9 @@ stop_for_a_while:
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(sync_thread_levels_empty_gen(TRUE));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
err = DB_SUCCESS;
|
||||
goto func_exit;
|
||||
|
||||
@ -1850,7 +1852,9 @@ commit_mtr_for_a_while:
|
||||
leaf_contains_updates = FALSE;
|
||||
mtr_has_extra_clust_latch = FALSE;
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(sync_thread_levels_empty_gen(TRUE));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
goto table_loop;
|
||||
|
||||
@ -1866,7 +1870,9 @@ lock_wait_or_error:
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
ut_ad(sync_thread_levels_empty_gen(TRUE));
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
func_exit:
|
||||
if (UNIV_LIKELY_NULL(heap)) {
|
||||
@ -4447,7 +4453,7 @@ row_search_check_if_query_cache_permitted(
|
||||
dict_table_t* table;
|
||||
ibool ret = FALSE;
|
||||
|
||||
table = dict_table_get(norm_name);
|
||||
table = dict_table_get(norm_name, FALSE);
|
||||
|
||||
if (table == NULL) {
|
||||
|
||||
|
@ -202,7 +202,8 @@ row_upd_check_references_constraints(
|
||||
foreign->n_fields))) {
|
||||
|
||||
if (foreign->foreign_table == NULL) {
|
||||
dict_table_get(foreign->foreign_table_name);
|
||||
dict_table_get(foreign->foreign_table_name,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
if (foreign->foreign_table) {
|
||||
|
@ -1601,17 +1601,6 @@ innobase_start_or_create_for_mysql(void)
|
||||
srv_was_started = TRUE;
|
||||
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) {
|
||||
/* Create the doublewrite buffer to a new tablespace */
|
||||
|
||||
|
@ -89,11 +89,14 @@ void
|
||||
rw_lock_create_func(
|
||||
/*================*/
|
||||
rw_lock_t* lock, /* in: pointer to memory */
|
||||
ulint level __attribute__((unused)),
|
||||
/* in: level */
|
||||
#ifdef UNIV_DEBUG
|
||||
# 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 */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name) /* in: mutex name */
|
||||
ulint cline) /* in: file line where created */
|
||||
{
|
||||
/* If this is the very first time a synchronization object is
|
||||
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.cline = cline;
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
lock->mutex.cmutex_name = cmutex_name;
|
||||
lock->mutex.mutex_type = 1;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
rw_lock_set_waiters(lock, 0);
|
||||
rw_lock_set_writer(lock, RW_LOCK_NOT_LOCKED);
|
||||
|
@ -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.
|
||||
Q.E.D. */
|
||||
|
||||
ulint sync_dummy = 0;
|
||||
|
||||
/* The number of system calls made in this module. Intended for performance
|
||||
monitoring. */
|
||||
|
||||
@ -133,6 +131,7 @@ ibool sync_initialized = FALSE;
|
||||
typedef struct sync_level_struct sync_level_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
|
||||
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_t sync_thread_mutex;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
/* Global list of database mutexes (not OS mutexes) created. */
|
||||
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_t mutex_list_mutex;
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/* Latching order checks start when this is set TRUE */
|
||||
ibool sync_order_checks_on = FALSE;
|
||||
|
||||
/* Dummy mutex used to implement mutex_fence */
|
||||
mutex_t dummy_mutex_for_fence;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
struct sync_thread_struct{
|
||||
os_thread_id_t id; /* OS thread id */
|
||||
@ -202,10 +201,14 @@ void
|
||||
mutex_create_func(
|
||||
/*==============*/
|
||||
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 */
|
||||
# endif /* UNIV_SYNC_DEBUG */
|
||||
#endif /* UNIV_DEBUG */
|
||||
const char* cfile_name, /* in: file name where created */
|
||||
ulint cline, /* in: file line where created */
|
||||
const char* cmutex_name) /* in: mutex name */
|
||||
ulint cline) /* in: file line where created */
|
||||
{
|
||||
#if defined(_WIN32) && defined(UNIV_CAN_USE_X86_ASSEMBLER)
|
||||
mutex_reset_lock_word(mutex);
|
||||
@ -214,15 +217,19 @@ mutex_create_func(
|
||||
mutex->lock_word = 0;
|
||||
#endif
|
||||
mutex_set_waiters(mutex, 0);
|
||||
#ifdef UNIV_DEBUG
|
||||
mutex->magic_n = MUTEX_MAGIC_N;
|
||||
#endif /* UNIV_DEBUG */
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
mutex->line = 0;
|
||||
mutex->file_name = "not yet reserved";
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
mutex->level = level;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
mutex->cfile_name = cfile_name;
|
||||
mutex->cline = cline;
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
mutex->count_os_wait = 0;
|
||||
# ifdef UNIV_DEBUG
|
||||
mutex->cmutex_name= cmutex_name;
|
||||
mutex->count_using= 0;
|
||||
mutex->mutex_type= 0;
|
||||
@ -230,8 +237,8 @@ mutex_create_func(
|
||||
mutex->lmax_spent_time= 0;
|
||||
mutex->count_spin_loop= 0;
|
||||
mutex->count_spin_rounds= 0;
|
||||
mutex->count_os_wait= 0;
|
||||
mutex->count_os_yield= 0;
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
/* 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 */
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
mutex_enter(&mutex_list_mutex);
|
||||
|
||||
if (UT_LIST_GET_LEN(mutex_list) > 0) {
|
||||
ut_a(UT_LIST_GET_FIRST(mutex_list)->magic_n == MUTEX_MAGIC_N);
|
||||
}
|
||||
ut_ad(UT_LIST_GET_LEN(mutex_list) == 0
|
||||
|| UT_LIST_GET_FIRST(mutex_list)->magic_n == MUTEX_MAGIC_N);
|
||||
|
||||
UT_LIST_ADD_FIRST(list, mutex_list, mutex);
|
||||
|
||||
@ -265,24 +275,24 @@ mutex_free(
|
||||
/*=======*/
|
||||
mutex_t* mutex) /* in: mutex */
|
||||
{
|
||||
#ifdef UNIV_DEBUG
|
||||
ut_a(mutex_validate(mutex));
|
||||
#endif /* UNIV_DEBUG */
|
||||
ut_ad(mutex_validate(mutex));
|
||||
ut_a(mutex_get_lock_word(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);
|
||||
|
||||
if (UT_LIST_GET_PREV(list, mutex)) {
|
||||
ut_a(UT_LIST_GET_PREV(list, mutex)->magic_n
|
||||
ut_ad(!UT_LIST_GET_PREV(list, mutex)
|
||||
|| UT_LIST_GET_PREV(list, mutex)->magic_n
|
||||
== MUTEX_MAGIC_N);
|
||||
}
|
||||
if (UT_LIST_GET_NEXT(list, mutex)) {
|
||||
ut_a(UT_LIST_GET_NEXT(list, mutex)->magic_n
|
||||
ut_ad(!UT_LIST_GET_NEXT(list, mutex)
|
||||
|| UT_LIST_GET_NEXT(list, mutex)->magic_n
|
||||
== MUTEX_MAGIC_N);
|
||||
}
|
||||
|
||||
UT_LIST_REMOVE(list, mutex_list, mutex);
|
||||
|
||||
@ -295,8 +305,9 @@ mutex_free(
|
||||
/* If we free the mutex protecting the mutex list (freeing is
|
||||
not necessary), we have to reset the magic number AFTER removing
|
||||
it from the list. */
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
mutex->magic_n = 0;
|
||||
#endif /* UNIV_DEBUG */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -328,6 +339,7 @@ mutex_enter_nowait(
|
||||
return(1);
|
||||
}
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/**********************************************************************
|
||||
Checks that the mutex has been initialized. */
|
||||
|
||||
@ -341,6 +353,7 @@ mutex_validate(
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
/**********************************************************************
|
||||
Sets the waiters field in a mutex. */
|
||||
@ -376,13 +389,13 @@ mutex_spin_wait(
|
||||
{
|
||||
ulint index; /* index of the reserved wait cell */
|
||||
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 */
|
||||
ulint ltime_diff;
|
||||
ulint sec;
|
||||
ulint ms;
|
||||
uint timer_started = 0;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
ut_ad(mutex);
|
||||
|
||||
mutex_loop:
|
||||
@ -396,10 +409,10 @@ mutex_loop:
|
||||
a memory word. */
|
||||
|
||||
spin_loop:
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex_spin_wait_count++;
|
||||
mutex->count_spin_loop++;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
while (mutex_get_lock_word(mutex) != 0 && i < SYNC_SPIN_ROUNDS) {
|
||||
if (srv_spin_wait_delay) {
|
||||
@ -410,14 +423,14 @@ spin_loop:
|
||||
}
|
||||
|
||||
if (i == SYNC_SPIN_ROUNDS) {
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_os_yield++;
|
||||
if (timed_mutexes == 1 && timer_started==0) {
|
||||
ut_usectime(&sec, &ms);
|
||||
lstart_time= (ib_longlong)sec * 1000000 + ms;
|
||||
timer_started = 1;
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
os_thread_yield();
|
||||
}
|
||||
|
||||
@ -431,9 +444,9 @@ spin_loop:
|
||||
|
||||
mutex_spin_round_count += i;
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
mutex->count_spin_rounds += i;
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
|
||||
if (mutex_test_and_set(mutex) == 0) {
|
||||
/* Succeeded! */
|
||||
@ -514,6 +527,7 @@ spin_loop:
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
mutex->count_os_wait++;
|
||||
# ifdef UNIV_DEBUG
|
||||
/* !!!!! Sometimes os_wait can be called without os_thread_yield */
|
||||
|
||||
if (timed_mutexes == 1 && timer_started==0) {
|
||||
@ -521,13 +535,14 @@ spin_loop:
|
||||
lstart_time= (ib_longlong)sec * 1000000 + ms;
|
||||
timer_started = 1;
|
||||
}
|
||||
# endif /* UNIV_DEBUG */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
||||
sync_array_wait_event(sync_primary_wait_array, index);
|
||||
goto mutex_loop;
|
||||
|
||||
finish_timing:
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
#if defined UNIV_DEBUG && !defined UNIV_HOTBACKUP
|
||||
if (timed_mutexes == 1 && timer_started==1) {
|
||||
ut_usectime(&sec, &ms);
|
||||
lfinish_time= (ib_longlong)sec * 1000000 + ms;
|
||||
@ -539,7 +554,7 @@ finish_timing:
|
||||
mutex->lmax_spent_time= ltime_diff;
|
||||
}
|
||||
}
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
|
||||
return;
|
||||
}
|
||||
|
||||
@ -598,9 +613,7 @@ mutex_get_debug_info(
|
||||
*line = mutex->line;
|
||||
*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
|
||||
version. */
|
||||
@ -611,7 +624,7 @@ mutex_own(
|
||||
/* out: TRUE if owns */
|
||||
mutex_t* mutex) /* in: mutex */
|
||||
{
|
||||
ut_a(mutex_validate(mutex));
|
||||
ut_ad(mutex_validate(mutex));
|
||||
|
||||
if (mutex_get_lock_word(mutex) != 1) {
|
||||
|
||||
@ -710,7 +723,6 @@ sync_all_freed(void)
|
||||
{
|
||||
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. */
|
||||
@ -834,7 +846,6 @@ sync_thread_levels_g(
|
||||
(ulong) mutex->cline);
|
||||
|
||||
if (mutex_get_lock_word(mutex) != 0) {
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
const char* file_name;
|
||||
ulint line;
|
||||
os_thread_id_t thread_id;
|
||||
@ -852,19 +863,11 @@ sync_thread_levels_g(
|
||||
thread_id),
|
||||
file_name,
|
||||
(ulong) line);
|
||||
#else /* UNIV_SYNC_DEBUG */
|
||||
fprintf(stderr,
|
||||
"InnoDB: Locked mutex:"
|
||||
" addr %p\n",
|
||||
(void*) mutex);
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
} else {
|
||||
fputs("Not locked\n", stderr);
|
||||
}
|
||||
} else {
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
rw_lock_print(lock);
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
@ -996,9 +999,7 @@ sync_thread_add_level(
|
||||
|
||||
if ((latch == (void*)&sync_thread_mutex)
|
||||
|| (latch == (void*)&mutex_list_mutex)
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|| (latch == (void*)&rw_lock_debug_mutex)
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|| (latch == (void*)&rw_lock_list_mutex)) {
|
||||
|
||||
return;
|
||||
@ -1219,9 +1220,7 @@ sync_thread_reset_level(
|
||||
|
||||
if ((latch == (void*)&sync_thread_mutex)
|
||||
|| (latch == (void*)&mutex_list_mutex)
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|| (latch == (void*)&rw_lock_debug_mutex)
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|| (latch == (void*)&rw_lock_list_mutex)) {
|
||||
|
||||
return(FALSE);
|
||||
@ -1260,6 +1259,7 @@ sync_thread_reset_level(
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
/**********************************************************************
|
||||
Initializes the synchronization data structures. */
|
||||
@ -1268,8 +1268,10 @@ void
|
||||
sync_init(void)
|
||||
/*===========*/
|
||||
{
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
sync_thread_t* thread_slot;
|
||||
ulint i;
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
|
||||
ut_a(sync_initialized == FALSE);
|
||||
|
||||
@ -1280,7 +1282,7 @@ sync_init(void)
|
||||
|
||||
sync_primary_wait_array = sync_array_create(OS_THREAD_MAX_N,
|
||||
SYNC_ARRAY_OS_MUTEX);
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
/* Create the thread latch level array where the latch levels
|
||||
are stored for each OS thread */
|
||||
|
||||
@ -1291,13 +1293,14 @@ sync_init(void)
|
||||
thread_slot = sync_thread_level_arrays_get_nth(i);
|
||||
thread_slot->levels = NULL;
|
||||
}
|
||||
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
/* Init the mutex list and create the mutex to protect it. */
|
||||
|
||||
UT_LIST_INIT(mutex_list);
|
||||
mutex_create(&mutex_list_mutex, SYNC_NO_ORDER_CHECK);
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
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. */
|
||||
|
||||
@ -1332,7 +1335,9 @@ sync_close(void)
|
||||
}
|
||||
|
||||
mutex_free(&mutex_list_mutex);
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
mutex_free(&sync_thread_mutex);
|
||||
#endif /* UNIV_SYNC_DEBUG */
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -224,7 +224,7 @@ thr_local_init(void)
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -131,6 +131,24 @@ trx_rollback_for_mysql(
|
||||
|
||||
trx->op_info = "rollback";
|
||||
|
||||
/* 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 = "";
|
||||
|
@ -1598,6 +1598,24 @@ trx_commit_for_mysql(
|
||||
|
||||
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);
|
||||
|
||||
mutex_enter(&kernel_mutex);
|
||||
@ -1761,11 +1779,10 @@ trx_print(
|
||||
|| mem_heap_get_size(trx->lock_heap) > 400) {
|
||||
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) mem_heap_get_size(trx->lock_heap));
|
||||
|
||||
fprintf(f, "%lu row lock(s)",
|
||||
(ulong) mem_heap_get_size(trx->lock_heap),
|
||||
(ulong) lock_number_of_rows_locked(trx));
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
# Change this to match the version of the shared libs you want to include
|
||||
#
|
||||
%define version50 @MYSQL_NO_DASH_VERSION@
|
||||
%define version41 4.1.16
|
||||
%define version41 4.1.17
|
||||
%define version40 4.0.26
|
||||
%define version3 3.23.58
|
||||
|
||||
|
@ -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
|
||||
RBR=$RPM_BUILD_ROOT
|
||||
MBD=$RPM_BUILD_DIR/mysql-%{mysql_version}/mysql-release-%{mysql_version}
|
||||
@ -654,6 +667,9 @@ fi
|
||||
%{_includedir}/mysql/*
|
||||
%{_libdir}/mysql/libdbug.a
|
||||
%{_libdir}/mysql/libheap.a
|
||||
%if %{have_libgcc}
|
||||
%{_libdir}/mysql/libmygcc.a
|
||||
%endif
|
||||
%{_libdir}/mysql/libmyisam.a
|
||||
%{_libdir}/mysql/libmyisammrg.a
|
||||
%{_libdir}/mysql/libmysqlclient.a
|
||||
@ -689,6 +705,13 @@ fi
|
||||
# itself - note that they must be ordered by date (important when
|
||||
# merging BK trees)
|
||||
%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>
|
||||
|
||||
- Fix the move of "mysqlmanager" to section 8: Directory name was wrong.
|
||||
|
Reference in New Issue
Block a user