1 /* Licensed under LGPLv2+ - see LICENSE file for details */
8 #include <ccan/aga/aga.h>
12 void aga_init_graph_(struct aga_graph *g,
13 aga_first_edge_fn first_edge,
14 aga_next_edge_fn next_edge,
15 aga_edge_info_fn edge_info)
18 g->error = AGA_ERR_NONE;
20 g->first_edge = first_edge;
21 g->next_edge = next_edge;
22 g->edge_info = edge_info;
25 int aga_error(const struct aga_graph *g)
30 void aga_fail(struct aga_graph *g, int error)
35 int aga_start(struct aga_graph *g)
37 if (g->sequence & 1) /* Odd means someone's already running */
39 assert(g->error == 0);
40 /* FIXME: Want an atomic cmpxchg to make this thread safe */
45 bool aga_check_state(const struct aga_graph *g)
47 if (!(g->sequence & 1))
48 return false; /* No algo in progress */
50 return false; /* error state */
54 void aga_finish(struct aga_graph *g)
56 assert(g->sequence & 1);
57 g->error = AGA_ERR_NONE;
61 bool aga_node_needs_update(const struct aga_graph *g,
62 const struct aga_node *node)
64 return (node->sequence != g->sequence);
67 bool aga_update_node(const struct aga_graph *g, struct aga_node *node)
69 if (!aga_node_needs_update(g, node))
72 node->sequence = g->sequence;
76 const void *aga_first_edge(const struct aga_graph *g, const struct aga_node *n)
78 return g->first_edge(g, n);
81 const void *aga_next_edge(const struct aga_graph *g, const struct aga_node *n,
87 return g->next_edge(g, n, e);
90 int aga_edge_info(const struct aga_graph *g, const struct aga_node *n,
91 const void *e, struct aga_edge_info *ei)
97 rc = g->edge_info(g, n, e, ei);