summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-08-26 10:21:57 +0200
committerThomas Haller <thaller@redhat.com>2021-08-31 16:34:02 +0200
commitcc38b36f8ce2011c758c53d6e8f3020dc8949313 (patch)
tree41e27177aa658069ac752798782a3084246f515d /src
parent92ba45727b69ec3a83c6f4a7568443eee94bef82 (diff)
downloadNetworkManager-cc38b36f8ce2011c758c53d6e8f3020dc8949313.tar.gz
platform: add nm_clear_nmp_object_up_cast(), nmp_object_ref_set_up_cast() helpers
It can be convenient to track a NMPObject in form of their down-cast pointers. When doing that, it's useful to have clear/ref-set helpers that operate on such pointers and up-cast first.
Diffstat (limited to 'src')
-rw-r--r--src/libnm-platform/nmp-object.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/libnm-platform/nmp-object.h b/src/libnm-platform/nmp-object.h
index 83714c9835..bf789fb077 100644
--- a/src/libnm-platform/nmp-object.h
+++ b/src/libnm-platform/nmp-object.h
@@ -625,6 +625,20 @@ nmp_object_unref(const NMPObject *obj)
_changed; \
})
+#define nm_clear_nmp_object_up_cast(ptr) \
+ ({ \
+ typeof(ptr) _ptr = (ptr); \
+ typeof(*_ptr) _pptr; \
+ gboolean _changed = FALSE; \
+ \
+ if (_ptr && (_pptr = *_ptr)) { \
+ *_ptr = NULL; \
+ nmp_object_unref(NMP_OBJECT_UP_CAST(_pptr)); \
+ _changed = TRUE; \
+ } \
+ _changed; \
+ })
+
static inline gboolean
nmp_object_ref_set(const NMPObject **pp, const NMPObject *obj)
{
@@ -643,6 +657,25 @@ nmp_object_ref_set(const NMPObject **pp, const NMPObject *obj)
return _changed;
}
+static inline gboolean
+nmp_object_ref_set_up_cast(gpointer pp, gconstpointer obj)
+{
+ gboolean _changed = FALSE;
+ const NMPObject *p;
+ gconstpointer * pp2 = pp;
+
+ nm_assert(!pp2 || !*pp2 || NMP_OBJECT_IS_VALID(NMP_OBJECT_UP_CAST(*pp2)));
+ nm_assert(!obj || NMP_OBJECT_IS_VALID(NMP_OBJECT_UP_CAST(obj)));
+
+ if (pp2 && ((p = *pp2) != obj)) {
+ nmp_object_ref(NMP_OBJECT_UP_CAST(obj));
+ *pp2 = obj;
+ nmp_object_unref(NMP_OBJECT_UP_CAST(p));
+ _changed = TRUE;
+ }
+ return _changed;
+}
+
NMPObject *nmp_object_new(NMPObjectType obj_type, gconstpointer plobj);
NMPObject *nmp_object_new_link(int ifindex);