From 3c65b7a91673895d69dfad8d022865af8a42a305 Mon Sep 17 00:00:00 2001 From: Thierry FOURNIER Date: Thu, 31 Aug 2017 20:35:18 +0200 Subject: [PATCH] MINOR: xref: Add a new xref system xref is used to create a relation between two elements. Once an element is released, it breaks the relation. If the relation is already broken, it frees the xref struct. The pointer between two elements is a sort of refcount with max value 1. The relation is only between two elements. The pointer and the type of element a and b are conventional. Note that xref is initialised from Lua files because Lua is the only one user. --- include/common/xref.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 include/common/xref.h diff --git a/include/common/xref.h b/include/common/xref.h new file mode 100644 index 0000000000..b020280ef0 --- /dev/null +++ b/include/common/xref.h @@ -0,0 +1,38 @@ +#ifndef __XREF_H__ +#define __XREF_H__ + +/* xref is used to create relation between two elements. + * Once an element is released, it breaks the relation. If the + * relation is already broken, it frees the xref struct. + * The pointer between two elements is sort of a refcount with + * max value 1. The relation is only between two elements. + * The pointer and the type of elements a and b are conventional. + */ + +struct xref { + struct xref *peer; +}; + +static inline void xref_create(struct xref *xref_a, struct xref *xref_b) +{ + xref_a->peer = xref_b; + xref_b->peer = xref_a; +} + +static inline struct xref *xref_get_peer(struct xref *xref) +{ + if (!xref->peer) + return NULL; + return xref->peer; +} + +static inline void xref_disconnect(struct xref *xref) +{ + if (!xref->peer) + return; + + xref->peer->peer = NULL; + xref->peer = NULL; +} + +#endif /* __XREF_H__ */