build: merge branch 'th/workaround-glib-atomic-pointer-get'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/667
This commit is contained in:
Thomas Haller 2020-11-03 15:40:15 +01:00
commit b57198a7bc
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
11 changed files with 146 additions and 62 deletions

View file

@ -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
@ -677,7 +679,10 @@ endif
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 \
@ -903,8 +908,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)
@ -1217,6 +1220,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
@ -3025,7 +3029,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)
@ -4320,6 +4327,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 = \

View file

@ -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,
)

View file

@ -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(

View file

@ -83,6 +83,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,
)

View file

@ -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 = [

View file

@ -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

View file

@ -73,9 +73,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
/*****************************************************************************/

View file

@ -586,6 +586,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.
@ -594,22 +637,23 @@ _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 _oldval = (oldval); \
typeof(*_atomic) const _newval = (newval); \
\
_g_atomic_pointer_compare_and_exchange(_atomic, _oldval, _newval); \
#define g_atomic_pointer_compare_and_exchange(atomic, oldval, newval) \
({ \
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((void **) _atomic, \
(void *) _oldval, \
(void *) _newval); \
})
/*****************************************************************************/

View file

@ -213,7 +213,11 @@ 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);

View file

@ -1143,6 +1143,13 @@ nmtst_g_source_assert_not_called(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
nmtst_g_source_set_boolean_true(gpointer user_data)
{
@ -1199,39 +1206,61 @@ _nmtst_main_loop_quit_on_notify(GObject *object, GParamSpec *pspec, gpointer use
}
#define nmtst_main_loop_quit_on_notify ((GCallback) _nmtst_main_loop_quit_on_notify)
#define nmtst_main_context_iterate_until(context, timeout_msec, condition) \
({ \
nm_auto_destroy_and_unref_gsource GSource *_source = NULL; \
GMainContext * _context = (context); \
gboolean _had_timeout = FALSE; \
typeof(timeout_msec) _timeout_msec0 = (timeout_msec); \
gint64 _timeout_msec = _timeout_msec0; \
\
g_assert_cmpint(_timeout_msec0, ==, _timeout_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); \
\
while (TRUE) { \
if (condition) \
break; \
g_main_context_iteration(_context, TRUE); \
if (_had_timeout) \
break; \
} \
\
!_had_timeout; \
#define nmtst_main_context_iterate_until_full(context, timeout_msec, poll_msec, condition) \
({ \
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(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(_poll_msec0, ==, _poll_msec); \
\
_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) \
break; \
g_main_context_iteration(_context, TRUE); \
if (_had_timeout) \
break; \
} \
\
!_had_timeout; \
})
#define nmtst_main_context_iterate_until_assert(context, timeout_msec, condition) \
G_STMT_START \
{ \
if (!nmtst_main_context_iterate_until(context, timeout_msec, condition)) \
g_assert(FALSE &&#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_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

View file

@ -18,6 +18,7 @@ libnmdbus_ifcfg_rh = static_library(
name,
sources: dbus_sources,
dependencies: glib_dep,
c_args: introspection_extra_cflags,
)
core_sources = files(