diff options
author | Thomas Haller <thaller@redhat.com> | 2020-11-03 15:40:15 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-06-10 15:58:36 +0200 |
commit | 3f3397abcac6fadbb053e8ca74108b0b9e2e2e91 (patch) | |
tree | 187ec57725af1b57ce54f6437519f6b904d08179 | |
parent | 500c63db3c0b102c01ad1e93b8ff74fb3e19b9d2 (diff) | |
parent | 6efb6696c7af7f2b7ae3ff007144ad22cb4378d5 (diff) | |
download | NetworkManager-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.am | 16 | ||||
-rw-r--r-- | dispatcher/tests/meson.build | 20 | ||||
-rw-r--r-- | introspection/meson.build | 1 | ||||
-rw-r--r-- | libnm-core/meson.build | 1 | ||||
-rw-r--r-- | libnm-core/tests/meson.build | 1 | ||||
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | shared/nm-default.h | 2 | ||||
-rw-r--r-- | shared/nm-glib-aux/nm-glib.h | 60 | ||||
-rw-r--r-- | shared/nm-test-utils-impl.c | 5 | ||||
-rw-r--r-- | shared/nm-utils/nm-test-utils.h | 49 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/meson.build | 1 |
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( |