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)
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);
61 bool aga_update_node(const struct aga_graph *g, struct aga_node *node)
63 if (node->sequence == g->sequence)
66 node->sequence = g->sequence;
70 const void *aga_first_edge(const struct aga_graph *g, const struct aga_node *n)
72 return g->first_edge(g, n);
75 const void *aga_next_edge(const struct aga_graph *g, const struct aga_node *n,
81 return g->next_edge(g, n, e);
84 int aga_edge_info(const struct aga_graph *g, const struct aga_node *n,
85 const void *e, struct aga_edge_info *ei)
90 rc = g->edge_info(g, n, e, ei);