mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
9a9e8d2311
---------------------------------------------------------------------- ChangeSet@1.2571, 2008-04-08 12:30:06+02:00, vvaintroub@wva. +122 -0 Bug#32082 : definition of VOID in my_global.h conflicts with Windows SDK headers VOID macro is now removed. Its usage is replaced with void cast. In some cases, where cast does not make much sense (pthread_*, printf, hash_delete, my_seek), cast is ommited. client/mysqladmin.cc: Bug#32082 : remove VOID macro client/mysqldump.c: Bug#32082 : remove VOID macro client/mysqlimport.c: Bug#32082 : remove VOID macro client/mysqlslap.c: Bug#32082 : remove VOID macro client/mysqltest.cc: Bug#32082 : remove VOID macro client/sql_string.cc: Bug#32082 : remove VOID macro extra/comp_err.c: Bug#32082 : remove VOID macro extra/replace.c: Bug#32082 : remove VOID macro include/my_alarm.h: Bug#32082 : remove VOID macro include/my_global.h: Bug#32082 : remove VOID macro libmysql/libmysql.c: Bug#32082 : remove VOID macro mysys/errors.c: Bug#32082 : remove VOID macro mysys/hash.c: Bug#32082 : remove VOID macro mysys/mf_iocache2.c: Bug#32082 : remove VOID macro mysys/mf_loadpath.c: Bug#32082 : remove VOID macro mysys/mf_path.c: Bug#32082 : remove VOID macro mysys/my_append.c: Bug#32082 : remove VOID macro mysys/my_clock.c: Bug#32082 : remove VOID macro mysys/my_copy.c: Bug#32082 : remove VOID macro mysys/my_fstream.c: Bug#32082 : remove VOID macro mysys/my_getwd.c: Bug#32082 : remove VOID macro mysys/my_lib.c: Bug#32082 : remove VOID macro mysys/my_lockmem.c: Bug#32082 : remove VOID macro mysys/my_pthread.c: Bug#32082 : remove VOID macro mysys/my_redel.c: Bug#32082 : remove VOID macro mysys/stacktrace.c: Bug#32082 : remove VOID macro mysys/thr_alarm.c: Bug#32082 : remove VOID macro mysys/thr_lock.c: Bug#32082 : remove VOID macro sql/derror.cc: Bug#32082 : remove VOID macro sql/des_key_file.cc: Bug#32082 : remove VOID macro sql/discover.cc: Bug#32082 : remove VOID macro sql/field.cc: Bug#32082 : remove VOID macro sql/filesort.cc: Bug#32082 : remove VOID macro sql/ha_ndbcluster.cc: Bug#32082 : remove VOID macro sql/ha_partition.cc: Bug#32082 : remove VOID macro sql/handler.cc: Bug#32082 : remove VOID macro sql/hostname.cc: Bug#32082 : remove VOID macro sql/init.cc: Bug#32082 : remove VOID macro sql/item.cc: Bug#32082 : remove VOID macro sql/item_cmpfunc.cc: Bug#32082 : remove VOID macro sql/item_strfunc.cc: Bug#32082 : remove VOID macro sql/lock.cc: Bug#32082 : remove VOID macro sql/log.cc: Bug#32082 : remove VOID macro sql/log_event.cc: Bug#32082 : remove VOID macro sql/mysqld.cc: Bug#32082 : remove VOID macro sql/opt_range.h: Bug#32082 : remove VOID macro sql/protocol.cc: Bug#32082 : remove VOID macro sql/records.cc: Bug#32082 : remove VOID macro sql/sp_head.cc: Bug#32082 : remove VOID macro sql/sp_pcontext.cc: Bug#32082 : remove VOID macro sql/sql_acl.cc: Bug#32082 : remove VOID macro sql/sql_base.cc: Bug#32082 : remove VOID macro sql/sql_cache.cc: Bug#32082 : remove VOID macro sql/sql_connect.cc: Bug#32082 : remove VOID macro sql/sql_db.cc: Bug#32082 : remove VOID macro sql/sql_delete.cc: Bug#32082 : remove VOID macro sql/sql_handler.cc: Bug#32082 : remove VOID macro sql/sql_insert.cc: Bug#32082 : remove VOID macro sql/sql_map.cc: Bug#32082 : remove VOID macro sql/sql_parse.cc: Bug#32082 : remove VOID macro sql/sql_select.cc: Bug#32082 : remove VOID macro sql/sql_servers.cc: Bug#32082 : remove VOID macro sql/sql_show.cc: Bug#32082 : remove VOID macro sql/sql_string.cc: Bug#32082 : remove VOID macro sql/sql_table.cc: Bug#32082 : remove VOID macro sql/sql_test.cc: Bug#32082 : remove VOID macro sql/sql_trigger.cc: Bug#32082 : remove VOID macro sql/sql_update.cc: Bug#32082 : remove VOID macro sql/sql_view.cc: Bug#32082 : remove VOID macro sql/table.cc: Bug#32082 : remove VOID macro sql/tztime.cc: Bug#32082 : remove VOID macro sql/udf_example.c: Bug#32082 : remove VOID macro sql/uniques.cc: Bug#32082 : remove VOID macro sql/unireg.cc: Bug#32082 : remove VOID macro storage/archive/ha_archive.cc: Bug#32082 : remove VOID macro storage/blackhole/ha_blackhole.cc: Bug#32082 : remove VOID macro storage/csv/ha_tina.cc: Bug#32082 : remove VOID macro storage/csv/transparent_file.cc: Bug#32082 : remove VOID macro storage/example/ha_example.cc: Bug#32082 : remove VOID macro storage/federated/ha_federated.cc: Bug#32082 : remove VOID macro storage/heap/hp_clear.c: Bug#32082 : remove VOID macro storage/heap/hp_create.c: Bug#32082 : remove VOID macro storage/heap/hp_test1.c: Bug#32082 : remove VOID macro storage/heap/hp_test2.c: Bug#32082 : remove VOID macro storage/innobase/handler/ha_innodb.cc: Bug#32082 : remove VOID macro storage/myisam/ft_eval.c: Bug#32082 : remove VOID macro storage/myisam/ha_myisam.cc: Bug#32082 : remove VOID macro storage/myisam/mi_changed.c: Bug#32082 : remove VOID macro storage/myisam/mi_check.c: Bug#32082 : remove VOID macro storage/myisam/mi_close.c: Bug#32082 : remove VOID macro storage/myisam/mi_create.c: Bug#32082 : remove VOID macro storage/myisam/mi_dbug.c: Bug#32082 : remove VOID macro storage/myisam/mi_delete.c: Bug#32082 : remove VOID macro storage/myisam/mi_delete_all.c: Bug#32082 : remove VOID macro storage/myisam/mi_dynrec.c: Bug#32082 : remove VOID macro storage/myisam/mi_info.c: Bug#32082 : remove VOID macro storage/myisam/mi_locking.c: Bug#32082 : remove VOID macro storage/myisam/mi_log.c: Bug#32082 : remove VOID macro storage/myisam/mi_open.c: Bug#32082 : remove VOID macro storage/myisam/mi_packrec.c: Bug#32082 : remove VOID macro storage/myisam/mi_panic.c: Bug#32082 : remove VOID macro storage/myisam/mi_rsame.c: Bug#32082 : remove VOID macro storage/myisam/mi_statrec.c: Bug#32082 : remove VOID macro storage/myisam/mi_test1.c: Bug#32082 : remove VOID macro storage/myisam/mi_test2.c: Bug#32082 : remove VOID macro storage/myisam/mi_test3.c: Bug#32082 : remove VOID macro storage/myisam/mi_update.c: Bug#32082 : remove VOID macro storage/myisam/mi_write.c: Bug#32082 : remove VOID macro storage/myisam/myisamchk.c: Bug#32082 : remove VOID macro storage/myisam/myisamlog.c: Bug#32082 : remove VOID macro storage/myisam/myisampack.c: Bug#32082 : remove VOID macro storage/myisam/sort.c: Bug#32082 : remove VOID macro storage/myisammrg/myrg_close.c: Bug#32082 : remove VOID macro storage/myisammrg/myrg_create.c: Bug#32082 : remove VOID macro storage/myisammrg/myrg_open.c: Bug#32082 : remove VOID macro strings/str_test.c: Bug#32082 : remove VOID macro tests/thread_test.c: Bug#32082 : remove VOID macro
258 lines
7.5 KiB
C
258 lines
7.5 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include <my_global.h>
|
|
|
|
#ifndef THREAD
|
|
|
|
int main(int argc __attribute__((unused)), char **argv __attribute__((unused)))
|
|
{
|
|
printf("This test must be compiled with multithread support to work\n");
|
|
exit(1);
|
|
}
|
|
#else
|
|
|
|
#include <my_sys.h>
|
|
#include <my_pthread.h>
|
|
#include "mysql.h"
|
|
#include <my_getopt.h>
|
|
|
|
static my_bool version, verbose, tty_password= 0;
|
|
static uint thread_count,number_of_tests=1000,number_of_threads=2;
|
|
static pthread_cond_t COND_thread_count;
|
|
static pthread_mutex_t LOCK_thread_count;
|
|
|
|
static char *database,*host,*user,*password,*unix_socket,*query;
|
|
uint tcp_port;
|
|
|
|
#ifndef __WIN__
|
|
void *test_thread(void *arg __attribute__((unused)))
|
|
#else
|
|
unsigned __stdcall test_thread(void *arg __attribute__((unused)))
|
|
#endif
|
|
{
|
|
MYSQL *mysql;
|
|
uint count;
|
|
|
|
mysql=mysql_init(NULL);
|
|
if (!mysql_real_connect(mysql,host,user,password,database,tcp_port,
|
|
unix_socket,0))
|
|
{
|
|
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(mysql));
|
|
perror("");
|
|
goto end;
|
|
}
|
|
mysql.reconnect= 1;
|
|
if (verbose) { putchar('*'); fflush(stdout); }
|
|
for (count=0 ; count < number_of_tests ; count++)
|
|
{
|
|
MYSQL_RES *res;
|
|
if (mysql_query(mysql,query))
|
|
{
|
|
fprintf(stderr,"Query failed (%s)\n",mysql_error(mysql));
|
|
goto end;
|
|
}
|
|
if (!(res=mysql_store_result(mysql)))
|
|
{
|
|
fprintf(stderr,"Couldn't get result from %s\n", mysql_error(mysql));
|
|
goto end;
|
|
}
|
|
mysql_free_result(res);
|
|
if (verbose) { putchar('.'); fflush(stdout); }
|
|
}
|
|
end:
|
|
if (verbose) { putchar('#'); fflush(stdout); }
|
|
mysql_close(mysql);
|
|
pthread_mutex_lock(&LOCK_thread_count);
|
|
thread_count--;
|
|
pthread_cond_signal(&COND_thread_count); /* Tell main we are ready */
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
pthread_exit(0);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static struct my_option my_long_options[] =
|
|
{
|
|
{"help", '?', "Display this help and exit", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
|
0, 0, 0, 0, 0},
|
|
{"database", 'D', "Database to use", (uchar**) &database, (uchar**) &database,
|
|
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"host", 'h', "Connect to host", (uchar**) &host, (uchar**) &host, 0, GET_STR,
|
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"password", 'p',
|
|
"Password to use when connecting to server. If password is not given it's asked from the tty.",
|
|
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"user", 'u', "User for login if not current user", (uchar**) &user,
|
|
(uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"version", 'V', "Output version information and exit",
|
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"verbose", 'v', "Write some progress indicators", (uchar**) &verbose,
|
|
(uchar**) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"query", 'Q', "Query to execute in each threads", (uchar**) &query,
|
|
(uchar**) &query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
|
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
|
#if MYSQL_PORT_DEFAULT == 0
|
|
"/etc/services, "
|
|
#endif
|
|
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
|
(uchar**) &tcp_port,
|
|
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0},
|
|
{"socket", 'S', "Socket file to use for connection", (uchar**) &unix_socket,
|
|
(uchar**) &unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
|
{"test-count", 'c', "Run test count times (default %d)",
|
|
(uchar**) &number_of_tests, (uchar**) &number_of_tests, 0, GET_UINT,
|
|
REQUIRED_ARG, 1000, 0, 0, 0, 0, 0},
|
|
{"thread-count", 't', "Number of threads to start",
|
|
(uchar**) &number_of_threads, (uchar**) &number_of_threads, 0, GET_UINT,
|
|
REQUIRED_ARG, 2, 0, 0, 0, 0, 0},
|
|
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
|
};
|
|
|
|
|
|
static const char *load_default_groups[]= { "client",0 };
|
|
|
|
static void usage()
|
|
{
|
|
printf("Connection to a mysql server with multiple threads\n");
|
|
if (version)
|
|
return;
|
|
puts("This software comes with ABSOLUTELY NO WARRANTY.\n");
|
|
printf("Usage: %s [OPTIONS] [database]\n", my_progname);
|
|
|
|
my_print_help(my_long_options);
|
|
print_defaults("my",load_default_groups);
|
|
my_print_variables(my_long_options);
|
|
printf("\nExample usage:\n\n\
|
|
%s -Q 'select * from mysql.user' -c %d -t %d\n",
|
|
my_progname, number_of_tests, number_of_threads);
|
|
}
|
|
|
|
|
|
static my_bool
|
|
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|
char *argument)
|
|
{
|
|
switch (optid) {
|
|
case 'p':
|
|
if (argument)
|
|
{
|
|
my_free(password, MYF(MY_ALLOW_ZERO_PTR));
|
|
password= my_strdup(argument, MYF(MY_FAE));
|
|
while (*argument) *argument++= 'x'; /* Destroy argument */
|
|
}
|
|
else
|
|
tty_password= 1;
|
|
break;
|
|
case 'V':
|
|
version= 1;
|
|
usage();
|
|
exit(0);
|
|
break;
|
|
case '?':
|
|
case 'I': /* Info */
|
|
usage();
|
|
exit(1);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static void get_options(int argc, char **argv)
|
|
{
|
|
int ho_error;
|
|
|
|
load_defaults("my",load_default_groups,&argc,&argv);
|
|
|
|
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
|
|
exit(ho_error);
|
|
|
|
free_defaults(argv);
|
|
if (tty_password)
|
|
password=get_tty_password(NullS);
|
|
return;
|
|
}
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
pthread_t tid;
|
|
pthread_attr_t thr_attr;
|
|
uint i;
|
|
int error;
|
|
MY_INIT(argv[0]);
|
|
get_options(argc,argv);
|
|
|
|
if ((error=pthread_cond_init(&COND_thread_count,NULL)))
|
|
{
|
|
fprintf(stderr,"Got error: %d from pthread_cond_init (errno: %d)",
|
|
error,errno);
|
|
exit(1);
|
|
}
|
|
pthread_mutex_init(&LOCK_thread_count,MY_MUTEX_INIT_FAST);
|
|
|
|
if ((error=pthread_attr_init(&thr_attr)))
|
|
{
|
|
fprintf(stderr,"Got error: %d from pthread_attr_init (errno: %d)",
|
|
error,errno);
|
|
exit(1);
|
|
}
|
|
if ((error=pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED)))
|
|
{
|
|
fprintf(stderr,
|
|
"Got error: %d from pthread_attr_setdetachstate (errno: %d)",
|
|
error,errno);
|
|
exit(1);
|
|
}
|
|
|
|
printf("Init ok. Creating %d threads\n",number_of_threads);
|
|
for (i=1 ; i <= number_of_threads ; i++)
|
|
{
|
|
int *param= &i;
|
|
|
|
if (verbose) { putchar('+'); fflush(stdout); }
|
|
pthread_mutex_lock(&LOCK_thread_count);
|
|
if ((error=pthread_create(&tid,&thr_attr,test_thread,(void*) param)))
|
|
{
|
|
fprintf(stderr,"\nGot error: %d from pthread_create (errno: %d) when creating thread: %i\n",
|
|
error,errno,i);
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
exit(1);
|
|
}
|
|
thread_count++;
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
}
|
|
|
|
printf("Waiting for threads to finnish\n");
|
|
error=pthread_mutex_lock(&LOCK_thread_count);
|
|
while (thread_count)
|
|
{
|
|
if ((error=pthread_cond_wait(&COND_thread_count,&LOCK_thread_count)))
|
|
fprintf(stderr,"\nGot error: %d from pthread_cond_wait\n",error);
|
|
}
|
|
pthread_mutex_unlock(&LOCK_thread_count);
|
|
pthread_attr_destroy(&thr_attr);
|
|
printf("\nend\n");
|
|
|
|
my_end(0);
|
|
return 0;
|
|
|
|
exit(0);
|
|
return 0; /* Keep some compilers happy */
|
|
}
|
|
|
|
#endif /* THREAD */
|