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 21:44:41 +0200
commite2fdbc2b7482c8a20d95b10fc8ef172606858957 (patch)
treea647c248b812401607fd6360f5e9a1a68f8ff981
parent5373680df9cf85058866071f317026101050abcb (diff)
parent650f83212eac1a185f841071b2154df9230eca70 (diff)
build: merge branch 'th/workaround-glib-atomic-pointer-get'nm-1-18
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/667 (cherry picked from commit b57198a7bcde48b9b71d1fa013f97ffa93b492ca) (cherry picked from commit 90a36d5efea9ca8c9e42fa90fc48798b9b47da16) (cherry picked from commit dec74df55425b665d588c573a9e8315d9ccc257a) (cherry picked from commit 3f3397abcac6fadbb053e8ca74108b0b9e2e2e91) (cherry picked from commit 3f13d4d50f4e6b44d374634d5d68e04d3f5ad716) (cherry picked from commit 39012584e1fc75ecf2c1f35227f6c225cce7ca8f)
-rw-r--r--Makefile.am19
-rw-r--r--dispatcher/tests/meson.build2
-rw-r--r--introspection/meson.build1
-rw-r--r--libnm-core/nm-core-enum-types.c.template2
-rw-r--r--libnm-core/tests/nm-core-tests-enum-types.c.template2
-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, 119 insertions, 26 deletions
diff --git a/Makefile.am b/Makefile.am
index 3cf5d83949..e18a284794 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -84,6 +84,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
@@ -493,7 +495,10 @@ shared_nm_utils_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 \
@@ -715,8 +720,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_libnm_la_OBJECTS): $(introspection_sources)
EXTRA_DIST += \
@@ -1030,6 +1033,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
@@ -2794,7 +2798,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)
@@ -3966,6 +3973,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_LDFLAGS = \
@@ -4642,6 +4650,7 @@ GLIB_GENERATED += \
$(libnm_util_lib_h_pub_mkenums) \
$(libnm_util_lib_c_mkenums)
nm_utils_enum_types_sources = $(filter-out libnm-util/NetworkManager%,$(libnm_util_lib_h_pub_real))
+nm_utils_enum_types_MKENUMS_C_FLAGS = --identifier-prefix NM --fhead '\#include "nm-default.h"\n'
$(libnm_util_libnm_util_la_OBJECTS): $(libnm_util_lib_h_pub_mkenums)
@@ -4980,6 +4989,7 @@ GLIB_GENERATED += \
$(libnm_glib_lib_h_pub_mkenums) \
$(libnm_glib_lib_c_mkenums)
nm_glib_enum_types_sources = $(libnm_glib_lib_h_pub_real)
+nm_glib_enum_types_MKENUMS_C_FLAGS = --identifier-prefix NM --fhead '\#include "nm-default.h"\n'
$(libnm_glib_libnm_glib_la_OBJECTS): $(libnm_glib_lib_h_pub_mkenums)
@@ -5020,6 +5030,7 @@ GLIB_GENERATED += \
$(libnm_glib_vpn_h_mkenums) \
$(libnm_glib_vpn_c_mkenums)
nm_vpn_enum_types_sources = $(libnm_glib_vpn_h_real)
+nm_vpn_enum_types_MKENUMS_C_FLAGS = --identifier-prefix NM --fhead '\#include "nm-default.h"\n'
$(libnm_glib_libnm_glib_vpn_la_OBJECTS): $(libnm_glib_vpn_h_mkenums)
diff --git a/dispatcher/tests/meson.build b/dispatcher/tests/meson.build
index 3da3c3e912..32a670d7d8 100644
--- a/dispatcher/tests/meson.build
+++ b/dispatcher/tests/meson.build
@@ -13,7 +13,7 @@ exe = executable(
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 631432a7a2..3d776f9391 100644
--- a/introspection/meson.build
+++ b/introspection/meson.build
@@ -99,6 +99,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/nm-core-enum-types.c.template b/libnm-core/nm-core-enum-types.c.template
index 94744827ba..46977d8d37 100644
--- a/libnm-core/nm-core-enum-types.c.template
+++ b/libnm-core/nm-core-enum-types.c.template
@@ -1,5 +1,5 @@
/*** BEGIN file-header ***/
-#include "config.h"
+#include "nm-default.h"
#include "nm-core-enum-types.h"
#include "nm-default.h"
diff --git a/libnm-core/tests/nm-core-tests-enum-types.c.template b/libnm-core/tests/nm-core-tests-enum-types.c.template
index 1160be86dc..dab286a3dd 100644
--- a/libnm-core/tests/nm-core-tests-enum-types.c.template
+++ b/libnm-core/tests/nm-core-tests-enum-types.c.template
@@ -1,5 +1,5 @@
/*** BEGIN file-header ***/
-#include "config.h"
+#include "nm-default.h"
#include "nm-core-tests-enum-types.h"
diff --git a/meson.build b/meson.build
index 402bfee1c3..6b9c4c4364 100644
--- a/meson.build
+++ b/meson.build
@@ -54,6 +54,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 54e9916733..beac8b4a98 100644
--- a/shared/nm-default.h
+++ b/shared/nm-default.h
@@ -104,8 +104,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 3be708943b..22f4d8b510 100644
--- a/shared/nm-glib-aux/nm-glib.h
+++ b/shared/nm-glib-aux/nm-glib.h
@@ -578,6 +578,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.
@@ -586,20 +629,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 02d7159342..9e2eea27e5 100644
--- a/shared/nm-test-utils-impl.c
+++ b/shared/nm-test-utils-impl.c
@@ -247,7 +247,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 b53ff51705..629c3b9ae3 100644
--- a/shared/nm-utils/nm-test-utils.h
+++ b/shared/nm-utils/nm-test-utils.h
@@ -1001,6 +1001,13 @@ nmtst_g_source_set_boolean_true (gpointer user_data)
return G_SOURCE_CONTINUE;
}
+static inline gboolean
+nmtst_g_source_nop (gpointer user_data)
+{
+ g_assert (!user_data);
+ return G_SOURCE_CONTINUE;
+}
+
/*****************************************************************************/
static inline gboolean
@@ -1046,19 +1053,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) \
@@ -1071,12 +1091,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 const char *
diff --git a/src/settings/plugins/ifcfg-rh/meson.build b/src/settings/plugins/ifcfg-rh/meson.build
index 9024782ab7..f60af5ed5d 100644
--- a/src/settings/plugins/ifcfg-rh/meson.build
+++ b/src/settings/plugins/ifcfg-rh/meson.build
@@ -16,6 +16,7 @@ libnmdbus_ifcfg_rh = static_library(
name,
sources: dbus_sources,
dependencies: glib_dep,
+ c_args: introspection_extra_cflags,
)
core_sources = files(