osaf/services/saf/amf/amfnd/main.cc | 51 +++++++++++++++++++++++++++++++++--- 1 files changed, 46 insertions(+), 5 deletions(-)
diff --git a/osaf/services/saf/amf/amfnd/main.cc b/osaf/services/saf/amf/amfnd/main.cc --- a/osaf/services/saf/amf/amfnd/main.cc +++ b/osaf/services/saf/amf/amfnd/main.cc @@ -31,11 +31,15 @@ #include "immutil.h" #include "logtrace.h" #include "nid_api.h" +#include "osaf_time.h" #include <imm.h> -#define FD_MBX 0 -#define FD_TERM 1 -#define FD_CLM 2 +enum { + FD_MBX = 0, + FD_TERM = 1, + FD_CLM = 2, + FD_AMFD_FIFO = 3 +}; static const char* internal_version_id_ __attribute__ ((used)) = "@(#) $Id: " INTERNAL_VERSION_ID " $"; @@ -496,6 +500,30 @@ static void sigterm_handler(int sig) signal(SIGTERM, SIG_IGN); } +static int open_amfd_fifo() { + const std::string fifo_dir = PKGLOCALSTATEDIR; + std::string fifo_file = fifo_dir + "/" + "osafamfd.fifo"; + int fifo_fd = -1; + int retry_cnt = 0; + + if (access(fifo_file.c_str(), F_OK ) != -1 ) { + do { + if (retry_cnt > 0) { + osaf_nanosleep(&kHundredMilliseconds); + } + fifo_fd = open(fifo_file.c_str(), O_WRONLY|O_NONBLOCK); + } while ((fifo_fd == -1) && + (retry_cnt++ < 5 && (errno == EINTR || errno == ENXIO))); + if (fifo_fd == -1) { + LOG_ER("Failed to open %s, error: %s", fifo_file.c_str(), + strerror(errno)); + } else { + LOG_NO("Start monitoring AMFD using %s", fifo_file.c_str()); + } + } + return fifo_fd; +} + /**************************************************************************** Name : avnd_main_process @@ -509,9 +537,10 @@ static void sigterm_handler(int sig) ******************************************************************************/ void avnd_main_process(void) { + int amfd_fifo_fd = -1; NCS_SEL_OBJ mbx_fd; - struct pollfd fds[4]; - nfds_t nfds = 3; + struct pollfd fds[5]; + nfds_t nfds = 4; AVND_EVT *evt; SaAisErrorT result = SA_AIS_OK; SaAisErrorT rc = SA_AIS_OK; @@ -542,6 +571,10 @@ void avnd_main_process(void) fds[FD_CLM].fd = avnd_cb->clm_sel_obj; fds[FD_CLM].events = POLLIN; + amfd_fifo_fd = open_amfd_fifo(); + fds[FD_AMFD_FIFO].fd = amfd_fifo_fd; + fds[FD_AMFD_FIFO].events = POLLIN; + /* now wait forever */ while (1) { int ret = poll(fds, nfds, -1); @@ -555,6 +588,14 @@ void avnd_main_process(void) break; } + if (fds[FD_AMFD_FIFO].revents & POLLERR) { + LOG_ER("AMFD has unexpectedly crashed. Rebooting node"); + opensaf_reboot(avnd_cb->node_info.nodeId, + osaf_extended_name_borrow(&avnd_cb->node_info.executionEnvironment), + "AMFD has unexpectedly crashed. Rebooting node"); + exit(0); + } + if (avnd_cb->clmHandle && (fds[FD_CLM].revents & POLLIN)) { //LOG_NO("DEBUG-> CLM event fd: %d sel_obj: %llu, clm handle: %llu", fds[FD_CLM].fd, avnd_cb->clm_sel_obj, avnd_cb->clmHandle); result = saClmDispatch(avnd_cb->clmHandle, SA_DISPATCH_ALL); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel