summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-11-03 15:40:15 +0100
committerThomas Haller <thaller@redhat.com>2021-06-10 15:58:36 +0200
commit3f3397abcac6fadbb053e8ca74108b0b9e2e2e91 (patch)
tree187ec57725af1b57ce54f6437519f6b904d08179
parent500c63db3c0b102c01ad1e93b8ff74fb3e19b9d2 (diff)
parent6efb6696c7af7f2b7ae3ff007144ad22cb4378d5 (diff)
downloadNetworkManager-3f3397abcac6fadbb053e8ca74108b0b9e2e2e91.tar.gz
build: merge branch 'th/workaround-glib-atomic-pointer-get'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/667 (cherry picked from commit b57198a7bcde48b9b71d1fa013f97ffa93b492ca) (cherry picked from commit 90a36d5efea9ca8c9e42fa90fc48798b9b47da16) (cherry picked from commit dec74df55425b665d588c573a9e8315d9ccc257a)
-rw-r--r--Makefile.am16
-rw-r--r--dispatcher/tests/meson.build20
-rw-r--r--introspection/meson.build1
-rw-r--r--libnm-core/meson.build1
-rw-r--r--libnm-core/tests/meson.build1
-rw-r--r--meson.build2
-rw-r--r--shared/nm-default.h2
-rw-r--r--shared/nm-glib-aux/nm-glib.h60
-rw-r--r--shared/nm-test-utils-impl.c5
-rw-r--r--shared/nm-utils/nm-test-utils.h49
-rw-r--r--src/settings/plugins/ifcfg-rh/meson.build1
11 files changed, 123 insertions, 35 deletions
diff --git a/Makefile.am b/Makefile.am
index 5c3e5314fd..96fe24b8f0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -85,6 +85,8 @@ completiondir = $(datadir)/bash-completion/completions
nmlocaledir = $(datadir)/locale
+INTROSPECTION_EXTRA_CFLAGS = -Wno-incompatible-pointer-types-discards-qualifiers
+
GLIB_MKENUMS_H_FLAGS = --identifier-prefix NM
GLIB_MKENUMS_C_FLAGS = --identifier-prefix NM
@@ -635,7 +637,10 @@ shared_nm_glib_aux_tests_test_shared_general_LDADD = \
noinst_LTLIBRARIES += introspection/libnmdbus.la
-introspection_libnmdbus_la_CPPFLAGS = $(GLIB_CFLAGS)
+introspection_libnmdbus_la_CPPFLAGS = \
+ $(GLIB_CFLAGS) \
+ $(INTROSPECTION_EXTRA_CFLAGS) \
+ $(NULL)
introspection_sources = \
introspection/org.freedesktop.NetworkManager.AccessPoint.c \
@@ -861,8 +866,6 @@ dbusinterfaces_DATA = \
CLEANFILES += $(introspection_sources)
CLEANFILES += $(DBUS_INTERFACE_DOCS)
-$(dispatcher_libnm_dispatcher_core_la_OBJECTS): $(introspection_sources)
-$(dispatcher_nm_dispatcher_OBJECTS): $(introspection_sources)
$(libnm_liblibnm_la_OBJECTS): $(introspection_sources)
$(libnm_libnm_la_OBJECTS): $(introspection_sources)
@@ -1186,6 +1189,7 @@ GLIB_GENERATED += \
libnm-core/tests/nm-core-tests-enum-types.h \
libnm-core/tests/nm-core-tests-enum-types.c
nm_core_tests_enum_types_sources = libnm-core/tests/test-general-enums.h
+nm_core_tests_enum_types_MKENUMS_C_FLAGS = --fhead '\#include "nm-default.h"\n'
libnm-core/tests/nm-core-tests-enum-types.h.stamp: libnm-core/tests/.dirstamp
libnm-core/tests/nm-core-tests-enum-types.c.stamp: libnm-core/tests/.dirstamp
@@ -2963,7 +2967,10 @@ nodist_src_settings_plugins_ifcfg_rh_libnmdbus_ifcfg_rh_la_SOURCES = \
src/settings/plugins/ifcfg-rh/nmdbus-ifcfg-rh.c \
src/settings/plugins/ifcfg-rh/nmdbus-ifcfg-rh.h
-src_settings_plugins_ifcfg_rh_libnmdbus_ifcfg_rh_la_CPPFLAGS = $(filter-out -DGLIB_VERSION_MAX_ALLOWED%,$(src_cppflags_base))
+src_settings_plugins_ifcfg_rh_libnmdbus_ifcfg_rh_la_CPPFLAGS = \
+ $(filter-out -DGLIB_VERSION_MAX_ALLOWED%,$(src_cppflags_base)) \
+ $(INTROSPECTION_EXTRA_CFLAGS) \
+ $(NULL)
CLEANFILES += $(nodist_src_settings_plugins_ifcfg_rh_libnmdbus_ifcfg_rh_la_SOURCES)
@@ -4235,6 +4242,7 @@ dispatcher_tests_test_dispatcher_envp_CPPFLAGS = \
-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_CLIENT \
$(GLIB_CFLAGS) \
$(SANITIZER_EXEC_CFLAGS) \
+ $(INTROSPECTION_EXTRA_CFLAGS) \
$(NULL)
dispatcher_tests_test_dispatcher_envp_SOURCES = \
diff --git a/dispatcher/tests/meson.build b/dispatcher/tests/meson.build
index 5c6f6b12a7..53108e79ea 100644
--- a/dispatcher/tests/meson.build
+++ b/dispatcher/tests/meson.build
@@ -2,22 +2,18 @@
test_unit = 'test-dispatcher-envp'
-deps = [
- libnm_nm_default_dep,
- libnm_utils_base_dep,
-]
-
-c_flags = [
- '-DNETWORKMANAGER_COMPILATION_TEST',
- '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_CLIENT',
-]
-
exe = executable(
test_unit,
[test_unit + '.c', nmdbus_dispatcher_sources],
include_directories: dispatcher_inc,
- dependencies: deps,
- c_args: c_flags,
+ dependencies: [
+ libnm_nm_default_dep,
+ libnm_utils_base_dep,
+ ],
+ c_args: [
+ '-DNETWORKMANAGER_COMPILATION_TEST',
+ '-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_CLIENT',
+ ] + introspection_extra_cflags,
link_with: libnm_dispatcher_core,
)
diff --git a/introspection/meson.build b/introspection/meson.build
index dc7841799c..cc8dcefece 100644
--- a/introspection/meson.build
+++ b/introspection/meson.build
@@ -104,6 +104,7 @@ libnmdbus = static_library(
sources: sources,
include_directories: top_inc,
dependencies: glib_dep,
+ c_args: introspection_extra_cflags,
)
libnmdbus_dep = declare_dependency(
diff --git a/libnm-core/meson.build b/libnm-core/meson.build
index 955e17766b..9d0bd75214 100644
--- a/libnm-core/meson.build
+++ b/libnm-core/meson.build
@@ -82,6 +82,7 @@ libnm_core_enum_sources = gnome.mkenums_simple(
enum_types,
sources: libnm_core_headers + [nm_version_macro_header],
identifier_prefix: nm_id_prefix,
+ body_prefix: '#include "nm-default.h"',
install_header: true,
install_dir: libnm_pkgincludedir,
)
diff --git a/libnm-core/tests/meson.build b/libnm-core/tests/meson.build
index 58615e4df0..4ce42526df 100644
--- a/libnm-core/tests/meson.build
+++ b/libnm-core/tests/meson.build
@@ -15,6 +15,7 @@ enum_sources = gnome.mkenums_simple(
enum_types,
sources: 'test-general-enums.h',
identifier_prefix: nm_id_prefix,
+ body_prefix: '#include "nm-default.h"',
)
deps = [
diff --git a/meson.build b/meson.build
index 96e5c59c73..94f110e50b 100644
--- a/meson.build
+++ b/meson.build
@@ -56,6 +56,8 @@ nm_pkgstatedir = join_paths(nm_localstatedir, 'lib', nm_name)
nm_vpndir = join_paths(nm_libdir, nm_name)
nm_plugindir = join_paths(nm_libdir, nm_name, dist_version)
+introspection_extra_cflags = ['-Wno-incompatible-pointer-types-discards-qualifiers']
+
libnm_name = 'libnm'
current = 1
diff --git a/shared/nm-default.h b/shared/nm-default.h
index ace6ede16c..c477f6cffd 100644
--- a/shared/nm-default.h
+++ b/shared/nm-default.h
@@ -75,8 +75,6 @@
#else
#error Need to define G_LOG_DOMAIN
#endif
-#elif defined (NETWORKMANAGER_COMPILATION_TEST) || (NETWORKMANAGER_COMPILATION & NM_NETWORKMANAGER_COMPILATION_WITH_DAEMON)
-#error Do not define G_LOG_DOMAIN with NM_NETWORKMANAGER_COMPILATION_WITH_DAEMON
#endif
/*****************************************************************************/
diff --git a/shared/nm-glib-aux/nm-glib.h b/shared/nm-glib-aux/nm-glib.h
index 2df5179566..bc0f596061 100644
--- a/shared/nm-glib-aux/nm-glib.h
+++ b/shared/nm-glib-aux/nm-glib.h
@@ -565,6 +565,49 @@ _nm_g_value_unset (GValue *value)
/*****************************************************************************/
+/* g_atomic_pointer_get() is implemented as a macro, and it is also used for
+ * (gsize *) arguments. However, that leads to compiler warnings in certain
+ * configurations. Work around it, by redefining the macro. */
+static inline gpointer
+_g_atomic_pointer_get (void **atomic)
+{
+ return g_atomic_pointer_get (atomic);
+}
+#undef g_atomic_pointer_get
+#define g_atomic_pointer_get(atomic) \
+ ({ \
+ typeof (*atomic) *const _atomic = (atomic); \
+ \
+ /* g_atomic_pointer_get() is used by glib also for (gsize *) pointers,
+ * not only pointers to pointers. We thus don't enforce that (*atomic)
+ * is a pointer, but of suitable size/alignment. */ \
+ \
+ G_STATIC_ASSERT (sizeof (*_atomic) == sizeof (gpointer)); \
+ G_STATIC_ASSERT (_nm_alignof (*_atomic) == _nm_alignof (gpointer)); \
+ (void) (0 ? (gpointer) * (_atomic) : NULL); \
+ \
+ (typeof (*_atomic)) _g_atomic_pointer_get ((void **) _atomic); \
+ })
+
+/* Reimplement g_atomic_pointer_set() macro too. Our variant does more type
+ * checks. */
+static inline void
+_g_atomic_pointer_set (void **atomic, void *newval)
+{
+ return g_atomic_pointer_set (atomic, newval);
+}
+#undef g_atomic_pointer_set
+#define g_atomic_pointer_set(atomic, newval) \
+ ({ \
+ typeof (*atomic) *const _atomic = (atomic); \
+ typeof (*_atomic) const _newval = (newval); \
+ _nm_unused gconstpointer const _val_type_check = _newval; \
+ \
+ (void) (0 ? (gpointer) * (_atomic) : NULL); \
+ \
+ _g_atomic_pointer_set ((void **) _atomic, (void *) _newval); \
+ })
+
/* Glib implements g_atomic_pointer_compare_and_exchange() as a macro.
* For one, to inline the atomic operation and also to perform some type checks
* on the arguments.
@@ -573,20 +616,25 @@ _nm_g_value_unset (GValue *value)
* pointers there. Reimplement the macro to get that right, but with stronger
* type checks (as we use typeof()). Had one job. */
static inline gboolean
-_g_atomic_pointer_compare_and_exchange (volatile void *atomic,
- gconstpointer oldval,
- gconstpointer newval)
+_g_atomic_pointer_compare_and_exchange (void **atomic,
+ void *oldval,
+ void *newval)
{
- return g_atomic_pointer_compare_and_exchange ((void **) atomic, (void *) oldval, (void *) newval);
+ return g_atomic_pointer_compare_and_exchange (atomic, oldval, newval);
}
#undef g_atomic_pointer_compare_and_exchange
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
({ \
- typeof (atomic) const _atomic = (atomic); \
+ typeof (*atomic) *const _atomic = (atomic); \
typeof (*_atomic) const _oldval = (oldval); \
typeof (*_atomic) const _newval = (newval); \
+ _nm_unused gconstpointer const _val_type_check = _oldval; \
+ \
+ (void) (0 ? (gpointer) * (_atomic) : NULL); \
\
- _g_atomic_pointer_compare_and_exchange (_atomic, _oldval, _newval); \
+ _g_atomic_pointer_compare_and_exchange ((void **) _atomic, \
+ (void *) _oldval, \
+ (void *) _newval); \
})
/*****************************************************************************/
diff --git a/shared/nm-test-utils-impl.c b/shared/nm-test-utils-impl.c
index ce7cc8d179..5fbb701812 100644
--- a/shared/nm-test-utils-impl.c
+++ b/shared/nm-test-utils-impl.c
@@ -205,7 +205,10 @@ again_wait:
g_assert (ret == info->pid);
}
- g_assert (!name_exists (info->bus, "org.freedesktop.NetworkManager"));
+ nmtst_main_context_iterate_until_assert_full (NULL,
+ 1000,
+ 80,
+ (!name_exists (info->bus, "org.freedesktop.NetworkManager")));
g_clear_object (&info->bus);
diff --git a/shared/nm-utils/nm-test-utils.h b/shared/nm-utils/nm-test-utils.h
index d10ba98dcb..1d265acd66 100644
--- a/shared/nm-utils/nm-test-utils.h
+++ b/shared/nm-utils/nm-test-utils.h
@@ -1057,6 +1057,13 @@ nmtst_g_source_assert_not_called (gpointer user_data)
}
static inline gboolean
+nmtst_g_source_nop (gpointer user_data)
+{
+ g_assert (!user_data);
+ return G_SOURCE_CONTINUE;
+}
+
+static inline gboolean
nmtst_g_source_set_boolean_true (gpointer user_data)
{
gboolean *ptr = user_data;
@@ -1112,19 +1119,32 @@ _nmtst_main_loop_quit_on_notify (GObject *object, GParamSpec *pspec, gpointer us
}
#define nmtst_main_loop_quit_on_notify ((GCallback) _nmtst_main_loop_quit_on_notify)
-#define nmtst_main_context_iterate_until(context, timeout_msec, condition) \
+#define nmtst_main_context_iterate_until_full(context, timeout_msec, poll_msec, condition) \
({ \
- nm_auto_destroy_and_unref_gsource GSource *_source = NULL; \
+ nm_auto_destroy_and_unref_gsource GSource *_source_timeout = NULL; \
+ nm_auto_destroy_and_unref_gsource GSource *_source_poll = NULL; \
GMainContext *_context = (context); \
gboolean _had_timeout = FALSE; \
- typeof(timeout_msec) _timeout_msec0 = (timeout_msec); \
+ typeof (timeout_msec) _timeout_msec0 = (timeout_msec); \
+ typeof (poll_msec) _poll_msec0 = (poll_msec); \
gint64 _timeout_msec = _timeout_msec0; \
+ guint _poll_msec = _poll_msec0; \
\
- g_assert_cmpint(_timeout_msec0, ==, _timeout_msec); \
+ g_assert_cmpint (_timeout_msec0, ==, _timeout_msec); \
+ g_assert_cmpint (_poll_msec0, ==, _poll_msec); \
\
- _source = g_timeout_source_new (NM_CLAMP (_timeout_msec, 0, (gint64) G_MAXUINT)); \
- g_source_set_callback (_source, nmtst_g_source_set_boolean_true, &_had_timeout, NULL); \
- g_source_attach (_source, _context); \
+ _source_timeout = g_timeout_source_new (NM_CLAMP (_timeout_msec, 0, (gint64) G_MAXUINT)); \
+ g_source_set_callback (_source_timeout, \
+ nmtst_g_source_set_boolean_true, \
+ &_had_timeout, \
+ NULL); \
+ g_source_attach (_source_timeout, _context); \
+ \
+ if (_poll_msec > 0) { \
+ _source_poll = g_timeout_source_new (_poll_msec); \
+ g_source_set_callback (_source_poll, nmtst_g_source_nop, NULL, NULL); \
+ g_source_attach (_source_poll, _context); \
+ } \
\
while (TRUE) { \
if (condition) \
@@ -1137,12 +1157,21 @@ _nmtst_main_loop_quit_on_notify (GObject *object, GParamSpec *pspec, gpointer us
!_had_timeout; \
})
-#define nmtst_main_context_iterate_until_assert(context, timeout_msec, condition) \
+#define nmtst_main_context_iterate_until(context, timeout_msec, condition) \
+ nmtst_main_context_iterate_until_full ((context), (timeout_msec), 0, condition)
+
+#define nmtst_main_context_iterate_until_assert_full(context, timeout_msec, poll_msec, condition) \
G_STMT_START { \
- if (!nmtst_main_context_iterate_until (context, timeout_msec, condition)) \
- g_assert (FALSE && #condition); \
+ if (!nmtst_main_context_iterate_until_full ((context), \
+ (timeout_msec), \
+ (poll_msec), \
+ condition)) \
+ g_assert (FALSE &&#condition); \
} G_STMT_END
+#define nmtst_main_context_iterate_until_assert(context, timeout_msec, condition) \
+ nmtst_main_context_iterate_until_assert_full ((context), (timeout_msec), 0, condition)
+
/*****************************************************************************/
static inline void
diff --git a/src/settings/plugins/ifcfg-rh/meson.build b/src/settings/plugins/ifcfg-rh/meson.build
index e193ff96a3..10b93d0a7c 100644
--- a/src/settings/plugins/ifcfg-rh/meson.build
+++ b/src/settings/plugins/ifcfg-rh/meson.build
@@ -18,6 +18,7 @@ libnmdbus_ifcfg_rh = static_library(
name,
sources: dbus_sources,
dependencies: glib_dep,
+ c_args: introspection_extra_cflags,
)
core_sources = files(