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
