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); }
/** * 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; }
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; }