[PATCH v2 08/19] libmultipath: use shared_ptr for prioritizers
Martin Wilck <[email protected]>
| Newsgroups | dev.linux.lists.dm-devel |
|---|---|
| Message-ID | <[email protected]> |
Replace the hardcoded refcount handling in prio.c with shared_ptr. Signed-off-by: Martin Wilck <[email protected]> Reviewed-by: Benjamin Marzinski <[email protected]> --- libmultipath/prio.c | 47 +++++++++++++++++++-------------------------- libmultipath/prio.h | 1 - 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/libmultipath/prio.c b/libmultipath/prio.c index 24f825b..bf388e9 100644 --- a/libmultipath/prio.c +++ b/libmultipath/prio.c @@ -53,28 +53,11 @@ int init_prio(void) return 0; } -static struct prio * alloc_prio (void) -{ - struct prio *p; - - p = calloc(1, sizeof(struct prio)); - if (p) { - INIT_LIST_HEAD(&p->node); - p->refcount = 1; - } - return p; -} - -void free_prio (struct prio * p) +void free_prio(void *ptr) { + struct prio *p = ptr; if (!p) return; - p->refcount--; - if (p->refcount) { - condlog(4, "%s prioritizer refcount %d", - p->name, p->refcount); - return; - } condlog(3, "unloading %s prioritizer", p->name); list_del(&p->node); if (p->handle) { @@ -83,7 +66,18 @@ void free_prio (struct prio * p) p->name, dlerror()); } } - free(p); +} + +static struct prio *alloc_prio(void) +{ + struct prio *p; + + p = alloc_shared_ptr(sizeof(*p), free_prio); + if (p) { + memset(p, 0, sizeof(*p)); + INIT_LIST_HEAD(&p->node); + } + return p; } void cleanup_prio(void) @@ -91,9 +85,8 @@ void cleanup_prio(void) struct prio * prio_loop; struct prio * prio_temp; - list_for_each_entry_safe(prio_loop, prio_temp, &prioritizers, node) { - free_prio(prio_loop); - } + list_for_each_entry_safe(prio_loop, prio_temp, &prioritizers, node) + put_shared_ptr(prio_loop); } static struct prio *prio_lookup(const char *name) @@ -150,7 +143,7 @@ struct prio *add_prio (const char *name) list_add(&p->node, &prioritizers); return p; out: - free_prio(p); + put_shared_ptr(p); return NULL; } @@ -199,17 +192,17 @@ void prio_get(struct prio *dst, const char *name, const char *args) dst->getprio = src->getprio; dst->handle = NULL; - src->refcount++; + get_shared_ptr(src); } void prio_put (struct prio * dst) { - struct prio * src; + struct prio *src; if (!dst || !dst->getprio) return; src = prio_lookup(dst->name); memset(dst, 0x0, sizeof(struct prio)); - free_prio(src); + put_shared_ptr(src); } diff --git a/libmultipath/prio.h b/libmultipath/prio.h index 119b75f..7ff1a24 100644 --- a/libmultipath/prio.h +++ b/libmultipath/prio.h @@ -45,7 +45,6 @@ struct path; struct prio { void *handle; - int refcount; struct list_head node; char name[PRIO_NAME_LEN]; char args[PRIO_ARGS_LEN]; -- 2.54.0