From 0814ed8080410afefabecd4907adc0015f7417fa Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:32:08 +0200 Subject: [PATCH 1/9] shared/gsystem-local-alloc: fix gs_free_variant_iter/gs_local_variant_builder_unref Wrong signature, but they are unused anyway. Fixes: 98c71df8a3bc7105e2d89bbbee18007f79db5ec7 --- shared/nm-utils/gsystem-local-alloc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h index 3f69e9aa2f..50a92c83a0 100644 --- a/shared/nm-utils/gsystem-local-alloc.h +++ b/shared/nm-utils/gsystem-local-alloc.h @@ -98,7 +98,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GVariant *, gs_local_variant_unref, g_variant_unref * scope. */ #define gs_free_variant_iter __attribute__ ((cleanup(gs_local_variant_iter_free))) -GS_DEFINE_CLEANUP_FUNCTION_STRUCT(GVariantIter, gs_local_variant_iter_free, g_variant_iter_free) +GS_DEFINE_CLEANUP_FUNCTION0 (GVariantIter *, gs_local_variant_iter_free, g_variant_iter_free) /** * gs_free_variant_builder: @@ -107,7 +107,7 @@ GS_DEFINE_CLEANUP_FUNCTION_STRUCT(GVariantIter, gs_local_variant_iter_free, g_va * scope. */ #define gs_unref_variant_builder __attribute__ ((cleanup(gs_local_variant_builder_unref))) -GS_DEFINE_CLEANUP_FUNCTION_STRUCT(GVariantBuilder, gs_local_variant_builder_unref, g_variant_builder_unref) +GS_DEFINE_CLEANUP_FUNCTION0 (GVariantBuilder *, gs_local_variant_builder_unref, g_variant_builder_unref) /** * gs_unref_array: From 1546db05bd9b9b2b47224f1e19a6b91d485ea8be Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:09:51 +0200 Subject: [PATCH 2/9] shared/gsystem-local-alloc: remove unused "gs_fd_close" cleanup macro Drop unused "gs_fd_close" macro, now that we no longer care about keeping "gsystem-local-alloc.h" header in sync with (unmaintained) upstream. Also, our own "nm_auto_close" macro should be preferred, because - it preserves errno - it uses nm_close(), which asserts against EBADF. --- shared/nm-utils/gsystem-local-alloc.h | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h index 50a92c83a0..9e2174b1d7 100644 --- a/shared/nm-utils/gsystem-local-alloc.h +++ b/shared/nm-utils/gsystem-local-alloc.h @@ -21,10 +21,6 @@ #ifndef __GSYSTEM_LOCAL_ALLOC_H__ #define __GSYSTEM_LOCAL_ALLOC_H__ -#include - -G_BEGIN_DECLS - #define GS_DEFINE_CLEANUP_FUNCTION_VOID(CastType, name, func) \ static inline void name (void *v) \ { \ @@ -203,25 +199,4 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GError *, gs_local_free_error, g_error_free) #define gs_unref_keyfile __attribute__ ((cleanup(gs_local_keyfile_unref))) GS_DEFINE_CLEANUP_FUNCTION0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) -static inline void -gs_cleanup_close_fdp (int *fdp) -{ - int fd; - - g_assert (fdp); - - fd = *fdp; - if (fd != -1) - (void) close (fd); -} - -/** - * gs_fd_close: - * - * Call close() on a variable location when it goes out of scope. - */ -#define gs_fd_close __attribute__((cleanup(gs_cleanup_close_fdp))) - -G_END_DECLS - #endif From 5513af2e14aa409be05a91edfc1e0a064f4f643e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:37:02 +0200 Subject: [PATCH 3/9] shared/trivial: add comment to nm_auto_free It's not obvious why we have "nm_auto_free" along "gs_free". Explain it. Also, define the cleanup function first, then the nm-auto macro. --- shared/nm-utils/nm-macros-internal.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index 778cc01ab4..259b650181 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -71,9 +71,18 @@ static inline int nm_close (int fd); * nm_auto_free: * * Call free() on a variable location when it goes out of scope. + * This is for pointers that are allocated with malloc() instead of + * g_malloc(). + * + * In practice, since glib 2.45, g_malloc()/g_free() always wraps malloc()/free(). + * See bgo#751592. In that case, it would be safe to free pointers allocated with + * malloc() with gs_free or g_free(). + * + * However, let's never mix them. To free malloc'ed memory, always use + * free() or nm_auto_free. */ -#define nm_auto_free nm_auto(_nm_auto_free_impl) GS_DEFINE_CLEANUP_FUNCTION_VOID (void *, _nm_auto_free_impl, free) +#define nm_auto_free nm_auto(_nm_auto_free_impl) static inline void nm_free_secret (char *secret) From 904e8b8ca007ab1874dfcedc8ca09bcca410ef7b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:42:52 +0200 Subject: [PATCH 4/9] shared/gsystem-local-alloc: rename unused gs_* cleanup macros These cleanup macros are unused by NetworkManager code. Note that since "shared/nm-utils" is used by applet and VPN plugins, theoretically, they could be used there. I didn't check that, but breaking API of "shared/nm-utils" is fine (as long as we catch it with a compilation error). Historically, we use libgsystem's gsystem-local-alloc header and their "gs_*" macros. However, they are not really our style and don't have a nm-prefix (like the rest of our code). We keep the gs_ names, because they are wildly used and because we wanted to keep gsystem-local-alloc in sync with upstream (which is no longer the case). Our own cleanup macros are always called "nm_auto_*". So, at least for the unused "gs_*" macros, rename them to "nm_auto_*". Don't drop them, despite they being unused. The reason is, that we should make use of cleanup functions more eagerly. Dropping them now -- because they are momentarily unused -- hampers using them in the future. We often don't use the cleanup macros at places where I think we should, so by dropping them, we hamper future use. --- shared/nm-utils/gsystem-local-alloc.h | 37 --------------------------- shared/nm-utils/nm-macros-internal.h | 12 +++++++++ 2 files changed, 12 insertions(+), 37 deletions(-) diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h index 9e2174b1d7..81cbb3c3a1 100644 --- a/shared/nm-utils/gsystem-local-alloc.h +++ b/shared/nm-utils/gsystem-local-alloc.h @@ -87,24 +87,6 @@ GS_DEFINE_CLEANUP_FUNCTION_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) #define gs_unref_variant __attribute__ ((cleanup(gs_local_variant_unref))) GS_DEFINE_CLEANUP_FUNCTION0 (GVariant *, gs_local_variant_unref, g_variant_unref) -/** - * gs_free_variant_iter: - * - * Call g_variant_iter_free() on a variable location when it goes out of - * scope. - */ -#define gs_free_variant_iter __attribute__ ((cleanup(gs_local_variant_iter_free))) -GS_DEFINE_CLEANUP_FUNCTION0 (GVariantIter *, gs_local_variant_iter_free, g_variant_iter_free) - -/** - * gs_free_variant_builder: - * - * Call g_variant_builder_unref() on a variable location when it goes out of - * scope. - */ -#define gs_unref_variant_builder __attribute__ ((cleanup(gs_local_variant_builder_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GVariantBuilder *, gs_local_variant_builder_unref, g_variant_builder_unref) - /** * gs_unref_array: * @@ -137,15 +119,6 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_u #define gs_unref_hashtable __attribute__ ((cleanup(gs_local_hashtable_unref))) GS_DEFINE_CLEANUP_FUNCTION0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) -/** - * gs_free_list: - * - * Call g_list_free() on a variable location when it goes out - * of scope. - */ -#define gs_free_list __attribute__ ((cleanup(gs_local_free_list))) -GS_DEFINE_CLEANUP_FUNCTION (GList *, gs_local_free_list, g_list_free) - /** * gs_free_slist: * @@ -155,16 +128,6 @@ GS_DEFINE_CLEANUP_FUNCTION (GList *, gs_local_free_list, g_list_free) #define gs_free_slist __attribute__ ((cleanup(gs_local_free_slist))) GS_DEFINE_CLEANUP_FUNCTION (GSList *, gs_local_free_slist, g_slist_free) -/** - * gs_free_checksum: - * - * Call g_checksum_free() on a variable location when it goes out - * of scope. Note that unlike g_checksum_free(), the variable may - * be %NULL. - */ -#define gs_free_checksum __attribute__ ((cleanup(gs_local_checksum_free))) -GS_DEFINE_CLEANUP_FUNCTION0 (GChecksum *, gs_local_checksum_free, g_checksum_free) - /** * gs_unref_bytes: * diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index 259b650181..a9ea7487d3 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -84,6 +84,18 @@ static inline int nm_close (int fd); GS_DEFINE_CLEANUP_FUNCTION_VOID (void *, _nm_auto_free_impl, free) #define nm_auto_free nm_auto(_nm_auto_free_impl) +GS_DEFINE_CLEANUP_FUNCTION0 (GVariantIter *, _nm_auto_free_variant_iter, g_variant_iter_free) +#define nm_auto_free_variant_iter __attribute__ ((cleanup(_nm_auto_free_variant_iter))) + +GS_DEFINE_CLEANUP_FUNCTION0 (GVariantBuilder *, _nm_auto_unref_variant_builder, g_variant_builder_unref) +#define nm_auto_unref_variant_builder __attribute__ ((cleanup(_nm_auto_unref_variant_builder))) + +GS_DEFINE_CLEANUP_FUNCTION (GList *, _nm_auto_free_list, g_list_free) +#define nm_auto_free_list __attribute__ ((cleanup(_nm_auto_free_list))) + +GS_DEFINE_CLEANUP_FUNCTION0 (GChecksum *, _nm_auto_checksum_free, g_checksum_free) +#define nm_auto_free_checksum __attribute__ ((cleanup(_nm_auto_checksum_free))) + static inline void nm_free_secret (char *secret) { From a38782f378853604c5a7464bc94558dbc32c3d42 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:51:34 +0200 Subject: [PATCH 5/9] shared/trivial: rename GS_DEFINE_CLEANUP_FUNCTION_*() macros To be consistent with our other nm_auto* related functions. --- shared/nm-utils/gsystem-local-alloc.h | 32 +++++++++++++-------------- shared/nm-utils/nm-macros-internal.h | 10 ++++----- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h index 81cbb3c3a1..2fee969802 100644 --- a/shared/nm-utils/gsystem-local-alloc.h +++ b/shared/nm-utils/gsystem-local-alloc.h @@ -21,33 +21,33 @@ #ifndef __GSYSTEM_LOCAL_ALLOC_H__ #define __GSYSTEM_LOCAL_ALLOC_H__ -#define GS_DEFINE_CLEANUP_FUNCTION_VOID(CastType, name, func) \ +#define NM_AUTO_DEFINE_FCN_VOID(CastType, name, func) \ static inline void name (void *v) \ { \ func (*((CastType *) v)); \ } -#define GS_DEFINE_CLEANUP_FUNCTION_VOID0(CastType, name, func) \ +#define NM_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \ static inline void name (void *v) \ { \ if (*((CastType *) v)) \ func (*((CastType *) v)); \ } -#define GS_DEFINE_CLEANUP_FUNCTION(Type, name, func) \ +#define NM_AUTO_DEFINE_FCN(Type, name, func) \ static inline void name (Type *v) \ { \ func (*v); \ } -#define GS_DEFINE_CLEANUP_FUNCTION0(Type, name, func) \ +#define NM_AUTO_DEFINE_FCN0(Type, name, func) \ static inline void name (Type *v) \ { \ if (*v) \ func (*v); \ } -#define GS_DEFINE_CLEANUP_FUNCTION_STRUCT(Type, name, func) \ +#define NM_AUTO_DEFINE_FCN_STRUCT(Type, name, func) \ static inline void name (Type *v) \ { \ func (v); \ @@ -65,7 +65,7 @@ * Call g_free() on a variable location when it goes out of scope. */ #define gs_free __attribute__ ((cleanup(gs_local_free))) -GS_DEFINE_CLEANUP_FUNCTION_VOID (void *, gs_local_free, g_free) +NM_AUTO_DEFINE_FCN_VOID (void *, gs_local_free, g_free) /** * gs_unref_object: @@ -75,7 +75,7 @@ GS_DEFINE_CLEANUP_FUNCTION_VOID (void *, gs_local_free, g_free) * %NULL. */ #define gs_unref_object __attribute__ ((cleanup(gs_local_obj_unref))) -GS_DEFINE_CLEANUP_FUNCTION_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) +NM_AUTO_DEFINE_FCN_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) /** * gs_unref_variant: @@ -85,7 +85,7 @@ GS_DEFINE_CLEANUP_FUNCTION_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) * %NULL. */ #define gs_unref_variant __attribute__ ((cleanup(gs_local_variant_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GVariant *, gs_local_variant_unref, g_variant_unref) +NM_AUTO_DEFINE_FCN0 (GVariant *, gs_local_variant_unref, g_variant_unref) /** * gs_unref_array: @@ -96,7 +96,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GVariant *, gs_local_variant_unref, g_variant_unref */ #define gs_unref_array __attribute__ ((cleanup(gs_local_array_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GArray *, gs_local_array_unref, g_array_unref) +NM_AUTO_DEFINE_FCN0 (GArray *, gs_local_array_unref, g_array_unref) /** * gs_unref_ptrarray: @@ -107,7 +107,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GArray *, gs_local_array_unref, g_array_unref) */ #define gs_unref_ptrarray __attribute__ ((cleanup(gs_local_ptrarray_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) +NM_AUTO_DEFINE_FCN0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) /** * gs_unref_hashtable: @@ -117,7 +117,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_u * be %NULL. */ #define gs_unref_hashtable __attribute__ ((cleanup(gs_local_hashtable_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) +NM_AUTO_DEFINE_FCN0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) /** * gs_free_slist: @@ -126,7 +126,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GHashTable *, gs_local_hashtable_unref, g_hash_tabl * of scope. */ #define gs_free_slist __attribute__ ((cleanup(gs_local_free_slist))) -GS_DEFINE_CLEANUP_FUNCTION (GSList *, gs_local_free_slist, g_slist_free) +NM_AUTO_DEFINE_FCN (GSList *, gs_local_free_slist, g_slist_free) /** * gs_unref_bytes: @@ -136,7 +136,7 @@ GS_DEFINE_CLEANUP_FUNCTION (GSList *, gs_local_free_slist, g_slist_free) * be %NULL. */ #define gs_unref_bytes __attribute__ ((cleanup(gs_local_bytes_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) +NM_AUTO_DEFINE_FCN0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) /** * gs_strfreev: @@ -144,7 +144,7 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) * Call g_strfreev() on a variable location when it goes out of scope. */ #define gs_strfreev __attribute__ ((cleanup(gs_local_strfreev))) -GS_DEFINE_CLEANUP_FUNCTION (char **, gs_local_strfreev, g_strfreev) +NM_AUTO_DEFINE_FCN (char **, gs_local_strfreev, g_strfreev) /** * gs_free_error: @@ -152,7 +152,7 @@ GS_DEFINE_CLEANUP_FUNCTION (char **, gs_local_strfreev, g_strfreev) * Call g_error_free() on a variable location when it goes out of scope. */ #define gs_free_error __attribute__ ((cleanup(gs_local_free_error))) -GS_DEFINE_CLEANUP_FUNCTION0 (GError *, gs_local_free_error, g_error_free) +NM_AUTO_DEFINE_FCN0 (GError *, gs_local_free_error, g_error_free) /** * gs_unref_keyfile: @@ -160,6 +160,6 @@ GS_DEFINE_CLEANUP_FUNCTION0 (GError *, gs_local_free_error, g_error_free) * Call g_key_file_unref() on a variable location when it goes out of scope. */ #define gs_unref_keyfile __attribute__ ((cleanup(gs_local_keyfile_unref))) -GS_DEFINE_CLEANUP_FUNCTION0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) +NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) #endif diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index a9ea7487d3..2b018adcdb 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -81,19 +81,19 @@ static inline int nm_close (int fd); * However, let's never mix them. To free malloc'ed memory, always use * free() or nm_auto_free. */ -GS_DEFINE_CLEANUP_FUNCTION_VOID (void *, _nm_auto_free_impl, free) +NM_AUTO_DEFINE_FCN_VOID (void *, _nm_auto_free_impl, free) #define nm_auto_free nm_auto(_nm_auto_free_impl) -GS_DEFINE_CLEANUP_FUNCTION0 (GVariantIter *, _nm_auto_free_variant_iter, g_variant_iter_free) +NM_AUTO_DEFINE_FCN0 (GVariantIter *, _nm_auto_free_variant_iter, g_variant_iter_free) #define nm_auto_free_variant_iter __attribute__ ((cleanup(_nm_auto_free_variant_iter))) -GS_DEFINE_CLEANUP_FUNCTION0 (GVariantBuilder *, _nm_auto_unref_variant_builder, g_variant_builder_unref) +NM_AUTO_DEFINE_FCN0 (GVariantBuilder *, _nm_auto_unref_variant_builder, g_variant_builder_unref) #define nm_auto_unref_variant_builder __attribute__ ((cleanup(_nm_auto_unref_variant_builder))) -GS_DEFINE_CLEANUP_FUNCTION (GList *, _nm_auto_free_list, g_list_free) +NM_AUTO_DEFINE_FCN (GList *, _nm_auto_free_list, g_list_free) #define nm_auto_free_list __attribute__ ((cleanup(_nm_auto_free_list))) -GS_DEFINE_CLEANUP_FUNCTION0 (GChecksum *, _nm_auto_checksum_free, g_checksum_free) +NM_AUTO_DEFINE_FCN0 (GChecksum *, _nm_auto_checksum_free, g_checksum_free) #define nm_auto_free_checksum __attribute__ ((cleanup(_nm_auto_checksum_free))) static inline void From c2245e3e5c1aef4d4570ae46d3ea6fe506f9917f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:52:50 +0200 Subject: [PATCH 6/9] shared/trivial: whitespace --- shared/nm-utils/gsystem-local-alloc.h | 50 ++++++++++++--------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h index 2fee969802..7c60a60ad9 100644 --- a/shared/nm-utils/gsystem-local-alloc.h +++ b/shared/nm-utils/gsystem-local-alloc.h @@ -22,42 +22,36 @@ #define __GSYSTEM_LOCAL_ALLOC_H__ #define NM_AUTO_DEFINE_FCN_VOID(CastType, name, func) \ - static inline void name (void *v) \ - { \ - func (*((CastType *) v)); \ - } +static inline void name (void *v) \ +{ \ + func (*((CastType *) v)); \ +} #define NM_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \ - static inline void name (void *v) \ - { \ - if (*((CastType *) v)) \ - func (*((CastType *) v)); \ - } +static inline void name (void *v) \ +{ \ + if (*((CastType *) v)) \ + func (*((CastType *) v)); \ +} #define NM_AUTO_DEFINE_FCN(Type, name, func) \ - static inline void name (Type *v) \ - { \ - func (*v); \ - } +static inline void name (Type *v) \ +{ \ + func (*v); \ +} #define NM_AUTO_DEFINE_FCN0(Type, name, func) \ - static inline void name (Type *v) \ - { \ - if (*v) \ - func (*v); \ - } +static inline void name (Type *v) \ +{ \ + if (*v) \ + func (*v); \ +} #define NM_AUTO_DEFINE_FCN_STRUCT(Type, name, func) \ - static inline void name (Type *v) \ - { \ - func (v); \ - } - -/* These functions shouldn't be invoked directly; - * they are stubs that: - * 1) Take a pointer to the location (typically itself a pointer). - * 2) Provide %NULL-safety where it doesn't exist already (e.g. g_object_unref) - */ +static inline void name (Type *v) \ +{ \ + func (v); \ +} /** * gs_free: From e9d9fc3fa029a9a135093bf102145459e4b21199 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 16:55:12 +0200 Subject: [PATCH 7/9] shared/gsystem-local-alloc: merge "gsystem-local-alloc.h" into "nm-macros-shared.h" We only have a certain granularity of how our headers in "shared/nm-utils" can be used independently. For example, it's not supported to use "nm-macros-internal.h" without "gsystem-local-alloc.h". Likewise, you cannot use "nm-glib.h" directly, you always get it together with "nm-macros-internal.h". This is, we don't support to use certain headers entirely independently, because usually you anyway want to use them together. As such, no longer support "gsystem-local-alloc.h", but merge the remainder into "nm-macros-internal.h". There is really no reason to support arbitrary flexibility of including individual bits. You want cleanup-macros? Include "nm-macros-internal.h". Merge the headers. --- Makefile.am | 1 - shared/nm-utils/gsystem-local-alloc.h | 159 -------------------------- shared/nm-utils/nm-glib.h | 7 -- shared/nm-utils/nm-macros-internal.h | 145 +++++++++++++++++++++++ 4 files changed, 145 insertions(+), 167 deletions(-) delete mode 100644 shared/nm-utils/gsystem-local-alloc.h diff --git a/Makefile.am b/Makefile.am index 353f57fb81..c56e3d4d93 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4702,7 +4702,6 @@ EXTRA_DIST += \ shared/nm-test-utils-impl.c \ shared/nm-utils/c-list-util.c \ shared/nm-utils/c-list-util.h \ - shared/nm-utils/gsystem-local-alloc.h \ shared/nm-utils/nm-c-list.h \ shared/nm-utils/nm-compat.c \ shared/nm-utils/nm-compat.h \ diff --git a/shared/nm-utils/gsystem-local-alloc.h b/shared/nm-utils/gsystem-local-alloc.h deleted file mode 100644 index 7c60a60ad9..0000000000 --- a/shared/nm-utils/gsystem-local-alloc.h +++ /dev/null @@ -1,159 +0,0 @@ -/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- - * - * Copyright (C) 2012 Colin Walters . - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GSYSTEM_LOCAL_ALLOC_H__ -#define __GSYSTEM_LOCAL_ALLOC_H__ - -#define NM_AUTO_DEFINE_FCN_VOID(CastType, name, func) \ -static inline void name (void *v) \ -{ \ - func (*((CastType *) v)); \ -} - -#define NM_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \ -static inline void name (void *v) \ -{ \ - if (*((CastType *) v)) \ - func (*((CastType *) v)); \ -} - -#define NM_AUTO_DEFINE_FCN(Type, name, func) \ -static inline void name (Type *v) \ -{ \ - func (*v); \ -} - -#define NM_AUTO_DEFINE_FCN0(Type, name, func) \ -static inline void name (Type *v) \ -{ \ - if (*v) \ - func (*v); \ -} - -#define NM_AUTO_DEFINE_FCN_STRUCT(Type, name, func) \ -static inline void name (Type *v) \ -{ \ - func (v); \ -} - -/** - * gs_free: - * - * Call g_free() on a variable location when it goes out of scope. - */ -#define gs_free __attribute__ ((cleanup(gs_local_free))) -NM_AUTO_DEFINE_FCN_VOID (void *, gs_local_free, g_free) - -/** - * gs_unref_object: - * - * Call g_object_unref() on a variable location when it goes out of - * scope. Note that unlike g_object_unref(), the variable may be - * %NULL. - */ -#define gs_unref_object __attribute__ ((cleanup(gs_local_obj_unref))) -NM_AUTO_DEFINE_FCN_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) - -/** - * gs_unref_variant: - * - * Call g_variant_unref() on a variable location when it goes out of - * scope. Note that unlike g_variant_unref(), the variable may be - * %NULL. - */ -#define gs_unref_variant __attribute__ ((cleanup(gs_local_variant_unref))) -NM_AUTO_DEFINE_FCN0 (GVariant *, gs_local_variant_unref, g_variant_unref) - -/** - * gs_unref_array: - * - * Call g_array_unref() on a variable location when it goes out of - * scope. Note that unlike g_array_unref(), the variable may be - * %NULL. - - */ -#define gs_unref_array __attribute__ ((cleanup(gs_local_array_unref))) -NM_AUTO_DEFINE_FCN0 (GArray *, gs_local_array_unref, g_array_unref) - -/** - * gs_unref_ptrarray: - * - * Call g_ptr_array_unref() on a variable location when it goes out of - * scope. Note that unlike g_ptr_array_unref(), the variable may be - * %NULL. - - */ -#define gs_unref_ptrarray __attribute__ ((cleanup(gs_local_ptrarray_unref))) -NM_AUTO_DEFINE_FCN0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) - -/** - * gs_unref_hashtable: - * - * Call g_hash_table_unref() on a variable location when it goes out - * of scope. Note that unlike g_hash_table_unref(), the variable may - * be %NULL. - */ -#define gs_unref_hashtable __attribute__ ((cleanup(gs_local_hashtable_unref))) -NM_AUTO_DEFINE_FCN0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) - -/** - * gs_free_slist: - * - * Call g_slist_free() on a variable location when it goes out - * of scope. - */ -#define gs_free_slist __attribute__ ((cleanup(gs_local_free_slist))) -NM_AUTO_DEFINE_FCN (GSList *, gs_local_free_slist, g_slist_free) - -/** - * gs_unref_bytes: - * - * Call g_bytes_unref() on a variable location when it goes out - * of scope. Note that unlike g_bytes_unref(), the variable may - * be %NULL. - */ -#define gs_unref_bytes __attribute__ ((cleanup(gs_local_bytes_unref))) -NM_AUTO_DEFINE_FCN0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) - -/** - * gs_strfreev: - * - * Call g_strfreev() on a variable location when it goes out of scope. - */ -#define gs_strfreev __attribute__ ((cleanup(gs_local_strfreev))) -NM_AUTO_DEFINE_FCN (char **, gs_local_strfreev, g_strfreev) - -/** - * gs_free_error: - * - * Call g_error_free() on a variable location when it goes out of scope. - */ -#define gs_free_error __attribute__ ((cleanup(gs_local_free_error))) -NM_AUTO_DEFINE_FCN0 (GError *, gs_local_free_error, g_error_free) - -/** - * gs_unref_keyfile: - * - * Call g_key_file_unref() on a variable location when it goes out of scope. - */ -#define gs_unref_keyfile __attribute__ ((cleanup(gs_local_keyfile_unref))) -NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) - -#endif diff --git a/shared/nm-utils/nm-glib.h b/shared/nm-utils/nm-glib.h index b4d8905564..770cf0fe39 100644 --- a/shared/nm-utils/nm-glib.h +++ b/shared/nm-utils/nm-glib.h @@ -28,13 +28,6 @@ /*****************************************************************************/ -#include -#include - -#include "gsystem-local-alloc.h" - -/*****************************************************************************/ - #ifdef __clang__ #undef G_GNUC_BEGIN_IGNORE_DEPRECATIONS diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index 2b018adcdb..013bfc1257 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -16,6 +16,7 @@ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. * + * (C) Copyright 2012 Colin Walters . * (C) Copyright 2014 Red Hat, Inc. */ @@ -25,6 +26,11 @@ #include #include #include +#include + +#include + +/*****************************************************************************/ #define _nm_packed __attribute__ ((packed)) #define _nm_unused __attribute__ ((unused)) @@ -57,6 +63,145 @@ /*****************************************************************************/ +#define NM_AUTO_DEFINE_FCN_VOID(CastType, name, func) \ +static inline void name (void *v) \ +{ \ + func (*((CastType *) v)); \ +} + +#define NM_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \ +static inline void name (void *v) \ +{ \ + if (*((CastType *) v)) \ + func (*((CastType *) v)); \ +} + +#define NM_AUTO_DEFINE_FCN(Type, name, func) \ +static inline void name (Type *v) \ +{ \ + func (*v); \ +} + +#define NM_AUTO_DEFINE_FCN0(Type, name, func) \ +static inline void name (Type *v) \ +{ \ + if (*v) \ + func (*v); \ +} + +#define NM_AUTO_DEFINE_FCN_STRUCT(Type, name, func) \ +static inline void name (Type *v) \ +{ \ + func (v); \ +} + +/*****************************************************************************/ + +/** + * gs_free: + * + * Call g_free() on a variable location when it goes out of scope. + */ +#define gs_free __attribute__ ((cleanup(gs_local_free))) +NM_AUTO_DEFINE_FCN_VOID (void *, gs_local_free, g_free) + +/** + * gs_unref_object: + * + * Call g_object_unref() on a variable location when it goes out of + * scope. Note that unlike g_object_unref(), the variable may be + * %NULL. + */ +#define gs_unref_object __attribute__ ((cleanup(gs_local_obj_unref))) +NM_AUTO_DEFINE_FCN_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) + +/** + * gs_unref_variant: + * + * Call g_variant_unref() on a variable location when it goes out of + * scope. Note that unlike g_variant_unref(), the variable may be + * %NULL. + */ +#define gs_unref_variant __attribute__ ((cleanup(gs_local_variant_unref))) +NM_AUTO_DEFINE_FCN0 (GVariant *, gs_local_variant_unref, g_variant_unref) + +/** + * gs_unref_array: + * + * Call g_array_unref() on a variable location when it goes out of + * scope. Note that unlike g_array_unref(), the variable may be + * %NULL. + + */ +#define gs_unref_array __attribute__ ((cleanup(gs_local_array_unref))) +NM_AUTO_DEFINE_FCN0 (GArray *, gs_local_array_unref, g_array_unref) + +/** + * gs_unref_ptrarray: + * + * Call g_ptr_array_unref() on a variable location when it goes out of + * scope. Note that unlike g_ptr_array_unref(), the variable may be + * %NULL. + + */ +#define gs_unref_ptrarray __attribute__ ((cleanup(gs_local_ptrarray_unref))) +NM_AUTO_DEFINE_FCN0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) + +/** + * gs_unref_hashtable: + * + * Call g_hash_table_unref() on a variable location when it goes out + * of scope. Note that unlike g_hash_table_unref(), the variable may + * be %NULL. + */ +#define gs_unref_hashtable __attribute__ ((cleanup(gs_local_hashtable_unref))) +NM_AUTO_DEFINE_FCN0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) + +/** + * gs_free_slist: + * + * Call g_slist_free() on a variable location when it goes out + * of scope. + */ +#define gs_free_slist __attribute__ ((cleanup(gs_local_free_slist))) +NM_AUTO_DEFINE_FCN (GSList *, gs_local_free_slist, g_slist_free) + +/** + * gs_unref_bytes: + * + * Call g_bytes_unref() on a variable location when it goes out + * of scope. Note that unlike g_bytes_unref(), the variable may + * be %NULL. + */ +#define gs_unref_bytes __attribute__ ((cleanup(gs_local_bytes_unref))) +NM_AUTO_DEFINE_FCN0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) + +/** + * gs_strfreev: + * + * Call g_strfreev() on a variable location when it goes out of scope. + */ +#define gs_strfreev __attribute__ ((cleanup(gs_local_strfreev))) +NM_AUTO_DEFINE_FCN (char **, gs_local_strfreev, g_strfreev) + +/** + * gs_free_error: + * + * Call g_error_free() on a variable location when it goes out of scope. + */ +#define gs_free_error __attribute__ ((cleanup(gs_local_free_error))) +NM_AUTO_DEFINE_FCN0 (GError *, gs_local_free_error, g_error_free) + +/** + * gs_unref_keyfile: + * + * Call g_key_file_unref() on a variable location when it goes out of scope. + */ +#define gs_unref_keyfile __attribute__ ((cleanup(gs_local_keyfile_unref))) +NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) + +/*****************************************************************************/ + #include "nm-glib.h" /*****************************************************************************/ From d0b3702b37701b2835eb6922258ceee3bd13e870 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jul 2018 17:40:26 +0200 Subject: [PATCH 8/9] shared: cleanup nm_auto implementations - Reuse NM_AUTO_DEFINE*() where possible. - Consistently name the cleanup functions for "nm_auto_xzy" as _nm_auto_xzy(). --- shared/nm-utils/nm-macros-internal.h | 66 +++++++++++----------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index 013bfc1257..72b4cd44af 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -208,9 +208,12 @@ NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) #define nm_offsetofend(t,m) (G_STRUCT_OFFSET (t,m) + sizeof (((t *) NULL)->m)) -#define nm_auto(fcn) __attribute__ ((cleanup(fcn))) +/*****************************************************************************/ static inline int nm_close (int fd); +static inline void nm_free_secret (char *secret); + +#define nm_auto(fcn) __attribute__ ((cleanup(fcn))) /** * nm_auto_free: @@ -241,21 +244,7 @@ NM_AUTO_DEFINE_FCN (GList *, _nm_auto_free_list, g_list_free) NM_AUTO_DEFINE_FCN0 (GChecksum *, _nm_auto_checksum_free, g_checksum_free) #define nm_auto_free_checksum __attribute__ ((cleanup(_nm_auto_checksum_free))) -static inline void -nm_free_secret (char *secret) -{ - if (secret) { - memset (secret, 0, strlen (secret)); - g_free (secret); - } -} - -static inline void -_nm_auto_free_secret_impl (char **v) -{ - nm_free_secret (*v); -} - +NM_AUTO_DEFINE_FCN (char *, _nm_auto_free_secret, nm_free_secret) /** * nm_auto_free_secret: * @@ -263,33 +252,24 @@ _nm_auto_free_secret_impl (char **v) * Also, previously, calls memset(loc, 0, strlen(loc)) to clear out * the secret. */ -#define nm_auto_free_secret nm_auto(_nm_auto_free_secret_impl) +#define nm_auto_free_secret nm_auto(_nm_auto_free_secret) -static inline void -_nm_auto_unset_gvalue_impl (GValue *v) -{ - g_value_unset (v); -} -#define nm_auto_unset_gvalue nm_auto(_nm_auto_unset_gvalue_impl) +NM_AUTO_DEFINE_FCN_STRUCT (GValue, _nm_auto_unset_gvalue, g_value_unset) +#define nm_auto_unset_gvalue nm_auto(_nm_auto_unset_gvalue) -static inline void -_nm_auto_unref_gtypeclass (gpointer v) -{ - if (v && *((gpointer *) v)) - g_type_class_unref (*((gpointer *) v)); -} +NM_AUTO_DEFINE_FCN_VOID0 (void *, _nm_auto_unref_gtypeclass, g_type_class_unref) #define nm_auto_unref_gtypeclass nm_auto(_nm_auto_unref_gtypeclass) static inline void -_nm_auto_free_gstring_impl (GString **str) +_nm_auto_free_gstring (GString **str) { if (*str) g_string_free (*str, TRUE); } -#define nm_auto_free_gstring nm_auto(_nm_auto_free_gstring_impl) +#define nm_auto_free_gstring nm_auto(_nm_auto_free_gstring) static inline void -_nm_auto_close_impl (int *pfd) +_nm_auto_close (int *pfd) { if (*pfd >= 0) { int errsv = errno; @@ -298,10 +278,10 @@ _nm_auto_close_impl (int *pfd) errno = errsv; } } -#define nm_auto_close nm_auto(_nm_auto_close_impl) +#define nm_auto_close nm_auto(_nm_auto_close) static inline void -_nm_auto_fclose_impl (FILE **pfd) +_nm_auto_fclose (FILE **pfd) { if (*pfd) { int errsv = errno; @@ -310,7 +290,7 @@ _nm_auto_fclose_impl (FILE **pfd) errno = errsv; } } -#define nm_auto_fclose nm_auto(_nm_auto_fclose_impl) +#define nm_auto_fclose nm_auto(_nm_auto_fclose) static inline void _nm_auto_protect_errno (int *p_saved_errno) @@ -319,12 +299,7 @@ _nm_auto_protect_errno (int *p_saved_errno) } #define NM_AUTO_PROTECT_ERRNO(errsv_saved) nm_auto(_nm_auto_protect_errno) _nm_unused const int errsv_saved = (errno) -static inline void -_nm_auto_unref_gsource (GSource **ptr) -{ - if (*ptr) - g_source_unref (g_steal_pointer (ptr)); -} +NM_AUTO_DEFINE_FCN0 (GSource *, _nm_auto_unref_gsource, g_source_unref); #define nm_auto_unref_gsource nm_auto(_nm_auto_unref_gsource) static inline void @@ -856,6 +831,15 @@ fcn (void) \ /*****************************************************************************/ +static inline void +nm_free_secret (char *secret) +{ + if (secret) { + memset (secret, 0, strlen (secret)); + g_free (secret); + } +} + static inline GString * nm_gstring_prepare (GString **l) { From 196d7c8ca5ab758661b652a86980575eb8b9ce62 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 18 Jul 2018 10:27:20 +0200 Subject: [PATCH 9/9] shared: use nm_auto() macro to define other nm_auto_* macros --- shared/nm-utils/nm-macros-internal.h | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/shared/nm-utils/nm-macros-internal.h b/shared/nm-utils/nm-macros-internal.h index 72b4cd44af..6d5e25b28c 100644 --- a/shared/nm-utils/nm-macros-internal.h +++ b/shared/nm-utils/nm-macros-internal.h @@ -40,6 +40,8 @@ #define _nm_align(s) __attribute__ ((aligned (s))) #define _nm_alignof(type) __alignof (type) #define _nm_alignas(type) _nm_align (_nm_alignof (type)) +#define nm_auto(fcn) __attribute__ ((cleanup(fcn))) + #if __GNUC__ >= 7 #define _nm_fallthrough __attribute__ ((fallthrough)) @@ -102,7 +104,7 @@ static inline void name (Type *v) \ * * Call g_free() on a variable location when it goes out of scope. */ -#define gs_free __attribute__ ((cleanup(gs_local_free))) +#define gs_free nm_auto(gs_local_free) NM_AUTO_DEFINE_FCN_VOID (void *, gs_local_free, g_free) /** @@ -112,7 +114,7 @@ NM_AUTO_DEFINE_FCN_VOID (void *, gs_local_free, g_free) * scope. Note that unlike g_object_unref(), the variable may be * %NULL. */ -#define gs_unref_object __attribute__ ((cleanup(gs_local_obj_unref))) +#define gs_unref_object nm_auto(gs_local_obj_unref) NM_AUTO_DEFINE_FCN_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) /** @@ -122,7 +124,7 @@ NM_AUTO_DEFINE_FCN_VOID0 (GObject *, gs_local_obj_unref, g_object_unref) * scope. Note that unlike g_variant_unref(), the variable may be * %NULL. */ -#define gs_unref_variant __attribute__ ((cleanup(gs_local_variant_unref))) +#define gs_unref_variant nm_auto(gs_local_variant_unref) NM_AUTO_DEFINE_FCN0 (GVariant *, gs_local_variant_unref, g_variant_unref) /** @@ -133,7 +135,7 @@ NM_AUTO_DEFINE_FCN0 (GVariant *, gs_local_variant_unref, g_variant_unref) * %NULL. */ -#define gs_unref_array __attribute__ ((cleanup(gs_local_array_unref))) +#define gs_unref_array nm_auto(gs_local_array_unref) NM_AUTO_DEFINE_FCN0 (GArray *, gs_local_array_unref, g_array_unref) /** @@ -144,7 +146,7 @@ NM_AUTO_DEFINE_FCN0 (GArray *, gs_local_array_unref, g_array_unref) * %NULL. */ -#define gs_unref_ptrarray __attribute__ ((cleanup(gs_local_ptrarray_unref))) +#define gs_unref_ptrarray nm_auto(gs_local_ptrarray_unref) NM_AUTO_DEFINE_FCN0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) /** @@ -154,7 +156,7 @@ NM_AUTO_DEFINE_FCN0 (GPtrArray *, gs_local_ptrarray_unref, g_ptr_array_unref) * of scope. Note that unlike g_hash_table_unref(), the variable may * be %NULL. */ -#define gs_unref_hashtable __attribute__ ((cleanup(gs_local_hashtable_unref))) +#define gs_unref_hashtable nm_auto(gs_local_hashtable_unref) NM_AUTO_DEFINE_FCN0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) /** @@ -163,7 +165,7 @@ NM_AUTO_DEFINE_FCN0 (GHashTable *, gs_local_hashtable_unref, g_hash_table_unref) * Call g_slist_free() on a variable location when it goes out * of scope. */ -#define gs_free_slist __attribute__ ((cleanup(gs_local_free_slist))) +#define gs_free_slist nm_auto(gs_local_free_slist) NM_AUTO_DEFINE_FCN (GSList *, gs_local_free_slist, g_slist_free) /** @@ -173,7 +175,7 @@ NM_AUTO_DEFINE_FCN (GSList *, gs_local_free_slist, g_slist_free) * of scope. Note that unlike g_bytes_unref(), the variable may * be %NULL. */ -#define gs_unref_bytes __attribute__ ((cleanup(gs_local_bytes_unref))) +#define gs_unref_bytes nm_auto(gs_local_bytes_unref) NM_AUTO_DEFINE_FCN0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) /** @@ -181,7 +183,7 @@ NM_AUTO_DEFINE_FCN0 (GBytes *, gs_local_bytes_unref, g_bytes_unref) * * Call g_strfreev() on a variable location when it goes out of scope. */ -#define gs_strfreev __attribute__ ((cleanup(gs_local_strfreev))) +#define gs_strfreev nm_auto(gs_local_strfreev) NM_AUTO_DEFINE_FCN (char **, gs_local_strfreev, g_strfreev) /** @@ -189,7 +191,7 @@ NM_AUTO_DEFINE_FCN (char **, gs_local_strfreev, g_strfreev) * * Call g_error_free() on a variable location when it goes out of scope. */ -#define gs_free_error __attribute__ ((cleanup(gs_local_free_error))) +#define gs_free_error nm_auto(gs_local_free_error) NM_AUTO_DEFINE_FCN0 (GError *, gs_local_free_error, g_error_free) /** @@ -197,7 +199,7 @@ NM_AUTO_DEFINE_FCN0 (GError *, gs_local_free_error, g_error_free) * * Call g_key_file_unref() on a variable location when it goes out of scope. */ -#define gs_unref_keyfile __attribute__ ((cleanup(gs_local_keyfile_unref))) +#define gs_unref_keyfile nm_auto(gs_local_keyfile_unref) NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) /*****************************************************************************/ @@ -213,8 +215,6 @@ NM_AUTO_DEFINE_FCN0 (GKeyFile *, gs_local_keyfile_unref, g_key_file_unref) static inline int nm_close (int fd); static inline void nm_free_secret (char *secret); -#define nm_auto(fcn) __attribute__ ((cleanup(fcn))) - /** * nm_auto_free: * @@ -233,16 +233,16 @@ NM_AUTO_DEFINE_FCN_VOID (void *, _nm_auto_free_impl, free) #define nm_auto_free nm_auto(_nm_auto_free_impl) NM_AUTO_DEFINE_FCN0 (GVariantIter *, _nm_auto_free_variant_iter, g_variant_iter_free) -#define nm_auto_free_variant_iter __attribute__ ((cleanup(_nm_auto_free_variant_iter))) +#define nm_auto_free_variant_iter nm_auto(_nm_auto_free_variant_iter) NM_AUTO_DEFINE_FCN0 (GVariantBuilder *, _nm_auto_unref_variant_builder, g_variant_builder_unref) -#define nm_auto_unref_variant_builder __attribute__ ((cleanup(_nm_auto_unref_variant_builder))) +#define nm_auto_unref_variant_builder nm_auto(_nm_auto_unref_variant_builder) NM_AUTO_DEFINE_FCN (GList *, _nm_auto_free_list, g_list_free) -#define nm_auto_free_list __attribute__ ((cleanup(_nm_auto_free_list))) +#define nm_auto_free_list nm_auto(_nm_auto_free_list) NM_AUTO_DEFINE_FCN0 (GChecksum *, _nm_auto_checksum_free, g_checksum_free) -#define nm_auto_free_checksum __attribute__ ((cleanup(_nm_auto_checksum_free))) +#define nm_auto_free_checksum nm_auto(_nm_auto_checksum_free) NM_AUTO_DEFINE_FCN (char *, _nm_auto_free_secret, nm_free_secret) /**