summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-09-06 11:29:20 +0200
committerThomas Haller <thaller@redhat.com>2022-10-11 08:59:48 +0200
commit5f4eb5eed53e86e8a84c163a19b8c7a84807f752 (patch)
treeac63620cedae60feb553125e6dc09f417716fc2d
parent28fa48aee44cae8349b3614ee2b9c1837fea0074 (diff)
libnm: cleanup implementations for nm_meta_setting_infos_by_gtype()
The file "nm-meta-setting-base-impl.c" is present twice in our source tree and compiled twice. Once with internal headers of libnm-core and once with only public headers. Consequently, there are two implementations for nm_meta_setting_infos_by_gtype(), one that can benefit from internal access to the data structure, and the one for libnmc, which cannot. Refactor the implementations, in the hope to have it clearer.
-rw-r--r--src/libnm-core-impl/nm-meta-setting-base-impl.c57
-rw-r--r--src/libnmc-setting/nm-meta-setting-base-impl.c57
2 files changed, 62 insertions, 52 deletions
diff --git a/src/libnm-core-impl/nm-meta-setting-base-impl.c b/src/libnm-core-impl/nm-meta-setting-base-impl.c
index ebc04556a7..31e1012b1d 100644
--- a/src/libnm-core-impl/nm-meta-setting-base-impl.c
+++ b/src/libnm-core-impl/nm-meta-setting-base-impl.c
@@ -703,19 +703,21 @@ nm_meta_setting_infos_by_name(const char *name)
return idx >= 0 ? &nm_meta_setting_infos[idx] : NULL;
}
-const NMMetaSettingInfo *
-nm_meta_setting_infos_by_gtype(GType gtype)
-{
+/*****************************************************************************/
+
#if _NM_META_SETTING_BASE_IMPL_LIBNM
+static const NMMetaSettingInfo *
+_infos_by_gtype_from_class(GType gtype)
+{
nm_auto_unref_gtypeclass GTypeClass *gtypeclass_unref = NULL;
GTypeClass *gtypeclass;
NMSettingClass *klass;
if (!g_type_is_a(gtype, NM_TYPE_SETTING))
- goto out_none;
+ return NULL;
gtypeclass = g_type_class_peek(gtype);
- if (!gtypeclass)
+ if (G_UNLIKELY(!gtypeclass))
gtypeclass = gtypeclass_unref = g_type_class_ref(gtype);
nm_assert(NM_IS_SETTING_CLASS(gtypeclass));
@@ -723,38 +725,41 @@ nm_meta_setting_infos_by_gtype(GType gtype)
klass = (NMSettingClass *) gtypeclass;
if (!klass->setting_info)
- goto out_none;
+ return NULL;
nm_assert(klass->setting_info->get_setting_gtype);
nm_assert(klass->setting_info->get_setting_gtype() == gtype);
-
return klass->setting_info;
+}
+#endif
-out_none:
-
- if (NM_MORE_ASSERTS > 10) {
- int i;
-
- /* this might hint to a bug, but it would be expected for NM_TYPE_SETTING
- * and NM_TYPE_SETTING_IP_CONFIG.
- *
- * Assert that we didn't lookup for a gtype, which we would expect to find.
- * An assertion failure here, hints to a bug in nm_setting_*_class_init().
- */
- for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++)
- nm_assert(nm_meta_setting_infos[i].get_setting_gtype() != gtype);
- }
-
- return NULL;
-#else
- guint i;
+static const NMMetaSettingInfo *
+_infos_by_gtype_search(GType gtype)
+{
+ int i;
- for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
+ for (i = 0; i < (int) _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_meta_setting_infos[i].get_setting_gtype() == gtype)
return &nm_meta_setting_infos[i];
}
return NULL;
+}
+
+const NMMetaSettingInfo *
+nm_meta_setting_infos_by_gtype(GType gtype)
+{
+ const NMMetaSettingInfo *setting_info;
+
+#if _NM_META_SETTING_BASE_IMPL_LIBNM
+ setting_info = _infos_by_gtype_from_class(gtype);
+
+ if (NM_MORE_ASSERTS > 20)
+ nm_assert(setting_info == _infos_by_gtype_search(gtype));
+#else
+ setting_info = _infos_by_gtype_search(gtype);
#endif
+
+ return setting_info;
}
/*****************************************************************************/
diff --git a/src/libnmc-setting/nm-meta-setting-base-impl.c b/src/libnmc-setting/nm-meta-setting-base-impl.c
index ebc04556a7..31e1012b1d 100644
--- a/src/libnmc-setting/nm-meta-setting-base-impl.c
+++ b/src/libnmc-setting/nm-meta-setting-base-impl.c
@@ -703,19 +703,21 @@ nm_meta_setting_infos_by_name(const char *name)
return idx >= 0 ? &nm_meta_setting_infos[idx] : NULL;
}
-const NMMetaSettingInfo *
-nm_meta_setting_infos_by_gtype(GType gtype)
-{
+/*****************************************************************************/
+
#if _NM_META_SETTING_BASE_IMPL_LIBNM
+static const NMMetaSettingInfo *
+_infos_by_gtype_from_class(GType gtype)
+{
nm_auto_unref_gtypeclass GTypeClass *gtypeclass_unref = NULL;
GTypeClass *gtypeclass;
NMSettingClass *klass;
if (!g_type_is_a(gtype, NM_TYPE_SETTING))
- goto out_none;
+ return NULL;
gtypeclass = g_type_class_peek(gtype);
- if (!gtypeclass)
+ if (G_UNLIKELY(!gtypeclass))
gtypeclass = gtypeclass_unref = g_type_class_ref(gtype);
nm_assert(NM_IS_SETTING_CLASS(gtypeclass));
@@ -723,38 +725,41 @@ nm_meta_setting_infos_by_gtype(GType gtype)
klass = (NMSettingClass *) gtypeclass;
if (!klass->setting_info)
- goto out_none;
+ return NULL;
nm_assert(klass->setting_info->get_setting_gtype);
nm_assert(klass->setting_info->get_setting_gtype() == gtype);
-
return klass->setting_info;
+}
+#endif
-out_none:
-
- if (NM_MORE_ASSERTS > 10) {
- int i;
-
- /* this might hint to a bug, but it would be expected for NM_TYPE_SETTING
- * and NM_TYPE_SETTING_IP_CONFIG.
- *
- * Assert that we didn't lookup for a gtype, which we would expect to find.
- * An assertion failure here, hints to a bug in nm_setting_*_class_init().
- */
- for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++)
- nm_assert(nm_meta_setting_infos[i].get_setting_gtype() != gtype);
- }
-
- return NULL;
-#else
- guint i;
+static const NMMetaSettingInfo *
+_infos_by_gtype_search(GType gtype)
+{
+ int i;
- for (i = 0; i < _NM_META_SETTING_TYPE_NUM; i++) {
+ for (i = 0; i < (int) _NM_META_SETTING_TYPE_NUM; i++) {
if (nm_meta_setting_infos[i].get_setting_gtype() == gtype)
return &nm_meta_setting_infos[i];
}
return NULL;
+}
+
+const NMMetaSettingInfo *
+nm_meta_setting_infos_by_gtype(GType gtype)
+{
+ const NMMetaSettingInfo *setting_info;
+
+#if _NM_META_SETTING_BASE_IMPL_LIBNM
+ setting_info = _infos_by_gtype_from_class(gtype);
+
+ if (NM_MORE_ASSERTS > 20)
+ nm_assert(setting_info == _infos_by_gtype_search(gtype));
+#else
+ setting_info = _infos_by_gtype_search(gtype);
#endif
+
+ return setting_info;
}
/*****************************************************************************/