summaryrefslogtreecommitdiff
path: root/src/devices/nm-device-logging.h
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-11-06 18:22:11 +0100
committerThomas Haller <thaller@redhat.com>2020-11-09 17:53:16 +0100
commitcc35dc3bdf5f76cac5ed37127ca89eef18bb9998 (patch)
tree8d0aa7b8cd627d125956d5b98c094d96795ce005 /src/devices/nm-device-logging.h
parent7d5ec103df5209ca7fbf74309df53af87dd42e5e (diff)
downloadNetworkManager-cc35dc3bdf5f76cac5ed37127ca89eef18bb9998.tar.gz
device: improve "nm-device-logging.h" to support a self pointer of NMDevice type
"nm-device-logging.h" defines logging macros for a NMDevice instance. It also expects a "self" variable in the call environment, and that variable had to be in the type of NMDevice or the NMDevice subclass. Extend the macro foo, so that @self can be either a NMDevice* pointer or a NMDevice$SUBTYPE. Of course, that would have always been possible, if we would simply cast to "(NMDevice *)" where we need it. The trick is that the macro only works if @self is one of the two expected types, and not some arbitrary unrelated type.
Diffstat (limited to 'src/devices/nm-device-logging.h')
-rw-r--r--src/devices/nm-device-logging.h58
1 files changed, 31 insertions, 27 deletions
diff --git a/src/devices/nm-device-logging.h b/src/devices/nm-device-logging.h
index d12910207e..ff3d4180dc 100644
--- a/src/devices/nm-device-logging.h
+++ b/src/devices/nm-device-logging.h
@@ -8,36 +8,40 @@
#include "nm-device.h"
-#define _LOG_DECLARE_SELF(t) \
- _nm_unused static inline NMDevice *_nm_device_log_self_to_device(t *self) \
- { \
- return (NMDevice *) self; \
- }
+#if !_NM_CC_SUPPORT_GENERIC
+ #define _NM_DEVICE_CAST(self) ((NMDevice *) (self))
+#elif !defined(_NMLOG_DEVICE_TYPE)
+ #define _NM_DEVICE_CAST(self) _NM_ENSURE_TYPE(NMDevice *, self)
+#else
+ #define _NM_DEVICE_CAST(self) \
+ _Generic((self), _NMLOG_DEVICE_TYPE * \
+ : ((NMDevice *) (self)), NMDevice * \
+ : ((NMDevice *) (self)))
+#endif
#undef _NMLOG_ENABLED
#define _NMLOG_ENABLED(level, domain) (nm_logging_enabled((level), (domain)))
-#define _NMLOG(level, domain, ...) \
- G_STMT_START \
- { \
- const NMLogLevel _level = (level); \
- const NMLogDomain _domain = (domain); \
- \
- if (nm_logging_enabled(_level, _domain)) { \
- typeof(*self) *const _self = (self); \
- const char *const _ifname = \
- _nm_device_get_iface(_nm_device_log_self_to_device(_self)); \
- \
- nm_log_obj(_level, \
- _domain, \
- _ifname, \
- NULL, \
- _self, \
- "device", \
- "%s%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
- NM_PRINT_FMT_QUOTED(_ifname, "(", _ifname, ")", "[null]") \
- _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
- } \
- } \
+#define _NMLOG(level, domain, ...) \
+ G_STMT_START \
+ { \
+ const NMLogLevel _level = (level); \
+ const NMLogDomain _domain = (domain); \
+ \
+ if (nm_logging_enabled(_level, _domain)) { \
+ typeof(*self) *const _self = (self); \
+ const char *const _ifname = _nm_device_get_iface(_NM_DEVICE_CAST(_self)); \
+ \
+ nm_log_obj(_level, \
+ _domain, \
+ _ifname, \
+ NULL, \
+ _self, \
+ "device", \
+ "%s%s%s: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__), \
+ NM_PRINT_FMT_QUOTED(_ifname, "(", _ifname, ")", "[null]") \
+ _NM_UTILS_MACRO_REST(__VA_ARGS__)); \
+ } \
+ } \
G_STMT_END
#endif /* __NETWORKMANAGER_DEVICE_LOGGING_H__ */