refactor amfd/fmd/rded to use daemon_sighup_install
---
src/amf/amfd/main.cc | 27 +++++----------------------
src/base/daemon.c | 36 +++++++++++++++++++++++++++++++++++-
src/base/daemon.h | 3 +++
src/fm/fmd/fm_main.cc | 28 +++++-----------------------
src/rde/rded/rde_main.cc | 28 +++++-----------------------
5 files changed, 53 insertions(+), 69 deletions(-)
diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index a86e536..50daa59 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -84,16 +84,12 @@ AVD_CL_CB *avd_cb = &_control_block;
static nfds_t nfds = FD_IMM + 1;
static struct pollfd fds[FD_IMM + 1];
-static NCS_SEL_OBJ sighup_sel_obj;
-
static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt);
static void invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
static void standby_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
static void qsd_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
static void qsd_ignore_evh(AVD_CL_CB *cb, AVD_EVT *evt);
-static void sighup_handler(int signum, siginfo_t *info, void *ptr);
-
/* list of all the function pointers related to handling the events
* for active director.
*/
@@ -624,6 +620,8 @@ static void main_loop(void) {
AVD_STBY_SYNC_STATE old_sync_state = cb->stby_sync_state;
int polltmo = -1;
int term_fd;
+ int hangup_fd;
+ NCS_SEL_OBJ *hangup_sel_obj = nullptr;
// function to be called if new fails. The alternative of using catch of
// std::bad_alloc will unwind the stack and thus no call chain will be
@@ -633,22 +631,11 @@ static void main_loop(void) {
mbx_fd = ncs_ipc_get_sel_obj(&cb->avd_mbx);
daemon_sigterm_install(&term_fd);
- int rc = ncs_sel_obj_create(&sighup_sel_obj);
- osafassert(rc == NCSCC_RC_SUCCESS);
-
- struct sigaction sighup;
- sigemptyset(&sighup.sa_mask);
- sighup.sa_sigaction = sighup_handler;
- sighup.sa_flags = SA_SIGINFO;
-
- if (sigaction(SIGHUP, &sighup, NULL) != 0) {
- osafassert(false);
- }
-
+ hangup_sel_obj = daemon_sighup_install(&hangup_fd);
fds[FD_TERM].fd = term_fd;
fds[FD_TERM].events = POLLIN;
- fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+ fds[FD_SIGHUP].fd = hangup_fd;
fds[FD_SIGHUP].events = POLLIN;
fds[FD_MBX].fd = mbx_fd.rmv_obj;
fds[FD_MBX].events = POLLIN;
@@ -691,7 +678,7 @@ static void main_loop(void) {
}
if (fds[FD_SIGHUP].revents & POLLIN) {
- ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+ ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
Consensus consensus_service;
consensus_service.ReloadConfiguration();
}
@@ -851,10 +838,6 @@ static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt)
{
TRACE_LEAVE();
}
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
- ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
/**
* Entry point for the AMF Director process
* @param argc
diff --git a/src/base/daemon.c b/src/base/daemon.c
index f5a43c9..2f7f37f 100644
--- a/src/base/daemon.c
+++ b/src/base/daemon.c
@@ -46,7 +46,6 @@
#include "base/logtrace.h"
#include "base/ncsgl_defs.h"
-#include "base/os_defs.h"
#include "base/osaf_gcov.h"
#include "base/osaf_secutil.h"
#include "base/osaf_time.h"
@@ -515,6 +514,7 @@ void daemonize_as_user(const char *username, int argc, char
*argv[])
}
static NCS_SEL_OBJ term_sel_obj; /* Selection object for TERM signal events */
+static NCS_SEL_OBJ hangup_sel_obj; /* Selection object for HUP signal */
// symbols from ncs_osprm.h, don't pull in that file here!
extern uint32_t ncs_sel_obj_create(NCS_SEL_OBJ *o_sel_obj);
@@ -534,6 +534,15 @@ static void sigterm_handler(int signum, siginfo_t *info,
void *ptr)
}
/**
+ * HUP signal handler
+ * @param sig
+ */
+static void sighup_handler(int signum, siginfo_t *info, void *ptr)
+{
+ ncs_sel_obj_ind(&hangup_sel_obj);
+}
+
+/**
* Exit calling process with exit(0) using a standard syslog message.
* This function should be called from the main thread of a server process in
* a "safe" context for calling exit(). Any service specific thing should be
@@ -581,6 +590,31 @@ void daemon_sigterm_install(int *term_fd)
*term_fd = term_sel_obj.rmv_obj;
}
+/**
+ * Install HUP signal handler and return descriptor to monitor
+ * @param[out] term_fd socket descriptor to monitor for SIGHUP event
+ */
+NCS_SEL_OBJ* daemon_sighup_install(int *hangup_fd)
+{
+ struct sigaction act;
+
+ if (ncs_sel_obj_create(&hangup_sel_obj) != NCSCC_RC_SUCCESS) {
+ syslog(LOG_ERR, "ncs_sel_obj_create failed");
+ exit(EXIT_FAILURE);
+ }
+
+ sigemptyset(&act.sa_mask);
+ act.sa_sigaction = sighup_handler;
+ act.sa_flags = SA_SIGINFO;
+ if (sigaction(SIGHUP, &act, NULL) < 0) {
+ syslog(LOG_ERR, "sigaction HUP failed: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ *hangup_fd = hangup_sel_obj.rmv_obj;
+ return &hangup_sel_obj;
+}
+
static char *bt_filename = 0;
static int (*plibc_backtrace)(void **buffer, int size) = NULL;
diff --git a/src/base/daemon.h b/src/base/daemon.h
index 3fc8217..dbfa372 100644
--- a/src/base/daemon.h
+++ b/src/base/daemon.h
@@ -25,6 +25,8 @@
#ifndef BASE_DAEMON_H_
#define BASE_DAEMON_H_
+#include "base/os_defs.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -33,6 +35,7 @@ void daemonize(int argc, char *argv[]);
void daemonize_as_user(const char *username, int argc, char *argv[]);
void daemon_exit(void);
void daemon_sigterm_install(int *term_fd);
+NCS_SEL_OBJ* daemon_sighup_install(int *hangup_fd);
#ifdef __cplusplus
}
diff --git a/src/fm/fmd/fm_main.cc b/src/fm/fmd/fm_main.cc
index ea70f24..2eb3c16 100644
--- a/src/fm/fmd/fm_main.cc
+++ b/src/fm/fmd/fm_main.cc
@@ -71,7 +71,6 @@ void rda_cb(uint32_t cb_hdl, PCS_RDA_CB_INFO *cb_info,
PCSRDA_RETURN_CODE error_code);
uint32_t gl_fm_hdl;
static NCS_SEL_OBJ usr1_sel_obj;
-static NCS_SEL_OBJ sighup_sel_obj;
/**
* USR1 signal is used when AMF wants instantiate us as a
@@ -86,10 +85,6 @@ static void sigusr1_handler(int sig) {
ncs_sel_obj_ind(&usr1_sel_obj);
}
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
- ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
/**
* Callback from RDA. Post a message/event to the FM mailbox.
* @param cb_hdl
@@ -136,6 +131,8 @@ int main(int argc, char *argv[]) {
int ret = 0;
int rc = NCSCC_RC_FAILURE;
int term_fd;
+ int hangup_fd;
+ NCS_SEL_OBJ* hangup_sel_obj = nullptr;
bool nid_started = false;
char *control_tipc = NULL;
@@ -222,22 +219,6 @@ int main(int argc, char *argv[]) {
goto fm_init_failed;
}
- rc = ncs_sel_obj_create(&sighup_sel_obj);
- if (rc != NCSCC_RC_SUCCESS) {
- LOG_ER("ncs_sel_obj_create FAILED");
- goto fm_init_failed;
- }
-
- struct sigaction sighup;
- sigemptyset(&sighup.sa_mask);
- sighup.sa_sigaction = sighup_handler;
- sighup.sa_flags = SA_SIGINFO;
-
- if (sigaction(SIGHUP, &sighup, NULL) != 0) {
- LOG_ER("registering SIGHUP FAILED: %s", strerror(errno));
- goto fm_init_failed;
- }
-
if (!nid_started && fm_amf_init(&fm_cb->fm_amf_cb) != NCSCC_RC_SUCCESS)
goto fm_init_failed;
@@ -254,6 +235,7 @@ int main(int argc, char *argv[]) {
ncshm_give_hdl(gl_fm_hdl);
daemon_sigterm_install(&term_fd);
+ hangup_sel_obj = daemon_sighup_install(&hangup_fd);
fds[FD_TERM].fd = term_fd;
fds[FD_TERM].events = POLLIN;
@@ -266,7 +248,7 @@ int main(int argc, char *argv[]) {
fds[FD_MBX].fd = mbx_sel_obj.rmv_obj;
fds[FD_MBX].events = POLLIN;
- fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+ fds[FD_SIGHUP].fd = hangup_fd;
fds[FD_SIGHUP].events = POLLIN;
/* notify the NID */
@@ -304,7 +286,7 @@ int main(int argc, char *argv[]) {
}
if (fds[FD_SIGHUP].revents & POLLIN) {
- ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+ ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
reload_configuration(fm_cb);
Consensus consensus_service;
consensus_service.ReloadConfiguration();
diff --git a/src/rde/rded/rde_main.cc b/src/rde/rded/rde_main.cc
index 33ed5c4..f511814 100644
--- a/src/rde/rded/rde_main.cc
+++ b/src/rde/rded/rde_main.cc
@@ -64,7 +64,6 @@ const char *rde_msg_name[] = {"-",
static RDE_CONTROL_BLOCK _rde_cb;
static RDE_CONTROL_BLOCK *rde_cb = &_rde_cb;
static NCS_SEL_OBJ usr1_sel_obj;
-static NCS_SEL_OBJ sighup_sel_obj;
static NODE_ID own_node_id;
static Role *role;
@@ -83,10 +82,6 @@ static void sigusr1_handler(int sig) {
ncs_sel_obj_ind(&usr1_sel_obj);
}
-static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
- ncs_sel_obj_ind(&sighup_sel_obj);
-}
-
static int fd_to_client_ixd(int fd) {
int i;
RDE_RDA_CB *rde_rda_cb = &rde_cb->rde_rda_cb;
@@ -315,12 +310,6 @@ static int initialize_rde() {
goto init_failed;
}
- rc = ncs_sel_obj_create(&sighup_sel_obj);
- if (rc != NCSCC_RC_SUCCESS) {
- LOG_ER("ncs_sel_obj_create FAILED");
- goto init_failed;
- }
-
if ((rc = ncs_ipc_create(&rde_cb->mbx)) != NCSCC_RC_SUCCESS) {
LOG_ER("ncs_ipc_create FAILED");
goto init_failed;
@@ -337,16 +326,6 @@ static int initialize_rde() {
goto init_failed;
}
- struct sigaction sighup;
- sigemptyset(&sighup.sa_mask);
- sighup.sa_sigaction = sighup_handler;
- sighup.sa_flags = SA_SIGINFO;
-
- if (sigaction(SIGHUP, &sighup, NULL) != 0) {
- LOG_ER("registering SIGHUP FAILED: %s", strerror(errno));
- goto init_failed;
- }
-
if (rde_discovery_mds_register() != NCSCC_RC_SUCCESS) {
LOG_ER("rde_discovery_mds_register() failed");
rc = NCSCC_RC_FAILURE;
@@ -365,6 +344,8 @@ int main(int argc, char *argv[]) {
NCS_SEL_OBJ mbx_sel_obj;
RDE_RDA_CB *rde_rda_cb = &rde_cb->rde_rda_cb;
int term_fd;
+ int hangup_fd;
+ NCS_SEL_OBJ *hangup_sel_obj = nullptr;
opensaf_reboot_prepare();
daemonize(argc, argv);
@@ -382,6 +363,7 @@ int main(int argc, char *argv[]) {
}
daemon_sigterm_install(&term_fd);
+ hangup_sel_obj = daemon_sighup_install(&hangup_fd);
fds[FD_TERM].fd = term_fd;
fds[FD_TERM].events = POLLIN;
@@ -391,7 +373,7 @@ int main(int argc, char *argv[]) {
: rde_cb->rde_amf_cb.amf_fd;
fds[FD_AMF].events = POLLIN;
- fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+ fds[FD_SIGHUP].fd = hangup_fd;
fds[FD_SIGHUP].events = POLLIN;
/* Mailbox */
@@ -455,7 +437,7 @@ int main(int argc, char *argv[]) {
}
if (fds[FD_SIGHUP].revents & POLLIN) {
- ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+ ncs_sel_obj_rmv_ind(hangup_sel_obj, true, true);
Consensus consensus_service;
bool old_setting = consensus_service.IsEnabled();
consensus_service.ReloadConfiguration();
--
2.7.4
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel