From 51f2572db58ac2cf6f257cfdfd41dd85d84b4dfb Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 11 May 2016 11:41:54 +0200 Subject: [PATCH] core: make NMIP4Config struct private and directly embed private data With GObject, the object structure and class structure must be public to be able to inherit from the type. As NMIP4Config is not inherited (final), we don't need that and we don't expect ever needing that for this type. Already now, we want to have the priv pointer directly accessible via self->priv. The main reason is improved debugging, another reason is faster lookup. Now with the struct private, we can directly embed the private data inside NMIP4Config. This avoids storing the private data outside separately inside the GObject which involves a small overhead. It becomes more attractive to do so, as every NMDevice has a multitude of these NMIP4Config instances. And likewise for NMIP6Config. --- src/nm-ip4-config.c | 32 +++++++++++++++++++++----------- src/nm-ip4-config.h | 13 +------------ src/nm-ip6-config.c | 31 ++++++++++++++++++++----------- src/nm-ip6-config.h | 13 +------------ 4 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 26545aa1b..07f820a75 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -35,11 +35,7 @@ #include "nmdbus-ip4-config.h" -G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_EXPORTED_OBJECT) - -#define NM_IP4_CONFIG_GET_PRIVATE(o) ((o)->priv) - -typedef struct _NMIP4ConfigPrivate { +typedef struct { gboolean never_default; guint32 gateway; gboolean has_gateway; @@ -60,6 +56,25 @@ typedef struct _NMIP4ConfigPrivate { gboolean metered; } NMIP4ConfigPrivate; +struct _NMIP4Config { + NMExportedObject parent; + NMIP4ConfigPrivate _priv; +}; + +struct _NMIP4ConfigClass { + NMExportedObjectClass parent; +}; + +G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_EXPORTED_OBJECT) + +#define NM_IP4_CONFIG_GET_PRIVATE(o) \ + ({ \ + const NMIP4ConfigPrivate *_priv = &(o)->_priv; \ + \ + /* cast away the const. */ \ + ((NMIP4ConfigPrivate *) _priv); \ + }) + /* internal guint32 are assigned to gobject properties of type uint. Ensure, that uint is large enough */ G_STATIC_ASSERT (sizeof (uint) >= sizeof (guint32)); G_STATIC_ASSERT (G_MAXUINT >= 0xFFFFFFFF); @@ -2199,10 +2214,7 @@ nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b) static void nm_ip4_config_init (NMIP4Config *config) { - NMIP4ConfigPrivate *priv; - - priv = G_TYPE_INSTANCE_GET_PRIVATE (config, NM_TYPE_IP4_CONFIG, NMIP4ConfigPrivate); - config->priv = priv; + NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config); priv->addresses = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Address)); priv->routes = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Route)); @@ -2424,8 +2436,6 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class); - g_type_class_add_private (config_class, sizeof (NMIP4ConfigPrivate)); - exported_object_class->export_path = NM_DBUS_PATH "/IP4Config/%u"; object_class->get_property = get_property; diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index b1a576874..6eb1aed8b 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -31,18 +31,7 @@ #define NM_IS_IP4_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_IP4_CONFIG)) #define NM_IP4_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IP4_CONFIG, NMIP4ConfigClass)) -struct _NMIP4ConfigPrivate; - -struct _NMIP4Config { - NMExportedObject parent; - - /* private */ - struct _NMIP4ConfigPrivate *priv; -}; - -typedef struct { - NMExportedObjectClass parent; -} NMIP4ConfigClass; +typedef struct _NMIP4ConfigClass NMIP4ConfigClass; /* internal */ #define NM_IP4_CONFIG_IFINDEX "ifindex" diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 790f684cd..ed33bdb36 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -34,11 +34,7 @@ #include "nmdbus-ip6-config.h" -G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_EXPORTED_OBJECT) - -#define NM_IP6_CONFIG_GET_PRIVATE(o) ((o)->priv) - -typedef struct _NMIP6ConfigPrivate { +typedef struct { gboolean never_default; struct in6_addr gateway; GArray *addresses; @@ -52,6 +48,24 @@ typedef struct _NMIP6ConfigPrivate { gint64 route_metric; } NMIP6ConfigPrivate; +struct _NMIP6Config { + NMExportedObject parent; + NMIP6ConfigPrivate _priv; +}; + +struct _NMIP6ConfigClass { + NMExportedObjectClass parent; +}; + +G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_EXPORTED_OBJECT) + +#define NM_IP6_CONFIG_GET_PRIVATE(o) \ + ({ \ + const NMIP6ConfigPrivate *_priv = &(o)->_priv; \ + \ + /* cast away the const. */ \ + ((NMIP6ConfigPrivate *) _priv); \ + }) NM_GOBJECT_PROPERTIES_DEFINE (NMIP6Config, PROP_IFINDEX, @@ -1887,10 +1901,7 @@ nm_ip6_config_equal (const NMIP6Config *a, const NMIP6Config *b) static void nm_ip6_config_init (NMIP6Config *config) { - NMIP6ConfigPrivate *priv; - - priv = G_TYPE_INSTANCE_GET_PRIVATE (config, NM_TYPE_IP6_CONFIG, NMIP6ConfigPrivate); - config->priv = priv; + NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config); priv->addresses = g_array_new (FALSE, TRUE, sizeof (NMPlatformIP6Address)); priv->routes = g_array_new (FALSE, TRUE, sizeof (NMPlatformIP6Route)); @@ -2110,8 +2121,6 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class); - g_type_class_add_private (config_class, sizeof (NMIP6ConfigPrivate)); - exported_object_class->export_path = NM_DBUS_PATH "/IP6Config/%u"; /* virtual methods */ diff --git a/src/nm-ip6-config.h b/src/nm-ip6-config.h index 5e66d500e..85b75db0e 100644 --- a/src/nm-ip6-config.h +++ b/src/nm-ip6-config.h @@ -33,18 +33,7 @@ #define NM_IS_IP6_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_IP6_CONFIG)) #define NM_IP6_CONFIG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_IP6_CONFIG, NMIP6ConfigClass)) -struct _NMIP6ConfigPrivate; - -struct _NMIP6Config { - NMExportedObject parent; - - /* private */ - struct _NMIP6ConfigPrivate *priv; -}; - -typedef struct { - NMExportedObjectClass parent; -} NMIP6ConfigClass; +typedef struct _NMIP6ConfigClass NMIP6ConfigClass; /* internal */ #define NM_IP6_CONFIG_IFINDEX "ifindex"