Replace the hardcoded refcount handling in prio.c with shared_ptr.
Signed-off-by: Martin Wilck <[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