aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs6rc/s6rc_db_check_depcycles.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs6rc/s6rc_db_check_depcycles.c')
-rw-r--r--src/libs6rc/s6rc_db_check_depcycles.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/libs6rc/s6rc_db_check_depcycles.c b/src/libs6rc/s6rc_db_check_depcycles.c
index 13dcf7b..db6ed6e 100644
--- a/src/libs6rc/s6rc_db_check_depcycles.c
+++ b/src/libs6rc/s6rc_db_check_depcycles.c
@@ -1,6 +1,7 @@
/* ISC license. */
#include <skalibs/uint32.h>
+#include <skalibs/diuint32.h>
#include <skalibs/bitarray.h>
#include <skalibs/bytestr.h>
#include <s6-rc/s6rc-db.h>
@@ -9,22 +10,22 @@ typedef struct recinfo_s recinfo_t, *recinfo_t_ref ;
struct recinfo_s
{
s6rc_db_t const *db ;
- unsigned int n ;
+ uint32 n ;
unsigned char *gray ;
unsigned char *black ;
unsigned char h : 1 ;
} ;
-static unsigned int s6rc_db_checknocycle_rec (recinfo_t *recinfo, unsigned int i)
+static uint32 s6rc_db_checknocycle_rec (recinfo_t *recinfo, uint32 i)
{
if (!bitarray_peek(recinfo->black, i))
{
- unsigned int j = recinfo->db->services[i].ndeps[recinfo->h] ;
+ uint32 j = recinfo->db->services[i].ndeps[recinfo->h] ;
if (bitarray_peek(recinfo->gray, i)) return i ;
bitarray_set(recinfo->gray, i) ;
while (j--)
{
- register unsigned int r = s6rc_db_checknocycle_rec(recinfo, recinfo->db->deps[recinfo->h * recinfo->db->ndeps + recinfo->db->services[i].deps[recinfo->h] + j]) ;
+ register uint32 r = s6rc_db_checknocycle_rec(recinfo, recinfo->db->deps[recinfo->h * recinfo->db->ndeps + recinfo->db->services[i].deps[recinfo->h] + j]) ;
if (r < recinfo->n) return r ;
}
bitarray_set(recinfo->black, i) ;
@@ -32,19 +33,24 @@ static unsigned int s6rc_db_checknocycle_rec (recinfo_t *recinfo, unsigned int i
return recinfo->n ;
}
-unsigned int s6rc_db_check_depcycles (s6rc_db_t const *db, int h, unsigned int *problem)
+int s6rc_db_check_depcycles (s6rc_db_t const *db, int h, diuint32 *problem)
{
- unsigned int n = db->nshort + db->nlong ;
+ uint32 n = db->nshort + db->nlong ;
+ uint32 i = n ;
unsigned char gray[bitarray_div8(n)] ;
unsigned char black[bitarray_div8(n)] ;
recinfo_t info = { .db = db, .n = n, .gray = gray, .black = black, .h = !!h } ;
- unsigned int i = n ;
byte_zero(gray, bitarray_div8(n)) ;
byte_zero(black, bitarray_div8(n)) ;
while (i--)
{
- register unsigned int r = s6rc_db_checknocycle_rec(&info, i) ;
- if (r < n) return (*problem = r, i) ;
+ register uint32 r = s6rc_db_checknocycle_rec(&info, i) ;
+ if (r < n)
+ {
+ problem->left = i ;
+ problem->right = r ;
+ return 1 ;
+ }
}
- return n ;
+ return 0 ;
}