static gboolean check_target_connections (UfoTaskGraph *graph, UfoNode *target, guint n_inputs, GError **error) { GList *predecessors; GList *it; guint16 connection_bitmap; guint16 mask; gboolean result = TRUE; if (n_inputs == 0) return TRUE; predecessors = ufo_graph_get_predecessors (UFO_GRAPH (graph), target); connection_bitmap = 0; /* Check all edges and enable bit number for edge label */ g_list_for (predecessors, it) { gpointer label; gint input; label = ufo_graph_get_edge_label (UFO_GRAPH (graph), UFO_NODE (it->data), target); input = GPOINTER_TO_INT (label); g_assert (input >= 0 && input < 16); connection_bitmap |= 1 << input; }
static GHashTable * build_task_groups (UfoBaseScheduler *scheduler, UfoTaskGraph *graph, UfoResources *resources, GList *nodes) { GHashTable *tasks_to_groups; GList *it; tasks_to_groups = g_hash_table_new (g_direct_hash, g_direct_equal); /* Create a group with a single member for each node */ g_list_for (nodes, it) { TaskGroup *group; UfoNode *task; UfoNode *node; task = UFO_NODE (it->data); group = g_new0 (TaskGroup, 1); group->context = ufo_resources_get_context (resources); group->parents = NULL; group->tasks = g_list_append (NULL, it->data); group->queue = ufo_two_way_queue_new (NULL); group->is_leaf = ufo_graph_get_num_successors (UFO_GRAPH (graph), task) == 0; if (ufo_task_get_mode (UFO_TASK (task)) & UFO_TASK_MODE_SHARE_DATA) { group->mode = TASK_GROUP_SHARED; } else { group->mode = TASK_GROUP_ROUND_ROBIN; } node = ufo_node_new (group); g_hash_table_insert (tasks_to_groups, it->data, node); }
static void handle_stream_json (UfoDaemon *daemon, UfoMessage *msg) { UfoDaemonPrivate *priv = UFO_DAEMON_GET_PRIVATE (daemon); gchar *json; GList *roots; GList *leaves; UfoNode *first; UfoNode *last; GError *error = NULL; json = read_json (daemon, msg); // send ack UfoMessage *response = ufo_message_new (UFO_MESSAGE_ACK, 0); ufo_messenger_send_blocking (priv->msger, response, NULL); ufo_message_free (response); /* Setup local task graph */ priv->task_graph = UFO_TASK_GRAPH (ufo_task_graph_new ()); ufo_task_graph_read_from_data (priv->task_graph, priv->manager, json, &error); #ifdef DEBUG ufo_graph_dump_dot (UFO_GRAPH (priv->task_graph), "task_graph_received.dot"); #endif if (error != NULL) { g_printerr ("%s\n", error->message); /* Send error to master */ return; } roots = ufo_graph_get_roots (UFO_GRAPH (priv->task_graph)); g_assert (g_list_length (roots) == 1); leaves = ufo_graph_get_leaves (UFO_GRAPH (priv->task_graph)); g_assert (g_list_length (leaves) == 1); first = UFO_NODE (g_list_nth_data (roots, 0)); last = UFO_NODE (g_list_nth_data (leaves, 0)); first = remove_dummy_if_present (UFO_GRAPH (priv->task_graph), first); priv->input_task = ufo_input_task_new (); priv->output_task = ufo_output_task_new (2); ufo_graph_connect_nodes (UFO_GRAPH (priv->task_graph), priv->input_task, first, GINT_TO_POINTER (0)); ufo_graph_connect_nodes (UFO_GRAPH (priv->task_graph), last, priv->output_task, GINT_TO_POINTER (0)); priv->scheduler_thread = g_thread_create ((GThreadFunc) run_scheduler, daemon, TRUE, NULL); g_free (json); }