diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2020-11-30 13:08:04 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska-skaware@skarnet.org> | 2020-11-30 13:08:04 +0000 |
| commit | ba3bcbb86ea0177349bcd021559347248d6ab10a (patch) | |
| tree | 23d8be4d59a1639ebea301fb2caf39b8b1ed0e27 /src/serverlib/s6rc_graph_closure.c | |
| parent | 79cb9644f99f056641f4c145da6e7ca63b333b80 (diff) | |
| download | s6-rc-ba3bcbb86ea0177349bcd021559347248d6ab10a.tar.gz | |
Stash temporary changes. Does not build; is not intended to.
Diffstat (limited to 'src/serverlib/s6rc_graph_closure.c')
| -rw-r--r-- | src/serverlib/s6rc_graph_closure.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/serverlib/s6rc_graph_closure.c b/src/serverlib/s6rc_graph_closure.c new file mode 100644 index 0000000..7c3a8f9 --- /dev/null +++ b/src/serverlib/s6rc_graph_closure.c @@ -0,0 +1,40 @@ +/* ISC license. */ + +#include <string.h> +#include <skalibs/bitarray.h> +#include <s6-rc/s6rc-db.h> +#include <s6-rc/s6rc-utils.h> + +typedef struct recinfo_s recinfo_t, *recinfo_t_ref ; +struct recinfo_s +{ + s6rc_db_t const *db ; + unsigned int n ; + unsigned char *bits ; + unsigned char *mark ; + unsigned char mask ; + unsigned char h : 1 ; +} ; + +static void s6rc_graph_closure_rec (recinfo_t *recinfo, unsigned int i) +{ + if (!bitarray_peek(recinfo->mark, i)) + { + unsigned int j = recinfo->db->services[i].ndeps[recinfo->h] ; + bitarray_set(recinfo->mark, i) ; + while (j--) s6rc_graph_closure_rec(recinfo, recinfo->db->deps[recinfo->h * recinfo->db->ndeps + recinfo->db->services[i].deps[recinfo->h] + j]) ; + recinfo->bits[i] |= recinfo->mask ; + } +} + +void s6rc_graph_closure (s6rc_db_t const *db, unsigned char *bits, unsigned int bitno, int h) +{ + unsigned int n = db->nshort + db->nlong ; + unsigned int m = bitarray_div8(n) ; + unsigned char mark[m] ; + recinfo_t info = { .db = db, .n = n, .bits = bits, .mark = mark, .mask = 1 << (bitno & 7), .h = !!h } ; + unsigned int i = n ; + memset(mark, 0, m) ; + while (i--) + if (bits[i] & info.mask) s6rc_graph_closure_rec(&info, i) ; +} |
