summaryrefslogtreecommitdiff
path: root/server-tools/instance-manager/mysqlmanager.cc
diff options
context:
space:
mode:
authorunknown <kostja@oak.local>2003-08-19 19:55:20 +0400
committerunknown <kostja@oak.local>2003-08-19 19:55:20 +0400
commitdf6047f047686eeb6172ea27ac216380d23b64f9 (patch)
treef56be3d05dd68ecf1ee3f12b802de318404e0258 /server-tools/instance-manager/mysqlmanager.cc
parente561c3ee608c8083207f4c07e84b5a0accf6664d (diff)
downloadmariadb-git-df6047f047686eeb6172ea27ac216380d23b64f9.tar.gz
First implementation for signal handling and multi-threading:
safe shutdown and signal deliverence to all threads in the manager process server-tools/instance-manager/Makefile.am: added listener.{h,cc} (listener thread) and thread_repository.{h,cc} - class to handle threads && signals server-tools/instance-manager/log.h: minor fixes server-tools/instance-manager/manager.cc: unnecessary error checking was removed added implementation for signal thread server-tools/instance-manager/manager.h: header guards're added server-tools/instance-manager/mysqlmanager.cc: unnecessary error checking was removed server-tools/instance-manager/options.cc: minor fixes server-tools/instance-manager/options.h: removed wrong declaration
Diffstat (limited to 'server-tools/instance-manager/mysqlmanager.cc')
-rw-r--r--server-tools/instance-manager/mysqlmanager.cc41
1 files changed, 18 insertions, 23 deletions
diff --git a/server-tools/instance-manager/mysqlmanager.cc b/server-tools/instance-manager/mysqlmanager.cc
index a08b0691eec..cab7f5fd8ed 100644
--- a/server-tools/instance-manager/mysqlmanager.cc
+++ b/server-tools/instance-manager/mysqlmanager.cc
@@ -106,13 +106,12 @@ static void daemonize(const char *log_file_name)
case 0: // child, fork ok
int fd;
/*
- Become a session leader: setsid should succeed because child is
+ Become a session leader: setsid must succeed because child is
guaranteed not to be a process group leader (it belongs to the
process group of the parent.)
The goal is not to have a controlling terminal.
*/
- if (setsid() == -1)
- die("daemonize(): setsid() failed, %s", strerror(errno));
+ setsid();
/*
As we now don't have a controlling terminal we will not receive
tty-related signals - no need to ignore them.
@@ -193,19 +192,21 @@ static void angel(const Options &options)
sigset_t zeromask; // to sigsuspend in parent
struct sigaction sa_chld, sa_term;
struct sigaction sa_chld_out, sa_term_out, sa_int_out, sa_hup_out;
- if (sigemptyset(&zeromask) ||
- sigemptyset(&sa_chld.sa_mask) ||
- sigemptyset(&sa_term.sa_mask)) // how can it fail?
- die("angel(): sigemptyset() failed, %s", strerror(errno));
+
+ sigemptyset(&zeromask);
+ sigemptyset(&sa_chld.sa_mask);
+ sigemptyset(&sa_term.sa_mask);
+
sa_chld.sa_handler= reap_child;
sa_chld.sa_flags= SA_NOCLDSTOP;
sa_term.sa_handler= terminate;
sa_term.sa_flags= 0;
- if (sigaction(SIGCHLD, &sa_chld, &sa_chld_out) == -1 ||
- sigaction(SIGTERM, &sa_term, &sa_term_out) == -1 ||
- sigaction(SIGINT, &sa_term, &sa_int_out) == -1 ||
- sigaction(SIGHUP, &sa_term, &sa_hup_out) == -1)
- die("angel(): sigaction() failed, %s", strerror(errno));
+
+ /* sigaction can fail only on wrong arguments */
+ sigaction(SIGCHLD, &sa_chld, &sa_chld_out);
+ sigaction(SIGTERM, &sa_term, &sa_term_out);
+ sigaction(SIGINT, &sa_term, &sa_int_out);
+ sigaction(SIGHUP, &sa_term, &sa_hup_out);
/* spawn a child */
spawn:
@@ -218,22 +219,16 @@ spawn:
restore default actions for signals to let the manager work with
signals as he wishes
*/
- if (sigaction(SIGCHLD, &sa_chld_out, 0) == -1 ||
- sigaction(SIGTERM, &sa_term_out, 0) == -1 ||
- sigaction(SIGINT, &sa_int_out, 0) == -1 ||
- sigaction(SIGHUP, &sa_hup_out, 0) == -1)
- die("angel(): child failed to restore old signal actions, %s",
- strerror(errno));
+ sigaction(SIGCHLD, &sa_chld_out, 0);
+ sigaction(SIGTERM, &sa_term_out, 0);
+ sigaction(SIGINT, &sa_int_out, 0);
+ sigaction(SIGHUP, &sa_hup_out, 0);
manager(options.socket_file_name);
default: // parent, success
while (child_status == CHILD_OK && is_terminated == 0)
- {
- errno= 0;
sigsuspend(&zeromask);
- if (errno != EINTR)
- die("angel(): sigsuspend failed, %s", strerror(errno));
- }
+
if (is_terminated)
log_info("angel got signal %d (%s), exiting",
is_terminated, sys_siglist[is_terminated]);