Ejemplo n.º 1
0
void
ufo_daemon_stop (UfoDaemon *daemon)
{
    UfoDaemonPrivate *priv = UFO_DAEMON_GET_PRIVATE (daemon);
    g_mutex_lock (priv->startstop_lock);

    /* HACK we can't call _disconnect() as this has to be run from the
     * thread running the daemon which might be blocking on recv
     * - we thus send a TERMINATE message to that thread
     */

    UfoMessenger *tmp_msger;
#ifdef MPI
    tmp_msger = UFO_MESSENGER (ufo_mpi_messenger_new ());
#else
    tmp_msger = UFO_MESSENGER (ufo_zmq_messenger_new ());
#endif

    ufo_messenger_connect (tmp_msger, priv->listen_address, UFO_MESSENGER_CLIENT);
    UfoMessage *request = ufo_message_new (UFO_MESSAGE_TERMINATE, 0);
    ufo_messenger_send_blocking (tmp_msger, request, NULL);
    ufo_messenger_disconnect (tmp_msger);

    g_thread_join (priv->thread);

    g_mutex_lock (priv->stopped_lock);
    priv->has_stopped = TRUE;
    g_cond_signal (priv->stopped_cond);
    g_mutex_unlock (priv->stopped_lock);

    g_mutex_unlock (priv->startstop_lock);
}
Ejemplo n.º 2
0
/**
 * ufo_messenger_create:
 * @address: (transfer none) (type utf8): listen address for the messenger
 * @error: A #GError used to report errors during messenger creation
 *
 * Create a new #UfoMessenger basend on the PROTOCOL:// of the given @address
 *
 * Returns: (transfer full) (allow-none): A new #UfoMessenger or %NULL in case of
 * error.
 */
UfoMessenger *
ufo_messenger_create (const gchar *address, GError **error)
{
    UfoMessenger *msgr_out = NULL;
    GError *error_internal = NULL;
    GRegex *regex = g_regex_new ("^[a-z A-Z]+://[a-z A-Z 0-9 \\.]+:[0-9]{1,5}", \
                                 0, G_REGEX_MATCH_NOTEMPTY, &error_internal);
    if (error_internal) {
        g_propagate_error (error, error_internal);
        return NULL;
    }

    if (g_regex_match_all (regex, address, 0, NULL)) {
        gchar **protocol = g_strsplit (address, ":", 2);
        g_debug ("Creating messenger for `%s'", protocol[0]);

#ifdef WITH_ZMQ
        if (!g_strcmp0 (protocol[0], "tcp")) {
            msgr_out = UFO_MESSENGER (ufo_zmq_messenger_new ());
            goto done;
        }
#endif

#ifdef WITH_MPI
        if (!g_strcmp0 (protocol[0], "mpi")) {
            msgr_out = UFO_MESSENGER (ufo_mpi_messenger_new ());
            goto done;
        }
#endif

        g_set_error (error, UFO_MESSENGER_ERROR, UFO_MESSENGER_UNKNOWN_PROTOCOL,
                     "Don't know how to handle protocol '%s://'", protocol[0]);

#if defined(WITH_ZMQ) || (WITH_MPI)
done:
#endif
        g_strfreev (protocol);
    }
    else {
        g_set_error (error, UFO_MESSENGER_ERROR, UFO_MESSENGER_INVALID_ADDRESS,
                     "Given address has invalid format, expecting `<protocol>://<address | device>:<port>'.");
    }

    g_regex_unref (regex);
    return msgr_out;
}
Ejemplo n.º 3
0
UfoDaemon *
ufo_daemon_new (UfoConfig *config, gchar *listen_address)
{
    UfoDaemon *daemon;

    g_return_val_if_fail (listen_address != NULL, NULL);
    g_return_val_if_fail (config != NULL, NULL);

    daemon = UFO_DAEMON (g_object_new (UFO_TYPE_DAEMON, NULL));

    UfoDaemonPrivate *priv = UFO_DAEMON_GET_PRIVATE (daemon);
    priv->config = config;
    priv->listen_address = listen_address;
    priv->manager = ufo_plugin_manager_new (priv->config);
    priv->scheduler = ufo_scheduler_new (priv->config, NULL);
#ifdef MPI
    priv->msger = UFO_MESSENGER (ufo_mpi_messenger_new ());
#else
    priv->msger = UFO_MESSENGER (ufo_zmq_messenger_new ());
#endif
    return daemon;
}