mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge work:/home/bk/mysql-4.0
into mysql.sashanet.com:/home/sasha/src/bk/mysql-4.0
This commit is contained in:
@ -45,6 +45,11 @@
|
||||
char pstack_file_name[80];
|
||||
#endif /* __linux__ */
|
||||
|
||||
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
||||
#define HAVE_CLOSE_SERVER_SOCK 1
|
||||
void close_server_sock();
|
||||
#endif
|
||||
|
||||
extern "C" { // Because of SCO 3.2V4.2
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
@ -453,16 +458,7 @@ static void close_connections(void)
|
||||
sql_print_error("Got error %d from pthread_cond_timedwait",error);
|
||||
#endif
|
||||
#if defined(HAVE_DEC_3_2_THREADS) || defined(SIGNALS_DONT_BREAK_READ)
|
||||
if (ip_sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("error",("closing TCP/IP and socket files"));
|
||||
VOID(shutdown(ip_sock,2));
|
||||
VOID(closesocket(ip_sock));
|
||||
VOID(shutdown(unix_sock,2));
|
||||
VOID(closesocket(unix_sock));
|
||||
VOID(unlink(mysql_unix_port));
|
||||
ip_sock=unix_sock= INVALID_SOCKET;
|
||||
}
|
||||
close_server_sock();
|
||||
#endif
|
||||
}
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
@ -577,10 +573,37 @@ static void close_connections(void)
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
#ifdef HAVE_CLOSE_SERVER_SOCK
|
||||
void close_server_sock()
|
||||
{
|
||||
DBUG_ENTER("close_server_sock");
|
||||
if (ip_sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("info",("closing TCP/IP socket"));
|
||||
VOID(shutdown(ip_sock,2));
|
||||
VOID(closesocket(ip_sock));
|
||||
ip_sock=INVALID_SOCKET;
|
||||
}
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("info",("closing Unix socket"));
|
||||
VOID(shutdown(unix_sock,2));
|
||||
VOID(closesocket(unix_sock));
|
||||
VOID(unlink(mysql_unix_port));
|
||||
unix_sock=INVALID_SOCKET;
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
#endif
|
||||
|
||||
void kill_mysql(void)
|
||||
{
|
||||
DBUG_ENTER("kill_mysql");
|
||||
|
||||
#ifdef SIGNALS_DONT_BREAK_READ
|
||||
close_server_sock(); /* force accept to wake up */
|
||||
#endif
|
||||
|
||||
#if defined(__WIN__)
|
||||
{
|
||||
if (!SetEvent(hEventShutdown))
|
||||
@ -604,6 +627,7 @@ void kill_mysql(void)
|
||||
#endif
|
||||
DBUG_PRINT("quit",("After pthread_kill"));
|
||||
shutdown_in_progress=1; // Safety if kill didn't work
|
||||
abort_loop=1;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@ -683,9 +707,11 @@ void unireg_end(int signal_number __attribute__((unused)))
|
||||
|
||||
void unireg_abort(int exit_code)
|
||||
{
|
||||
DBUG_ENTER("unireg_abort");
|
||||
if (exit_code)
|
||||
sql_print_error("Aborting\n");
|
||||
clean_up(); /* purecov: inspected */
|
||||
DBUG_PRINT("quit",("done with cleanup in unireg_abort"));
|
||||
my_thread_end();
|
||||
exit(exit_code); /* purecov: inspected */
|
||||
}
|
||||
@ -736,13 +762,15 @@ void clean_up(bool print_message)
|
||||
if (print_message && errmesg)
|
||||
sql_print_error(ER(ER_SHUTDOWN_COMPLETE),my_progname);
|
||||
x_free((gptr) my_errmsg[ERRMAPP]); /* Free messages */
|
||||
|
||||
DBUG_PRINT("quit", ("Error messages freed"));
|
||||
/* Tell main we are ready */
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
DBUG_PRINT("quit", ("got thread count lock"));
|
||||
ready_to_exit=1;
|
||||
/* do the broadcast inside the lock to ensure that my_end() is not called */
|
||||
(void) pthread_cond_broadcast(&COND_thread_count);
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
DBUG_PRINT("quit", ("done with cleanup"));
|
||||
} /* clean_up */
|
||||
|
||||
|
||||
@ -2023,6 +2051,7 @@ The server will not act as a slave.");
|
||||
sql_print_error("Before Lock_thread_count");
|
||||
#endif
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
DBUG_PRINT("quit", ("Got thread_count mutex"));
|
||||
select_thread_in_use=0; // For close_connections
|
||||
(void) pthread_cond_broadcast(&COND_thread_count);
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
@ -2054,10 +2083,14 @@ The server will not act as a slave.");
|
||||
#endif /* HAVE_OPENSSL */
|
||||
/* Wait until cleanup is done */
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
DBUG_PRINT("quit", ("Got thread_count mutex for clean up wait"));
|
||||
|
||||
while (!ready_to_exit)
|
||||
{
|
||||
DBUG_PRINT("quit", ("not yet ready to exit"));
|
||||
pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
|
||||
}
|
||||
DBUG_PRINT("quit", ("ready to exit"));
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
exit(0);
|
||||
@ -2257,6 +2290,20 @@ static void create_new_thread(THD *thd)
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
#ifdef SIGNALS_DONT_BREAK_READ
|
||||
inline void kill_broken_server()
|
||||
{
|
||||
/* hack to get around signals ignored in syscalls for problem OS's */
|
||||
if (unix_sock == INVALID_SOCKET || ip_sock ==INVALID_SOCKET)
|
||||
{
|
||||
select_thread_in_use = 0;
|
||||
kill_server((void*)MYSQL_KILL_SIGNAL); /* never returns */
|
||||
}
|
||||
}
|
||||
#define MAYBE_BROKEN_SYSCALL kill_broken_server();
|
||||
#else
|
||||
#define MAYBE_BROKEN_SYSCALL
|
||||
#endif
|
||||
|
||||
/* Handle new connections and spawn new process to handle them */
|
||||
|
||||
@ -2292,6 +2339,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
|
||||
#endif
|
||||
|
||||
DBUG_PRINT("general",("Waiting for connections."));
|
||||
MAYBE_BROKEN_SYSCALL;
|
||||
while (!abort_loop)
|
||||
{
|
||||
readFDs=clientFDs;
|
||||
@ -2306,12 +2354,15 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
|
||||
if (!select_errors++ && !abort_loop) /* purecov: inspected */
|
||||
sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */
|
||||
}
|
||||
MAYBE_BROKEN_SYSCALL
|
||||
continue;
|
||||
}
|
||||
#endif /* HPUX */
|
||||
if (abort_loop)
|
||||
{
|
||||
MAYBE_BROKEN_SYSCALL;
|
||||
break;
|
||||
|
||||
}
|
||||
/*
|
||||
** Is this a new connection request
|
||||
*/
|
||||
@ -2347,6 +2398,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
|
||||
if (new_sock != INVALID_SOCKET ||
|
||||
(socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN))
|
||||
break;
|
||||
MAYBE_BROKEN_SYSCALL;
|
||||
#if !defined(NO_FCNTL_NONBLOCK)
|
||||
if (!(test_flags & TEST_BLOCKING))
|
||||
{
|
||||
@ -2363,6 +2415,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused)))
|
||||
{
|
||||
if ((error_count++ & 255) == 0) // This can happen often
|
||||
sql_perror("Error in accept");
|
||||
MAYBE_BROKEN_SYSCALL;
|
||||
if (socket_errno == SOCKET_ENFILE || socket_errno == SOCKET_EMFILE)
|
||||
sleep(1); // Give other threads some time
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user