osaf/services/saf/logsv/lgs/lgs.h        |    8 +-
 osaf/services/saf/logsv/lgs/lgs_amf.c    |   29 +--
 osaf/services/saf/logsv/lgs/lgs_config.c |   61 +-----
 osaf/services/saf/logsv/lgs/lgs_evt.c    |    5 +-
 osaf/services/saf/logsv/lgs/lgs_imm.c    |  323 +++++++++++++++++-------------
 osaf/services/saf/logsv/lgs/lgs_main.c   |   88 +-------
 6 files changed, 210 insertions(+), 304 deletions(-)


Fix in existing code to prevent possible use of imm OI handle in
two threads at the same time. Also protecting usage of global variable
for storing this handle and a selection object in some situations.
Note: This must be seen as a temporary fix for this problem. Has to
be replaced by better threaded handling of OI. See #1531 and #1609

diff --git a/osaf/services/saf/logsv/lgs/lgs.h 
b/osaf/services/saf/logsv/lgs/lgs.h
--- a/osaf/services/saf/logsv/lgs/lgs.h
+++ b/osaf/services/saf/logsv/lgs/lgs.h
@@ -93,6 +93,7 @@ extern uint32_t mbox_msgs[NCS_IPC_PRIORI
 extern bool mbox_full[NCS_IPC_PRIORITY_MAX];
 extern uint32_t mbox_low[NCS_IPC_PRIORITY_MAX];
 extern pthread_mutex_t lgs_mbox_init_mutex;
+extern pthread_mutex_t lgs_OI_init_mutex;
 
 extern uint32_t lgs_configure_mailbox(void);
 
@@ -105,12 +106,15 @@ extern uint32_t lgs_mds_msg_send(lgs_cb_
                              MDS_DEST *dest, MDS_SYNC_SND_CTXT *mds_ctxt, 
MDS_SEND_PRIORITY_TYPE prio);
 
 extern SaAisErrorT lgs_imm_create_configStream(lgs_cb_t *cb);
-extern void lgs_imm_impl_restore(lgs_cb_t *cb);
-extern SaAisErrorT lgs_imm_init_OI(lgs_cb_t *cb);
 extern void logRootDirectory_filemove(
                const char *new_logRootDirectory,
                const char *old_logRootDirectory,
                time_t *cur_time_in);
 extern void logDataGroupname_fileown(const char *new_logDataGroupname);
 
+extern void lgs_imm_impl_reinit_nonblocking(lgs_cb_t *cb);
+extern void lgs_imm_init_OI_handle(SaImmOiHandleT *immOiHandle,
+       SaSelectionObjectT *immSelectionObject);
+extern void lgs_imm_impl_set(SaImmOiHandleT immOiHandle);
+
 #endif   /* ifndef __LGS_H */
diff --git a/osaf/services/saf/logsv/lgs/lgs_amf.c 
b/osaf/services/saf/logsv/lgs/lgs_amf.c
--- a/osaf/services/saf/logsv/lgs/lgs_amf.c
+++ b/osaf/services/saf/logsv/lgs/lgs_amf.c
@@ -64,33 +64,8 @@ static SaAisErrorT amf_active_state_hand
                goto done;
        }
 
-       /* switch over, become implementer
-        */
-       immutilWrapperProfile.nTries = 250; /* LOG will be blocked until IMM 
responds */
-       immutilWrapperProfile.errorsAreFatal = 0;
-       if ((error = immutil_saImmOiImplementerSet(lgs_cb->immOiHandle, 
"safLogService"))
-                       != SA_AIS_OK) {
-               LOG_ER("saImmOiClassImplementerSet (safLogService) failed: %d", 
error);
-               goto done;
-       }
-       if ((error = immutil_saImmOiClassImplementerSet(lgs_cb->immOiHandle,
-                       "SaLogStreamConfig")) != SA_AIS_OK) {
-               LOG_ER("saImmOiClassImplementerSet (SaLogStreamConfig) failed: 
%d", error);
-               goto done;
-       }
-       /* Do this only if the log service configuration class exists */
-       if (*(bool*) lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) {
-               if ((error = 
immutil_saImmOiClassImplementerSet(cb->immOiHandle, "OpenSafLogConfig"))
-                               != SA_AIS_OK) {
-                       LOG_ER("saImmOiClassImplementerSet (OpenSafLogConfig) 
failed: %d", error);
-                       goto done;
-               }
-
-               /* Create a log service configuration runtime object if the
-                * configuration runtime class exist and no object exist
-                */
-               conf_runtime_obj_create(cb->immOiHandle);
-       }
+       lgs_imm_impl_set(cb->immOiHandle);
+       conf_runtime_obj_create(cb->immOiHandle);
 
        /* check existing streams */
        stream = log_stream_getnext_by_name(NULL);
diff --git a/osaf/services/saf/logsv/lgs/lgs_config.c 
b/osaf/services/saf/logsv/lgs/lgs_config.c
--- a/osaf/services/saf/logsv/lgs/lgs_config.c
+++ b/osaf/services/saf/logsv/lgs/lgs_config.c
@@ -1124,56 +1124,6 @@ static void read_log_config_environ_var_
        TRACE_LEAVE();
 }
 
-/**
- * Become class implementer for the SaLogStreamConfig class
- * If HA state is ACTIVE
- * 
- * @param immOiHandle[in]
- * @return -1 on error
- */
-static int config_class_impl_set(SaImmOiHandleT immOiHandle, SaAmfHAStateT 
ha_state)
-{
-       int rc = 0;
-       SaAisErrorT ais_rc = SA_AIS_OK;
-       struct ImmutilWrapperProfile immutilWrapperProfile_tmp;
-
-       TRACE_ENTER2("immOiHandle = %lld, ha_state = %d (1 = Active)",
-               immOiHandle, ha_state);
-
-       if (ha_state != SA_AMF_HA_ACTIVE) {
-               /* We are standby and cannot become implementer */
-               TRACE("HA state STANDBY");
-               TRACE_LEAVE();
-               return 0;
-       }
-       
-       /* Save immutil settings */
-       immutilWrapperProfile_tmp.errorsAreFatal = 
immutilWrapperProfile.errorsAreFatal;
-       immutilWrapperProfile_tmp.nTries = immutilWrapperProfile.nTries;
-
-       /* Allow missed sync of large data to complete */
-       immutilWrapperProfile.nTries = 250;
-       /* Do not assert on error */
-       immutilWrapperProfile.errorsAreFatal = 0;
-
-       ais_rc = immutil_saImmOiClassImplementerSet(immOiHandle, 
"OpenSafLogConfig");
-       if (ais_rc != SA_AIS_OK) {
-               /* immutil_saImmOiClassImplementerSet Fail
-                * Class may not exist
-                */
-               LOG_WA("%s: saImmOiClassImplementerSet Fail %s",__FUNCTION__,
-                       saf_error(ais_rc));
-               rc = -1;
-       }
-
-       /* Restore immutil settings */
-       immutilWrapperProfile.errorsAreFatal = 
immutilWrapperProfile_tmp.errorsAreFatal;
-       immutilWrapperProfile.nTries = immutilWrapperProfile_tmp.nTries;
-
-       TRACE_LEAVE();
-       return rc;
-}
-
 /******************************************************************************
  * Public functions for handling configuration information
  
******************************************************************************/
@@ -1184,23 +1134,16 @@ static int config_class_impl_set(SaImmOi
  */
 void lgs_cfg_init(SaImmOiHandleT immOiHandle, SaAmfHAStateT ha_state)
 {
-       int int_rc = 0;
-
        TRACE_ENTER2("immOiHandle = %lld", immOiHandle);
+       
        /* Initiate the default values for all parameters
         */
        init_default();
 
        /* Read configuration step 1
-        * Become class implementer for SaLogStreamConfig class
         * Read all values from the log service configuration object
         */
-       int_rc = config_class_impl_set(immOiHandle, ha_state);
-       if (int_rc != -1) {
-               read_logsv_config_obj_2();
-       } else {
-               TRACE("Failed to become class implementer. Config object not 
read");
-       }
+       read_logsv_config_obj_2();
 
        /* Read configuration step 2
         * Get configuration data from environment variables.
diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.c 
b/osaf/services/saf/logsv/lgs/lgs_evt.c
--- a/osaf/services/saf/logsv/lgs/lgs_evt.c
+++ b/osaf/services/saf/logsv/lgs/lgs_evt.c
@@ -522,9 +522,8 @@ static uint32_t proc_rda_cb_msg(lgsv_lgs
                        exit(EXIT_FAILURE);
                }
 
-               /* fail over, become implementer
-                * Declare implementership from a separate thread */
-               lgs_imm_impl_restore(lgs_cb);
+               /* fail over, become implementer */
+               lgs_imm_impl_set(lgs_cb->immOiHandle);
 
                /* Agent down list has to be processed first */
                lgs_process_lga_down_list();
diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.c 
b/osaf/services/saf/logsv/lgs/lgs_imm.c
--- a/osaf/services/saf/logsv/lgs/lgs_imm.c
+++ b/osaf/services/saf/logsv/lgs/lgs_imm.c
@@ -58,6 +58,11 @@
  * ----------------
  */
 
+/* Used for protecting global imm OI handle and selection object during
+ * initialize of OI
+ */
+pthread_mutex_t lgs_OI_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 /* Used for checkpointing time when files are closed */
 static time_t chkp_file_close_time = 0;
 
@@ -2739,114 +2744,14 @@ SaAisErrorT lgs_imm_create_configStream(
 }
 
 /**
- * Thread
- * Restore object and class implementer/applier. Wait max
- * 'max_waiting_time_ms'.
- * @param _cb
- * 
- * @return void*
- */
-static void *imm_impl_restore_thread(void *_cb)
-{
-       SaAisErrorT rc = SA_AIS_OK;
-       int msecs_waited;
-       lgs_cb_t *cb = (lgs_cb_t *)_cb;
-
-       TRACE_ENTER();
-
-       /* Become object implementer
-        */
-       msecs_waited = 0;
-       rc = saImmOiImplementerSet(cb->immOiHandle, implementerName);
-       while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST)) &&
-                       (msecs_waited < max_waiting_time_60s)) {
-               usleep(sleep_delay_ms * 1000);
-               msecs_waited += sleep_delay_ms;
-               rc = saImmOiImplementerSet(cb->immOiHandle, implementerName);
-       }
-       if (rc != SA_AIS_OK) {
-               LOG_ER("saImmOiImplementerSet failed %u", rc);
-               exit(EXIT_FAILURE);
-       }
-
-       /* Become class implementer for the SaLogStreamConfig
-        * Become class implementer for the OpenSafLogConfig class if it exists
-        */
-       if ( true == *(bool*) 
lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) {
-               (void)immutil_saImmOiClassImplementerSet(cb->immOiHandle, 
"OpenSafLogConfig");
-               msecs_waited = 0;
-               rc = saImmOiClassImplementerSet(cb->immOiHandle, 
"OpenSafLogConfig");
-               while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == 
SA_AIS_ERR_EXIST))
-                               && (msecs_waited < max_waiting_time_60s)) {
-                       usleep(sleep_delay_ms * 1000);
-                       msecs_waited += sleep_delay_ms;
-                       rc = saImmOiClassImplementerSet(cb->immOiHandle, 
"OpenSafLogConfig");
-               }
-               if (rc != SA_AIS_OK) {
-                       LOG_ER("saImmOiClassImplementerSet OpenSafLogConfig 
failed %u", rc);
-                       exit(EXIT_FAILURE);
-               }
-       }
-
-       msecs_waited = 0;
-       rc = saImmOiClassImplementerSet(cb->immOiHandle, "SaLogStreamConfig");
-       while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST))
-                       && (msecs_waited < max_waiting_time_60s)) {
-               usleep(sleep_delay_ms * 1000);
-               msecs_waited += sleep_delay_ms;
-               rc = saImmOiClassImplementerSet(cb->immOiHandle, 
"SaLogStreamConfig");
-       }
-       if (rc != SA_AIS_OK) {
-               LOG_ER("saImmOiClassImplementerSet SaLogStreamConfig failed 
%u", rc);
-               exit(EXIT_FAILURE);
-       }
-       
-       TRACE_LEAVE();
-       return NULL;
-}
-
-/**
- * Restore object and class implementer, non-blocking.
- * Remove: Become object and class implementer or applier, non-blocking.
- * @param cb
- */
-void lgs_imm_impl_restore(lgs_cb_t *cb)
-{
-       pthread_t thread;
-       pthread_attr_t attr;
-
-       TRACE_ENTER();
-
-       /* In active state: Become object implementer.
-        */
-       if (cb->ha_state == SA_AMF_HA_STANDBY) {
-               return;
-       }
-       
-
-       pthread_attr_init(&attr);
-       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
-       if (pthread_create(&thread, &attr, imm_impl_restore_thread, cb) != 0) {
-               LOG_ER("pthread_create FAILED: %s", strerror(errno));
-               exit(EXIT_FAILURE);
-       }
-       
-       pthread_attr_destroy(&attr);
-       
-       TRACE_LEAVE();
-}
-
-/**
  * Initialize the OI interface and get a selection object.
  * Become OI for safLogService if Active
  *
- * Wait max 'max_waiting_time_ms'.
- * @param cb
- * 
- * @return SaAisErrorT
+ * @param immOiHandle[out]
+ * @param immSelectionObject[out]
  */
-SaAisErrorT lgs_imm_init_OI(lgs_cb_t *cb)
+void lgs_imm_init_OI_handle(SaImmOiHandleT *immOiHandle,
+       SaSelectionObjectT *immSelectionObject)
 {
        SaAisErrorT rc;
        int msecs_waited;
@@ -2855,56 +2760,198 @@ SaAisErrorT lgs_imm_init_OI(lgs_cb_t *cb
 
        /* Initialize IMM OI service */
        msecs_waited = 0;
-       rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks, &immVersion);
+       rc = saImmOiInitialize_2(immOiHandle, &callbacks, &immVersion);
        while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_60s)) {
                usleep(sleep_delay_ms * 1000);
                msecs_waited += sleep_delay_ms;
-               rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks, 
&immVersion);
+               rc = saImmOiInitialize_2(immOiHandle, &callbacks, &immVersion);
        }
        if (rc != SA_AIS_OK) {
-               LOG_ER("saImmOiInitialize_2 Failed %u", rc);
-               return rc;
-       }
-       TRACE("%s: saImmOiInitialize_2() Done",__FUNCTION__);
-
-       /* If started as Active */
-       if (cb->ha_state == SA_AMF_HA_ACTIVE) {
-               /* Become Object Implementer for the log service */
-               msecs_waited = 0;
-               rc = saImmOiImplementerSet(cb->immOiHandle, implementerName);
-               while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == 
SA_AIS_ERR_EXIST)) &&
-                               (msecs_waited < max_waiting_time_60s)) {
-                       usleep(sleep_delay_ms * 1000);
-                       msecs_waited += sleep_delay_ms;
-                       rc = saImmOiImplementerSet(cb->immOiHandle, 
implementerName);
-               }
-               if (rc != SA_AIS_OK) {
-                       LOG_ER("saImmOiImplementerSet Failed %u", rc);
-                       exit(EXIT_FAILURE);
-               }
-               TRACE("%s: saImmOiImplementerSet() for %s Done",
-                       __FUNCTION__, implementerName);
-
-               /* Create the runtime object for showing the actual
-                * log server configuration
-                */
-               conf_runtime_obj_create(cb->immOiHandle);
+               lgs_exit("saImmOiInitialize_2 failed", 
SA_AMF_COMPONENT_RESTART);
        }
 
        /* Get selection object for event handling */
        msecs_waited = 0;
-       rc = saImmOiSelectionObjectGet(cb->immOiHandle, 
&cb->immSelectionObject);
+       rc = saImmOiSelectionObjectGet(*immOiHandle, immSelectionObject);
        while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_10s)) {
                usleep(sleep_delay_ms * 1000);
                msecs_waited += sleep_delay_ms;
-               rc = saImmOiSelectionObjectGet(cb->immOiHandle, 
&cb->immSelectionObject);
+               rc = saImmOiSelectionObjectGet(*immOiHandle, 
immSelectionObject);
        }
        if (rc != SA_AIS_OK) {
-               LOG_ER("saImmOiSelectionObjectGet failed %u", rc);
+               lgs_exit("saImmOiSelectionObjectGet failed", 
SA_AMF_COMPONENT_RESTART);
+       }
+
+       TRACE_LEAVE();
+}
+
+/**
+ * Does the sequence of setting an implementer name and class implementer
+ * 
+ * @param immOiHandle[in]
+ * @return SaAisErrorT
+ */
+static SaAisErrorT imm_impl_set_sequence(SaImmOiHandleT immOiHandle)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       int msecs_waited;
+
+       TRACE_ENTER();
+
+       /* Become object implementer
+        */
+       msecs_waited = 0;
+       rc = saImmOiImplementerSet(immOiHandle, implementerName);
+       while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_EXIST)) &&
+                       (msecs_waited < max_waiting_time_60s)) {
+               usleep(sleep_delay_ms * 1000);
+               msecs_waited += sleep_delay_ms;
+               rc = saImmOiImplementerSet(immOiHandle, implementerName);
+       }
+       if (rc != SA_AIS_OK) {
+               TRACE("saImmOiImplementerSet failed %s", saf_error(rc));
+               goto done;
+       }
+
+       /* Become class implementer for the SaLogStreamConfig
+        * Become class implementer for the OpenSafLogConfig class if it exists
+        */
+       if ( true == *(bool*) 
lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) {
+               (void)immutil_saImmOiClassImplementerSet(immOiHandle, 
"OpenSafLogConfig");
+               msecs_waited = 0;
+               rc = saImmOiClassImplementerSet(immOiHandle, 
"OpenSafLogConfig");
+               while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == 
SA_AIS_ERR_EXIST))
+                               && (msecs_waited < max_waiting_time_60s)) {
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       rc = saImmOiClassImplementerSet(immOiHandle, 
"OpenSafLogConfig");
+               }
+               if (rc != SA_AIS_OK) {
+                       TRACE("saImmOiClassImplementerSet OpenSafLogConfig 
failed %s", saf_error(rc));
+                       goto done;
+               }
+       }
+
+       if (*(bool*) lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) {
+               msecs_waited = 0;
+               rc = saImmOiClassImplementerSet(immOiHandle, 
"SaLogStreamConfig");
+               while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == 
SA_AIS_ERR_EXIST))
+                               && (msecs_waited < max_waiting_time_60s)) {
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       rc = saImmOiClassImplementerSet(immOiHandle, 
"SaLogStreamConfig");
+               }
+               if (rc != SA_AIS_OK) {
+                       TRACE("saImmOiClassImplementerSet SaLogStreamConfig 
failed %u", rc);
+                       goto done;
+               }
+       }
+       
+done:
+       return rc;
+       TRACE_LEAVE();
+}
+
+/**
+ * Set implementer name and become class implementer.
+ * This function will block until done.
+ *
+ * @param cb
+ */
+void lgs_imm_impl_set(SaImmOiHandleT immOiHandle)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+
+       TRACE_ENTER();
+
+       rc = imm_impl_set_sequence(immOiHandle);
+       if (rc != SA_AIS_OK) {
+               lgs_exit("Becoming OI implementer failed", 
SA_AMF_COMPONENT_RESTART);
+       }
+
+       TRACE_LEAVE();
+}
+
+/**
+ * Thread
+ * Restore object and class implementer/applier.
+ *
+ * @param _cb[in]
+ */
+static void *imm_impl_init_thread(void *_cb)
+{
+       lgs_cb_t *cb = (lgs_cb_t *)_cb;
+       SaSelectionObjectT immSelectionObject = 0;
+       SaImmOiHandleT immOiHandle = 0;
+       SaAisErrorT rc = SA_AIS_OK;
+
+       TRACE_ENTER();
+
+       /* Initialize handles and become implementer */
+       lgs_imm_init_OI_handle(&immOiHandle, &immSelectionObject);
+       rc = imm_impl_set_sequence(immOiHandle);
+       if (rc != SA_AIS_OK) {
+               lgs_exit("Becoming OI implementer failed", 
SA_AMF_COMPONENT_RESTART);
+       }
+
+       /* Store handle and selection object.
+        * Protect if the poll loop in main is released during the storage
+        * sequence.
+        */
+       osaf_mutex_lock_ordie(&lgs_OI_init_mutex);
+       cb->immSelectionObject = immSelectionObject;
+       cb->immOiHandle = immOiHandle;
+       osaf_mutex_unlock_ordie(&lgs_OI_init_mutex);
+
+       /* Activate the poll loop in main()
+        * This will reinstall IMM poll event handling
+        */
+       lgsv_lgs_evt_t *lgsv_evt;
+       lgsv_evt = calloc(1, sizeof(lgsv_lgs_evt_t));
+       osafassert(lgsv_evt);
+       lgsv_evt->evt_type = LGSV_EVT_NO_OP;
+       if (m_NCS_IPC_SEND(&lgs_mbx, lgsv_evt, LGS_IPC_PRIO_CTRL_MSGS) !=
+               NCSCC_RC_SUCCESS) {
+               LOG_WA("imm_reinit_thread failed to send IPC message to main 
thread");
+               /*
+                * Se no reason why this would happen. But if it does at least 
there
+                * is something in the syslog. The main thread should still 
pick up
+                * the new imm FD when there is a healthcheck, but it could take
+                *minutes.
+                */
+               free(lgsv_evt);
+       }
+
+       TRACE_LEAVE();
+       return NULL;
+}
+
+/**
+ * In a separate thread:
+ * Initiate IMM OI handle and selection object
+ * Create imm implementer for log IMM objects
+ * When complete:
+ * Store the new handle and selection object in the cb store.
+ * Activate the poll loop in main() by sending an empty mailbox message
+ *
+ * @param cb[out]
+ */
+void lgs_imm_impl_reinit_nonblocking(lgs_cb_t *cb)
+{
+       pthread_t thread;
+       pthread_attr_t attr;
+
+       TRACE_ENTER();
+
+       pthread_attr_init(&attr);
+       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+       if (pthread_create(&thread, &attr, imm_impl_init_thread, cb) != 0) {
+               LOG_ER("pthread_create FAILED: %s", strerror(errno));
                exit(EXIT_FAILURE);
        }
 
+       pthread_attr_destroy(&attr);
+
        TRACE_LEAVE();
-
-       return rc;
 }
diff --git a/osaf/services/saf/logsv/lgs/lgs_main.c 
b/osaf/services/saf/logsv/lgs/lgs_main.c
--- a/osaf/services/saf/logsv/lgs/lgs_main.c
+++ b/osaf/services/saf/logsv/lgs/lgs_main.c
@@ -227,14 +227,9 @@ static uint32_t log_initialize(void)
                goto done;
        }
 
-       /* Initialize IMM OI and get corresponding OI selection object
-        * Become OI for safLogService if Active 
-        * IMM OI handle and IMM selection object is saved in lgs_cb
-        */
-       if ((rc = lgs_imm_init_OI(lgs_cb)) != SA_AIS_OK) {
-               LOG_ER("lgs_imm_init FAILED");
-               goto done;
-       }
+       /* Initialize IMM OI handle and selection object */
+       lgs_imm_init_OI_handle(&lgs_cb->immOiHandle, 
&lgs_cb->immSelectionObject);
+
        TRACE("IMM init done: lgs_cb->immOiHandle = %lld", lgs_cb->immOiHandle);
 
        /* Initialize log configuration
@@ -325,6 +320,10 @@ static uint32_t log_initialize(void)
        }
 
        if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) {
+               /* Become OI. We will be blocked here until done */
+               lgs_imm_impl_set(lgs_cb->immOiHandle);
+               conf_runtime_obj_create(lgs_cb->immOiHandle);
+
                /* Create streams that has configuration objects and become
                 * class implementer for the SaLogStreamConfig class
                 */
@@ -353,72 +352,6 @@ done:
 }
 
 /**
- * Wait a while on IMM and initialize, sel obj get & implementer
- * set.
- * 
- * @param _cb
- * 
- * @return void*
- */
-static void *imm_reinit_thread(void *_cb)
-{
-       SaAisErrorT error;
-       lgs_cb_t *cb = (lgs_cb_t *)_cb;
-       lgsv_lgs_evt_t *lgsv_evt;
-
-       TRACE_ENTER();
-
-       if ((error = lgs_imm_init_OI(cb)) != SA_AIS_OK) {
-               LOG_ER("lgs_imm_init FAILED: %u", error);
-               exit(EXIT_FAILURE);
-       }
-
-       lgs_imm_impl_restore(cb);
-
-       /* Wake up the main thread so it discovers the new imm descriptor. */
-       lgsv_evt = calloc(1, sizeof(lgsv_lgs_evt_t));
-       osafassert(lgsv_evt);
-       lgsv_evt->evt_type = LGSV_EVT_NO_OP;
-       if (m_NCS_IPC_SEND(&lgs_mbx, lgsv_evt, LGS_IPC_PRIO_CTRL_MSGS) !=
-               NCSCC_RC_SUCCESS) {
-               LOG_WA("imm_reinit_thread failed to send IPC message to main 
thread");
-               /*
-                * Se no reason why thos would happen. But if it does at least 
there
-                * is something in the syslog. The main thread should still 
pick up
-                * the new imm FD when there is a healthcheck, but it could take
-                *minutes.
-                */
-               free(lgsv_evt);
-       }
-
-       TRACE_LEAVE();
-       return NULL;
-}
-
-/**
- * Start a background thread to do IMM reinitialization.
- * 
- * @param cb
- */
-static void imm_reinit_bg(lgs_cb_t *cb)
-{
-       pthread_t thread;
-       pthread_attr_t attr;
-       pthread_attr_init(&attr);
-       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-
-       TRACE_ENTER();
-       if (pthread_create(&thread, &attr, imm_reinit_thread, cb) != 0) {
-               LOG_ER("pthread_create FAILED: %s", strerror(errno));
-               exit(EXIT_FAILURE);
-       }
-       
-       pthread_attr_destroy(&attr);
-       
-       TRACE_LEAVE();
-}
-
-/**
  * The main routine for the lgs daemon.
  * @param argc
  * @param argv
@@ -457,6 +390,10 @@ int main(int argc, char *argv[])
 
        while (1) {
 
+               /* Protect since the reinit thread may be in the process of
+                * changing the values
+                */
+               osaf_mutex_lock_ordie(&lgs_OI_init_mutex);
                if (lgs_cb->immOiHandle != 0) {
                        fds[FD_IMM].fd = lgs_cb->immSelectionObject;
                        fds[FD_IMM].events = POLLIN;
@@ -464,6 +401,7 @@ int main(int argc, char *argv[])
                } else {
                        nfds = FD_IMM;
                }
+               osaf_mutex_unlock_ordie(&lgs_OI_init_mutex);
 
                int ret = poll(fds, nfds, -1);
 
@@ -538,7 +476,7 @@ int main(int argc, char *argv[])
                                lgs_cb->immOiHandle = 0;
 
                                /* Initiate IMM reinitializtion in the 
background */
-                               imm_reinit_bg(lgs_cb);
+                               lgs_imm_impl_reinit_nonblocking(lgs_cb);
                        } else if (error != SA_AIS_OK) {
                                LOG_ER("saImmOiDispatch FAILED: %u", error);
                                break;

------------------------------------------------------------------------------
Go from Idea to Many App Stores Faster with Intel(R) XDK
Give your users amazing mobile app experiences with Intel(R) XDK.
Use one codebase in this all-in-one HTML5 development environment.
Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs.
http://pubads.g.doubleclick.net/gampad/clk?id=254741911&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to