There is a case imm reader (IR) thread is not yet created but
main thread send event to its mailbox then fail, lead to abnormal
state for node.
Main thread will check IR thread up and ready to send event.
---
 src/amf/amfnd/imm.cc  |  3 +++
 src/amf/amfnd/main.cc | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/src/amf/amfnd/imm.cc b/src/amf/amfnd/imm.cc
index 17cd73009..f6b175adf 100644
--- a/src/amf/amfnd/imm.cc
+++ b/src/amf/amfnd/imm.cc
@@ -17,6 +17,7 @@
  */
 
 #include <thread>
+#include <atomic>
 #include "amf/amfnd/avnd.h"
 #include <poll.h>
 #include "amf/amfnd/imm.h"
@@ -24,6 +25,7 @@
 ir_cb_t ir_cb;
 struct pollfd ImmReader::fds[];
 extern const AVND_EVT_HDLR g_avnd_func_list[AVND_EVT_MAX];
+std::atomic<bool> imm_reader_thread_ready{false};
 
 /**
  * This thread will read classes and object information thereby allowing main
@@ -54,6 +56,7 @@ void ImmReader::imm_reader_thread() {
     LOG_CR("Ir mailbox attach failed");
     exit(EXIT_FAILURE);
   }
+  imm_reader_thread_ready = true;
 
   mbx_fd = ncs_ipc_get_sel_obj(&ir_cb.mbx);
   fds[FD_MBX].fd = mbx_fd.rmv_obj;
diff --git a/src/amf/amfnd/main.cc b/src/amf/amfnd/main.cc
index af92808a5..24cf7eddf 100644
--- a/src/amf/amfnd/main.cc
+++ b/src/amf/amfnd/main.cc
@@ -22,6 +22,7 @@
 #include <poll.h>
 #include <sched.h>
 #include <stdlib.h>
+#include <atomic>
 
 #include "amf/amfnd/avnd.h"
 #include "amf/common/amf_d2nedu.h"
@@ -129,6 +130,7 @@ extern const AVND_EVT_HDLR g_avnd_func_list[AVND_EVT_MAX] = 
{
 };
 
 extern struct ImmutilWrapperProfile immutilWrapperProfile;
+extern std::atomic<bool> imm_reader_thread_ready;
 
 /* global task handle */
 NCSCONTEXT gl_avnd_task_hdl = 0;
@@ -547,6 +549,7 @@ void avnd_main_process(void) {
   AVND_EVT *evt;
   SaAisErrorT result = SA_AIS_OK;
   SaAisErrorT rc = SA_AIS_OK;
+  int counter = 0;
 
   TRACE_ENTER();
 
@@ -564,6 +567,13 @@ void avnd_main_process(void) {
     goto done;
   }
   ImmReader::imm_reader_thread_create();
+  while (imm_reader_thread_ready == false && counter < 50) {
+    osaf_nanosleep(&kHundredMilliseconds);
+    counter++;
+  }
+  osafassert(imm_reader_thread_ready);
+  LOG_NO("imm_reader_thread is up and in ready state");
+
   mbx_fd = ncs_ipc_get_sel_obj(&avnd_cb->mbx);
   fds[FD_MBX].fd = mbx_fd.rmv_obj;
   fds[FD_MBX].events = POLLIN;
-- 
2.17.1



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to