From: Mathieu Desnoyers Date: Wed, 22 Jun 2016 20:37:47 +0000 (-0400) Subject: Fix: add missing destroy functions to queues/stack APIs X-Git-Tag: v0.8.10~11 X-Git-Url: http://git.liburcu.org/?p=userspace-rcu.git;a=commitdiff_plain;h=93aee570e96c48843659caa12667ff7157734532 Fix: add missing destroy functions to queues/stack APIs Queues and stack APIs that invoke pthread_mutex_init() should have a "destroy" counterpart which calls pthread_mutex_destroy(), ortherwise this causes small memory leaks on platforms where pthread_mutex_init performs memory allocation. Signed-off-by: Mathieu Desnoyers --- diff --git a/lfstack.c b/lfstack.c index db2c2cf..30f1daa 100644 --- a/lfstack.c +++ b/lfstack.c @@ -40,6 +40,11 @@ void cds_lfs_init(struct cds_lfs_stack *s) _cds_lfs_init(s); } +void cds_lfs_destroy(struct cds_lfs_stack *s) +{ + _cds_lfs_destroy(s); +} + bool cds_lfs_empty(struct cds_lfs_stack *s) { return _cds_lfs_empty(s); diff --git a/urcu/lfstack.h b/urcu/lfstack.h index bd17ee6..d5bc775 100644 --- a/urcu/lfstack.h +++ b/urcu/lfstack.h @@ -81,6 +81,7 @@ struct cds_lfs_stack { #define cds_lfs_node_init _cds_lfs_node_init #define cds_lfs_init _cds_lfs_init +#define cds_lfs_destroy _cds_lfs_destroy #define __cds_lfs_init ___cds_lfs_init #define cds_lfs_empty _cds_lfs_empty #define cds_lfs_push _cds_lfs_push @@ -105,10 +106,17 @@ struct cds_lfs_stack { extern void cds_lfs_node_init(struct cds_lfs_node *node); /* - * cds_lfs_init: initialize lock-free stack. + * cds_lfs_init: initialize lock-free stack (with locking). Pair with + * cds_lfs_destroy(). */ extern void cds_lfs_init(struct cds_lfs_stack *s); +/* + * cds_lfs_destroy: destroy lock-free stack (with lock). Pair with + * cds_lfs_init(). + */ +extern void cds_lfs_destroy(struct cds_lfs_stack *s); + /* * cds_lfs_empty: return whether lock-free stack is empty. * diff --git a/urcu/static/lfstack.h b/urcu/static/lfstack.h index b49eb20..967071a 100644 --- a/urcu/static/lfstack.h +++ b/urcu/static/lfstack.h @@ -66,7 +66,8 @@ void _cds_lfs_node_init(struct cds_lfs_node *node) } /* - * cds_lfs_init: initialize lock-free stack. + * cds_lfs_init: initialize lock-free stack (with lock). Pair with + * cds_lfs_destroy(). */ static inline void _cds_lfs_init(struct cds_lfs_stack *s) @@ -78,6 +79,17 @@ void _cds_lfs_init(struct cds_lfs_stack *s) assert(!ret); } +/* + * cds_lfs_destroy: destroy lock-free stack (with lock). Pair with + * cds_lfs_init(). + */ +static inline +void _cds_lfs_destroy(struct cds_lfs_stack *s) +{ + int ret = pthread_mutex_destroy(&s->lock); + assert(!ret); +} + static inline bool ___cds_lfs_empty_head(struct cds_lfs_head *head) { diff --git a/urcu/static/wfcqueue.h b/urcu/static/wfcqueue.h index 62e003f..0d2facb 100644 --- a/urcu/static/wfcqueue.h +++ b/urcu/static/wfcqueue.h @@ -92,7 +92,8 @@ static inline void _cds_wfcq_node_init(struct cds_wfcq_node *node) } /* - * cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_init: initialize wait-free queue (with lock). Pair with + * cds_wfcq_destroy(). */ static inline void _cds_wfcq_init(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail) @@ -106,6 +107,17 @@ static inline void _cds_wfcq_init(struct cds_wfcq_head *head, assert(!ret); } +/* + * cds_wfcq_destroy: destroy wait-free queue (with lock). Pair with + * cds_wfcq_init(). + */ +static inline void _cds_wfcq_destroy(struct cds_wfcq_head *head, + struct cds_wfcq_tail *tail) +{ + int ret = pthread_mutex_destroy(&head->lock); + assert(!ret); +} + /* * cds_wfcq_empty: return whether wait-free queue is empty. * diff --git a/urcu/static/wfqueue.h b/urcu/static/wfqueue.h index 636e1af..1a7a99f 100644 --- a/urcu/static/wfqueue.h +++ b/urcu/static/wfqueue.h @@ -65,6 +65,12 @@ static inline void _cds_wfq_init(struct cds_wfq_queue *q) assert(!ret); } +static inline void _cds_wfq_destroy(struct cds_wfq_queue *q) +{ + int ret = pthread_mutex_destroy(&q->lock); + assert(!ret); +} + static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q, struct cds_wfq_node *node) { diff --git a/urcu/static/wfstack.h b/urcu/static/wfstack.h index db0d5b8..9efba0e 100644 --- a/urcu/static/wfstack.h +++ b/urcu/static/wfstack.h @@ -77,7 +77,8 @@ void _cds_wfs_node_init(struct cds_wfs_node *node) } /* - * cds_wfs_init: initialize wait-free stack. + * cds_wfs_init: initialize wait-free stack. Pair with + * cds_wfs_destroy(). */ static inline void _cds_wfs_init(struct cds_wfs_stack *s) @@ -89,6 +90,17 @@ void _cds_wfs_init(struct cds_wfs_stack *s) assert(!ret); } +/* + * cds_wfs_destroy: destroy wait-free stack. Pair with + * cds_wfs_init(). + */ +static inline +void _cds_wfs_destroy(struct cds_wfs_stack *s) +{ + int ret = pthread_mutex_destroy(&s->lock); + assert(!ret); +} + static inline bool ___cds_wfs_end(void *node) { return node == CDS_WFS_END; diff --git a/urcu/wfcqueue.h b/urcu/wfcqueue.h index 652b42d..7e363ea 100644 --- a/urcu/wfcqueue.h +++ b/urcu/wfcqueue.h @@ -80,6 +80,7 @@ struct cds_wfcq_tail { #define cds_wfcq_node_init _cds_wfcq_node_init #define cds_wfcq_init _cds_wfcq_init +#define cds_wfcq_destroy _cds_wfcq_destroy #define cds_wfcq_empty _cds_wfcq_empty #define cds_wfcq_enqueue _cds_wfcq_enqueue @@ -158,11 +159,19 @@ struct cds_wfcq_tail { extern void cds_wfcq_node_init(struct cds_wfcq_node *node); /* - * cds_wfcq_init: initialize wait-free queue. + * cds_wfcq_init: initialize wait-free queue. Pair with + * cds_wfcq_destroy(). */ extern void cds_wfcq_init(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail); +/* + * cds_wfcq_destroy: destroy wait-free queue. Pair with + * cds_wfcq_init(). + */ +extern void cds_wfcq_destroy(struct cds_wfcq_head *head, + struct cds_wfcq_tail *tail); + /* * cds_wfcq_empty: return whether wait-free queue is empty. * diff --git a/urcu/wfqueue.h b/urcu/wfqueue.h index 4cd4b13..2ba8624 100644 --- a/urcu/wfqueue.h +++ b/urcu/wfqueue.h @@ -71,6 +71,12 @@ void cds_wfq_init(struct cds_wfq_queue *q) _cds_wfq_init(q); } +static inline CDS_WFQ_DEPRECATED +void cds_wfq_destroy(struct cds_wfq_queue *q) +{ + _cds_wfq_destroy(q); +} + static inline CDS_WFQ_DEPRECATED void cds_wfq_enqueue(struct cds_wfq_queue *q, struct cds_wfq_node *node) { @@ -97,6 +103,9 @@ void cds_wfq_node_init(struct cds_wfq_node *node); extern CDS_WFQ_DEPRECATED void cds_wfq_init(struct cds_wfq_queue *q); +extern CDS_WFQ_DEPRECATED +void cds_wfq_destroy(struct cds_wfq_queue *q); + extern CDS_WFQ_DEPRECATED void cds_wfq_enqueue(struct cds_wfq_queue *q, struct cds_wfq_node *node); diff --git a/urcu/wfstack.h b/urcu/wfstack.h index fc0b44b..5ef8bab 100644 --- a/urcu/wfstack.h +++ b/urcu/wfstack.h @@ -94,6 +94,7 @@ struct cds_wfs_stack { #define cds_wfs_node_init _cds_wfs_node_init #define cds_wfs_init _cds_wfs_init +#define cds_wfs_destroy _cds_wfs_destroy #define cds_wfs_empty _cds_wfs_empty #define cds_wfs_push _cds_wfs_push @@ -131,10 +132,17 @@ struct cds_wfs_stack { extern void cds_wfs_node_init(struct cds_wfs_node *node); /* - * cds_wfs_init: initialize wait-free stack. + * cds_wfs_init: initialize wait-free stack (with lock). Pair with + * cds_wfs_destroy(). */ extern void cds_wfs_init(struct cds_wfs_stack *s); +/* + * cds_wfs_destroy: destroy wait-free stack (with lock). Pair with + * cds_wfs_init(). + */ +extern void cds_wfs_destroy(struct cds_wfs_stack *s); + /* * cds_wfs_empty: return whether wait-free stack is empty. * diff --git a/wfcqueue.c b/wfcqueue.c index 4950c10..7f8b588 100644 --- a/wfcqueue.c +++ b/wfcqueue.c @@ -40,9 +40,14 @@ void cds_wfcq_init(struct cds_wfcq_head *head, _cds_wfcq_init(head, tail); } -bool cds_wfcq_empty(struct cds_wfcq_head *head, +void cds_wfcq_destroy(struct cds_wfcq_head *head, struct cds_wfcq_tail *tail) +{ + _cds_wfcq_destroy(head, tail); +} +bool cds_wfcq_empty(struct cds_wfcq_head *head, + struct cds_wfcq_tail *tail) { return _cds_wfcq_empty(head, tail); } diff --git a/wfqueue.c b/wfqueue.c index 14272cb..509f4f9 100644 --- a/wfqueue.c +++ b/wfqueue.c @@ -41,6 +41,11 @@ void cds_wfq_init(struct cds_wfq_queue *q) _cds_wfq_init(q); } +void cds_wfq_destroy(struct cds_wfq_queue *q) +{ + _cds_wfq_destroy(q); +} + void cds_wfq_enqueue(struct cds_wfq_queue *q, struct cds_wfq_node *node) { _cds_wfq_enqueue(q, node); diff --git a/wfstack.c b/wfstack.c index c8bd7e6..4838280 100644 --- a/wfstack.c +++ b/wfstack.c @@ -38,6 +38,11 @@ void cds_wfs_init(struct cds_wfs_stack *s) _cds_wfs_init(s); } +void cds_wfs_destroy(struct cds_wfs_stack *s) +{ + _cds_wfs_destroy(s); +} + bool cds_wfs_empty(struct cds_wfs_stack *s) { return _cds_wfs_empty(s);