diff --git a/include/villas/signal.h b/include/villas/signal.h index ebe1f87da..8769803db 100644 --- a/include/villas/signal.h +++ b/include/villas/signal.h @@ -25,6 +25,8 @@ #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -47,16 +49,24 @@ enum signal_format { * This data structure contains meta data about samples values in struct sample::data */ struct signal { - char *name; /**< The name of the signal. */ - char *unit; /**< The unit of the signal. */ + char *name; /**< The name of the signal. */ + char *unit; /**< The unit of the signal. */ int enabled; + atomic_int refcnt; /**< Reference counter. */ + enum signal_format format; }; int signal_init(struct signal *s); +/** Increase reference counter. */ +int signal_get(struct signal *s); + +/** Decrease reference counter. */ +int signal_put(struct signal *s); + int signal_init_from_mapping(struct signal *s, const struct mapping_entry *me, unsigned index); int signal_destroy(struct signal *s); diff --git a/lib/signal.c b/lib/signal.c index 773ffd917..92a690ce0 100644 --- a/lib/signal.c +++ b/lib/signal.c @@ -30,8 +30,12 @@ int signal_init(struct signal *s) { + s->name = NULL; + s->unit = NULL; s->format = SIGNAL_FORMAT_UNKNOWN; + s->refcnt = ATOMIC_VAR_INIT(1); + return 0; } @@ -95,6 +99,22 @@ int signal_destroy(struct signal *s) return 0; } +int signal_get(struct signal *s) +{ + return atomic_fetch_add(&s->refcnt, 1) + 1; +} + +int signal_put(struct signal *s) +{ + int prev = atomic_fetch_sub(&s->refcnt, 1); + + /* Did we had the last reference? */ + if (prev == 1) + signal_destroy(s); + + return prev - 1; +} + int signal_parse(struct signal *s, json_t *cfg) { int ret;