Hi Lennart,

I have just found two things in imm_impl_set_sequence(). Please see my below
comments [Vu].

> +     if ( true == *(bool*)
> lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) {
> +             (void)immutil_saImmOiClassImplementerSet(immOiHandle,
> "OpenSafLogConfig");

[Vu] Not sure if calling immutil_ here is your intention or not? I think it
is not necessary, as you have the retry mechanism below.

> +             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)) {

[Vu] This condition checking for the IMM obj class "SafLogStreamConfig"
seems not correct. 
The checking should use for "OpenSafLogConfig" instead. (above code check
this)

> +             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;
> +             }
> +     }

Regards, Vu.

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