From 9614bb06ef60eea3ab6dd5d35f970ba60ef3fc63 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 16 Apr 2018 21:38:24 +0200 Subject: [PATCH] machine-image: add proper refcounting --- src/shared/machine-image.c | 17 +++++++++++++++++ src/shared/machine-image.h | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/src/shared/machine-image.c b/src/shared/machine-image.c index 274d540133..36861d93fc 100644 --- a/src/shared/machine-image.c +++ b/src/shared/machine-image.c @@ -61,6 +61,12 @@ Image *image_unref(Image *i) { if (!i) return NULL; + assert(i->n_ref > 0); + i->n_ref--; + + if (i->n_ref > 0) + return NULL; + free(i->name); free(i->path); @@ -71,6 +77,16 @@ Image *image_unref(Image *i) { return mfree(i); } +Image *image_ref(Image *i) { + if (!i) + return NULL; + + assert(i->n_ref > 0); + i->n_ref++; + + return i; +} + static char **image_settings_path(Image *image) { _cleanup_strv_free_ char **l = NULL; const char *fn, *s; @@ -131,6 +147,7 @@ static int image_new( if (!i) return -ENOMEM; + i->n_ref = 1; i->type = t; i->read_only = read_only; i->crtime = crtime; diff --git a/src/shared/machine-image.h b/src/shared/machine-image.h index f92e744f45..899268dbd1 100644 --- a/src/shared/machine-image.h +++ b/src/shared/machine-image.h @@ -34,6 +34,8 @@ typedef enum ImageType { } ImageType; typedef struct Image { + unsigned n_ref; + ImageType type; char *name; char *path; @@ -58,6 +60,8 @@ typedef struct Image { } Image; Image *image_unref(Image *i); +Image *image_ref(Image *i); + static inline Hashmap* image_hashmap_free(Hashmap *map) { return hashmap_free_with_destructor(map, image_unref); } -- 2.25.1