conf: route service conditions through one owner primitive

A service's condition was computed with mkcond() at each of the six
sites that assert or clear it, and svc_find_by_cond() reimplemented
the reverse lookup a seventh time.  maybe_clear_cond() had its own
scan for another service supplying the same condition.

svc_cond_owner() answers who owns a condition, svc_cond_nth() walks
the conditions a service owns, and svc_cond_set()/svc_cond_clear()
apply to all of them.  svc_find_by_cond() becomes a wrapper, and
maybe_clear_cond() keeps its rule per condition rather than for the
one it used to compute.

The provides[] storage lands here unused, since svc_cond_nth() reads
num_provides.  Nothing sets it yet, so a service still owns exactly
its own pid/<ident> and there is no functional change.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2026-08-05 17:57:57 +02:00
1 parent 4299ce8839
commit 22fbb408eb
7 files changed
+129 -36

No files matched your search

+8
View File
@@ -102,6 +102,7 @@ typedef enum {
#define MAX_COND_LEN (MAX_ARG_LEN * 3)
#define MAX_USER_LEN 16
#define MAX_NUM_SUPGROUPS 4
#define MAX_NUM_PROVIDES 4
#define MAX_NUM_FDS 64 /* Max number of I/O plugins */
#define MAX_NUM_SVC_ARGS 64
@@ -151,6 +152,10 @@ typedef struct svc {
svc_block_t block; /* Reason that this service is currently stopped */
char cond[MAX_COND_LEN];
/* Conditions this service asserts on top of its own pid/<ident> */
char provides[MAX_NUM_PROVIDES][MAX_COND_LEN];
int num_provides;
/* Instance specifics */
int job; /* For internal use only, canonical ref is NAME:ID */
char name[MAX_ARG_LEN];
@@ -266,6 +271,9 @@ svc_t *svc_find (char *name, char *id);
svc_t *svc_find_by_str (const char *str);
svc_t *svc_find_by_pid (pid_t pid);
svc_t *svc_find_by_cond (const char *cond);
svc_t *svc_cond_owner (const char *cond, svc_t *skip);
const char *svc_cond_nth (svc_t *svc, int i, char *buf, size_t len);
void svc_provides_reset (void);
svc_t *svc_find_by_jobid (int job, char *id);
svc_t *svc_find_by_tty (char *dev);
svc_t *svc_find_by_pidfile (char *fn);