Tested Ack,
Mathi.

> -----Original Message-----
> From: Lennart Lund [mailto:[email protected]]
> Sent: Thursday, December 03, 2015 5:25 PM
> To: Mathivanan Naickan Palanivelu; [email protected]
> Cc: [email protected]
> Subject: [PATCH 1 of 1] lgs: Correcting OI initializing thread handling 
> [#1527]
> 
>  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