Esempio n. 1
0
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);
}
Esempio n. 2
0
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));
}