mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 07:10:07 +01:00
build: merge branch 'th/workaround-glib-atomic-pointer-get'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/667
This commit is contained in:
commit
b57198a7bc
11 changed files with 146 additions and 62 deletions
16
Makefile.am
16
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
|
||||
|
||||
|
|
@ -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 = \
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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 = [
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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); \
|
||||
})
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ libnmdbus_ifcfg_rh = static_library(
|
|||
name,
|
||||
sources: dbus_sources,
|
||||
dependencies: glib_dep,
|
||||
c_args: introspection_extra_cflags,
|
||||
)
|
||||
|
||||
core_sources = files(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue