]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: xref: Add a new xref system
authorThierry FOURNIER <thierry.fournier@ozon.io>
Thu, 31 Aug 2017 18:35:18 +0000 (20:35 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 11 Sep 2017 16:59:40 +0000 (18:59 +0200)
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 [new file with mode: 0644]

diff --git a/include/common/xref.h b/include/common/xref.h
new file mode 100644 (file)
index 0000000..b020280
--- /dev/null
@@ -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__ */