void fwd_destroy(qeo_factory_t *factory) { lock(&factory->mutex); if (true == factory->fwd.rqst_pending) { /* Wait untill the fwd request is finished before continuing. */ qeo_log_i("waiting for the fwd request to finish."); pthread_cond_wait(&factory->fwd.wait_rqst_finished, &factory->mutex); } unlock(&factory->mutex); if (factory->flags.is_forwarder) { fwd_server_unregister(factory); if (FWD_STATE_ENABLED == factory->fwd.u.server.state) { if (QEO_OK != fwd_server_instance_remove(factory)) { qeo_log_e("failed to remove instance from forwarder topic"); } } if (NULL != factory->fwd.u.server.writer) { qeocore_writer_close(factory->fwd.u.server.writer); } } if (NULL != factory->fwd.reader) { qeocore_reader_close(factory->fwd.reader); } if (NULL != factory->fwd.timer) { DDS_Timer_delete(factory->fwd.timer); } pthread_cond_destroy(&factory->fwd.wait_rqst_finished); fwd_locator_destroy(factory); }
static void client_state_machine_eval_ul(qeo_factory_t *factory, client_state_events_t event, qeo_mgmt_client_locator_t *locator, int64_t device_id) { qeo_log_i("received event %s in state %s", client_event_to_str(event), client_state_to_str(factory->fwd.u.client.state)); switch (factory->fwd.u.client.state) { case FWD_CLIENT_STATE_INIT: switch (event) { case CLIENT_EVENT_START: factory->fwd.device_id = -1; if (QEO_OK == client_start_timer(factory, 1)) { factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT; } if (QEO_OK != qeocore_reader_enable(factory->fwd.reader)) { qeo_log_e("error enabling forwarder topic reader"); } if (QEO_OK != fwd_get_list(factory)) { qeo_log_e("error requesting list of forwarders"); } break; default: qeo_log_e("unexpected event %s in state %s", client_event_to_str(event), client_state_to_str(factory->fwd.u.client.state)); break; } break; case FWD_CLIENT_STATE_WAIT: switch (event) { case CLIENT_EVENT_TIMEOUT: if (QEO_OK == client_start_timer(factory, 0)) { factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT; } if (QEO_OK != fwd_get_list(factory)) { qeo_log_e("error requesting list of forwarders"); } break; case CLIENT_EVENT_LOC_SRV_DATA_RECEIVED: fwd_client_reconfig(factory, locator, device_id); factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT_READER; break; case CLIENT_EVENT_FWD_DATA_RECEIVED: fwd_client_reconfig(factory, locator, device_id); DDS_Timer_stop(factory->fwd.timer); factory->fwd.u.client.state = FWD_CLIENT_STATE_READY; break; default: qeo_log_e("unexpected event %s in state %s", client_event_to_str(event), client_state_to_str(factory->fwd.u.client.state)); break; } break; case FWD_CLIENT_STATE_WAIT_READER: switch (event) { case CLIENT_EVENT_TIMEOUT: if (QEO_OK == client_start_timer(factory, 0)) { factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT; } fwd_locator_destroy(factory); factory->fwd.device_id = -1; if (QEO_OK != fwd_get_list(factory)) { qeo_log_e("error requesting list of forwarders"); } break; case CLIENT_EVENT_FWD_DATA_RECEIVED: DDS_Timer_stop(factory->fwd.timer); factory->fwd.u.client.state = FWD_CLIENT_STATE_READY; if (factory->fwd.device_id != device_id) { fwd_client_reconfig(factory, locator, device_id); } break; default: qeo_log_e("unexpected event %s in state %s", client_event_to_str(event), client_state_to_str(factory->fwd.u.client.state)); break; } break; case FWD_CLIENT_STATE_READY: switch (event) { case CLIENT_EVENT_FWD_DATA_REMOVED: if (QEO_OK == client_start_timer(factory, 1)) { factory->fwd.u.client.state = FWD_CLIENT_STATE_WAIT; } fwd_locator_destroy(factory); factory->fwd.device_id = -1; if (QEO_OK != fwd_get_list(factory)) { qeo_log_e("error requesting list of forwarders"); } break; default: qeo_log_e("unexpected event %s in state %s", client_event_to_str(event), client_state_to_str(factory->fwd.u.client.state)); break; } break; } qeo_log_i("new state %s", client_state_to_str(factory->fwd.u.client.state)); }