Exemple #1
0
int main(int argc, char **argv)
{
    state_t *app = calloc(1, sizeof(state_t));
    app->lcmurl = strdup(get_default_lcm_url());

    if (0 != lcm_parse_url(app->lcmurl, &app->mc_addr, &app->mc_port)) {
        fprintf (stderr, "invalid URL [%s]\n", app->lcmurl);
        return 1;
    }

    struct in_addr ia;
    ia = app->mc_addr;
    printf("MC group: %s port: %d\n", inet_ntoa(ia), app->mc_port);
    if(0 != setup_socket(app)) {
        return 1;
    }

    app->hosts = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, 
            (GDestroyNotify)host_destroy);

    app->mainloop = g_main_loop_new(NULL, FALSE);

    app->ioc = g_io_channel_unix_new(app->recvfd);
    app->sid = g_io_add_watch(app->ioc, G_IO_IN, (GIOFunc)on_message_ready, 
            app);

    g_timeout_add(100, on_timer, app);
    app->report_interval_usec = DEFAULT_REPORT_INTERVAL_SECONDS * 1000000;
    app->next_report_utime = timestamp_now() + 1000000;

    bot_signal_pipe_glib_quit_on_kill(app->mainloop);
    g_main_loop_run(app->mainloop);

    g_io_channel_unref(app->ioc);
    g_source_remove(app->sid);

    shutdown(app->recvfd, SHUT_RDWR);

    g_hash_table_destroy(app->hosts);
    free(app->lcmurl);
    free(app);
    return 0;
}
Exemple #2
0
lcm_t * 
lcm_create (const char *url)
{
    if (!g_thread_supported ()) g_thread_init (NULL);

#ifdef WIN32
	WSADATA	wsd;
    int status = WSAStartup ( MAKEWORD ( 2, 0 ), &wsd );
    if ( status )
    {
		return NULL;
    }
#endif

    char * provider_str = NULL;
    char * network = NULL;
    GHashTable * args = g_hash_table_new_full (g_str_hash, g_str_equal,
            free, free);
    GPtrArray * providers = g_ptr_array_new ();
    lcm_t *lcm = NULL;

    // initialize the list of providers
    lcm_udpm_provider_init (providers);
    lcm_logprov_provider_init (providers);
    lcm_tcpq_provider_init (providers);
    if (providers->len == 0) {
        fprintf (stderr, "Error: no LCM providers found\n");
        goto fail;
    }

    if (!url || !strlen(url)) 
        url = getenv ("LCM_DEFAULT_URL");
    if (!url || !strlen(url))
        url = LCM_DEFAULT_URL;

    if (0 != lcm_parse_url (url, &provider_str, &network, args)) {
        fprintf (stderr, "%s:%d -- invalid URL [%s]\n",
                __FILE__, __LINE__, url);
        goto fail;
    }

    lcm_provider_info_t * info = NULL;
    /* Find a matching provider */
    for (unsigned int i = 0; i < providers->len; i++) {
        lcm_provider_info_t * pinfo = (lcm_provider_info_t *) g_ptr_array_index (providers, i);
        if (!strcmp (pinfo->name, provider_str)) {
            info = pinfo;
            break;
        }
    }
    if (!info) {
        fprintf (stderr, "Error: LCM provider \"%s\" not found\n",
                provider_str);
        g_ptr_array_free (providers, TRUE);
        free (provider_str);
        free (network);
        g_hash_table_destroy (args);
        return NULL;
    }

    lcm = (lcm_t *) calloc (1, sizeof (lcm_t));

    lcm->vtable = info->vtable;
    lcm->handlers_all = g_ptr_array_new();
    lcm->handlers_map = g_hash_table_new (g_str_hash, g_str_equal);

    g_static_rec_mutex_init (&lcm->mutex);
    g_static_rec_mutex_init (&lcm->handle_mutex);

    lcm->provider = info->vtable->create (lcm, network, args);
    lcm->in_handle = 0;

    free (provider_str);
    free (network);
    g_ptr_array_free (providers, TRUE);
    g_hash_table_destroy (args);

    if (!lcm->provider) {
        lcm_destroy (lcm);
        return NULL;
    }

    lcm->default_max_num_queued_messages = 30;

    return lcm;

fail:
    free (provider_str);
    free (network);
    if (args)
        g_hash_table_destroy (args);
    if (providers)
        g_ptr_array_free (providers, TRUE);
//    if (lcm)
//        lcm_destroy (lcm);
    return NULL;
}