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

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/667

(cherry picked from commit b57198a7bc)
(cherry picked from commit 90a36d5efe)
(cherry picked from commit dec74df554)
(cherry picked from commit 3f3397abca)
(cherry picked from commit 3f13d4d50f)
This commit is contained in:
Thomas Haller 2020-11-03 15:40:15 +01:00
commit 39012584e1
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
11 changed files with 116 additions and 26 deletions

View file

@ -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
@ -516,7 +518,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 \
@ -738,8 +743,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 += \
@ -1064,6 +1067,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
@ -2789,7 +2793,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)
@ -3974,6 +3981,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

@ -16,7 +16,7 @@ exe = executable(
c_args: [
'-DNETWORKMANAGER_COMPILATION_TEST',
'-DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_CLIENT',
],
] + introspection_extra_cflags,
link_with: libnm_dispatcher_core,
)

View file

@ -101,6 +101,7 @@ libnmdbus = static_library(
sources: sources,
include_directories: top_inc,
dependencies: glib_dep,
c_args: introspection_extra_cflags,
)
libnmdbus_dep = declare_dependency(

View file

@ -1,5 +1,5 @@
/*** BEGIN file-header ***/
#include "config.h"
#include "nm-default.h"
#include "nm-core-enum-types.h"
#include "nm-default.h"

View file

@ -1,5 +1,5 @@
/*** BEGIN file-header ***/
#include "config.h"
#include "nm-default.h"
#include "nm-core-tests-enum-types.h"

View file

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

View file

@ -90,8 +90,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

@ -577,6 +577,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.
@ -585,20 +628,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; \
\
_g_atomic_pointer_compare_and_exchange (_atomic, _oldval, _newval); \
(void) (0 ? (gpointer) * (_atomic) : NULL); \
\
_g_atomic_pointer_compare_and_exchange ((void **) _atomic, \
(void *) _oldval, \
(void *) _newval); \
})
/*****************************************************************************/

View file

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

View file

@ -999,6 +999,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
@ -1044,19 +1051,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) \
@ -1069,12 +1089,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 *

View file

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