summary refs log tree commit diff
path: root/shared/nm-glib-aux
diff options
context:
space:
mode:
Diffstat (limited to 'shared/nm-glib-aux')
-rw-r--r--shared/nm-glib-aux/nm-glib.h70
-rw-r--r--shared/nm-glib-aux/nm-shared-utils.c8
-rw-r--r--shared/nm-glib-aux/nm-shared-utils.h6
3 files changed, 65 insertions, 19 deletions
diff --git a/shared/nm-glib-aux/nm-glib.h b/shared/nm-glib-aux/nm-glib.h
index 5125617d..9794e1fb 100644
--- a/shared/nm-glib-aux/nm-glib.h
+++ b/shared/nm-glib-aux/nm-glib.h
@@ -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);     \
     })
 
 /*****************************************************************************/
diff --git a/shared/nm-glib-aux/nm-shared-utils.c b/shared/nm-glib-aux/nm-shared-utils.c
index b0e02381..7f766871 100644
--- a/shared/nm-glib-aux/nm-shared-utils.c
+++ b/shared/nm-glib-aux/nm-shared-utils.c
@@ -4115,7 +4115,7 @@ nm_utils_g_slist_strlist_join(const GSList *a, const char *separator)
 
 /*****************************************************************************/
 
-gpointer
+NMUtilsUserData *
 _nm_utils_user_data_pack(int nargs, gconstpointer *args)
 {
     int       i;
@@ -4127,13 +4127,13 @@ _nm_utils_user_data_pack(int nargs, gconstpointer *args)
     data = g_slice_alloc(((gsize) nargs) * sizeof(gconstpointer));
     for (i = 0; i < nargs; i++)
         data[i] = (gpointer) args[i];
-    return data;
+    return (NMUtilsUserData *) data;
 }
 
 void
-_nm_utils_user_data_unpack(gpointer user_data, int nargs, ...)
+_nm_utils_user_data_unpack(NMUtilsUserData *user_data, int nargs, ...)
 {
-    gpointer *data = user_data;
+    gpointer *data = (gpointer *) user_data;
     va_list   ap;
     int       i;
 
diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h
index 83e1c284..23884a37 100644
--- a/shared/nm-glib-aux/nm-shared-utils.h
+++ b/shared/nm-glib-aux/nm-shared-utils.h
@@ -1737,12 +1737,14 @@ nm_utils_process_state_is_dead(char pstate)
 
 /*****************************************************************************/
 
-gpointer _nm_utils_user_data_pack(int nargs, gconstpointer *args);
+typedef struct _NMUtilsUserData NMUtilsUserData;
+
+NMUtilsUserData *_nm_utils_user_data_pack(int nargs, gconstpointer *args);
 
 #define nm_utils_user_data_pack(...) \
     _nm_utils_user_data_pack(NM_NARG(__VA_ARGS__), (gconstpointer[]){__VA_ARGS__})
 
-void _nm_utils_user_data_unpack(gpointer user_data, int nargs, ...);
+void _nm_utils_user_data_unpack(NMUtilsUserData *user_data, int nargs, ...);
 
 #define nm_utils_user_data_unpack(user_data, ...) \
     _nm_utils_user_data_unpack(user_data, NM_NARG(__VA_ARGS__), __VA_ARGS__)