From 46ba6b4187ea7e70caeef4bee144a932c6bf84ca Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 1 May 2019 19:57:18 +0100 Subject: backports: Add a backport of g_clear_pointer() This will be necessary if targeting GLib versions older than 2.34, such as GLib 2.32 in Ubuntu 12.04 and the Steam Runtime. Signed-off-by: Simon McVittie --- glnx-backports.h | 20 ++++++++++++++++++++ glnx-fdio.c | 1 + 2 files changed, 21 insertions(+) diff --git a/glnx-backports.h b/glnx-backports.h index cd853cc..b6d93c0 100644 --- a/glnx-backports.h +++ b/glnx-backports.h @@ -27,6 +27,26 @@ G_BEGIN_DECLS +#if !GLIB_CHECK_VERSION(2, 34, 0) +#define g_clear_pointer(pp, destroy) \ + G_STMT_START { \ + G_STATIC_ASSERT (sizeof *(pp) == sizeof (gpointer)); \ + /* Only one access, please; work around type aliasing */ \ + union { char *in; gpointer *out; } _pp; \ + gpointer _p; \ + /* This assignment is needed to avoid a gcc warning */ \ + GDestroyNotify _destroy = (GDestroyNotify) (destroy); \ + \ + _pp.in = (char *) (pp); \ + _p = *_pp.out; \ + if (_p) \ + { \ + *_pp.out = NULL; \ + _destroy (_p); \ + } \ + } G_STMT_END +#endif + #if !GLIB_CHECK_VERSION(2, 44, 0) #define g_strv_contains glnx_strv_contains diff --git a/glnx-fdio.c b/glnx-fdio.c index 12879cd..31bb15d 100644 --- a/glnx-fdio.c +++ b/glnx-fdio.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include -- cgit v1.2.1 From c8216c90ed8eedae574b01ac63449f6c9b3f7dda Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 1 May 2019 18:24:22 +0100 Subject: backport-autocleanups: Hide autocleanups for types we don't have If you're building on a really old GLib, you might not have GTask, GSubprocess or g_markup_parse_context_unref(), among others. This gets libglnx compiling (and apparently working) on GLib versions as old as 2.32. Signed-off-by: Simon McVittie --- glnx-backport-autocleanups.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/glnx-backport-autocleanups.h b/glnx-backport-autocleanups.h index b5f3475..50f469f 100644 --- a/glnx-backport-autocleanups.h +++ b/glnx-backport-autocleanups.h @@ -49,7 +49,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMainContext, g_main_context_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMainLoop, g_main_loop_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSource, g_source_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMappedFile, g_mapped_file_unref) +#if GLIB_CHECK_VERSION(2, 36, 0) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMarkupParseContext, g_markup_parse_context_unref) +#endif G_DEFINE_AUTOPTR_CLEANUP_FUNC(gchar, g_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GNode, g_node_destroy) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOptionContext, g_option_context_free) @@ -75,11 +77,15 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariant, g_variant_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantBuilder, g_variant_builder_unref) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantBuilder, g_variant_builder_clear) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantIter, g_variant_iter_free) +#if GLIB_CHECK_VERSION(2, 40, 0) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantDict, g_variant_dict_unref) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantDict, g_variant_dict_clear) +#endif G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantType, g_variant_type_free) +#if GLIB_CHECK_VERSION(2, 40, 0) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSubprocess, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSubprocessLauncher, g_object_unref) +#endif /* Add GObject-based types as needed. */ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAsyncResult, g_object_unref) @@ -101,7 +107,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GMount, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GOutputStream, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSocket, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GSocketAddress, g_object_unref) +#if GLIB_CHECK_VERSION(2, 36, 0) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTask, g_object_unref) +#endif G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTlsCertificate, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTlsDatabase, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTlsInteraction, g_object_unref) -- cgit v1.2.1 From 3063c69515dcda9129ebea989d4c95341f0c1e9f Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 2 May 2019 15:51:42 +0100 Subject: Make tests cope with older GLib Signed-off-by: Simon McVittie --- glnx-backports.h | 12 ++++++++++++ tests/test-libglnx-xattrs.c | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/glnx-backports.h b/glnx-backports.h index b6d93c0..6c39cf2 100644 --- a/glnx-backports.h +++ b/glnx-backports.h @@ -63,4 +63,16 @@ gboolean glnx_set_object (GObject **object_ptr, #endif /* !GLIB_CHECK_VERSION(2, 44, 0) */ +#ifndef g_assert_nonnull +#define g_assert_nonnull(x) g_assert (x != NULL) +#endif + +#ifndef g_assert_null +#define g_assert_null(x) g_assert (x == NULL) +#endif + +#if !GLIB_CHECK_VERSION (2, 38, 0) +#define g_test_skip(s) g_test_message ("SKIP: %s", s) +#endif + G_END_DECLS diff --git a/tests/test-libglnx-xattrs.c b/tests/test-libglnx-xattrs.c index 63e1231..82def4a 100644 --- a/tests/test-libglnx-xattrs.c +++ b/tests/test-libglnx-xattrs.c @@ -218,7 +218,11 @@ test_xattr_races (void) /* FIXME - this deadlocks for me on 4.9.4-201.fc25.x86_64, whether * using overlayfs or xfs as source/dest. */ +#if GLIB_CHECK_VERSION (2, 36, 0) const guint nprocs = MAX (4, g_get_num_processors ()); +#else + const guint nprocs = 4; +#endif struct XattrWorker wdata[nprocs]; GThread *threads[nprocs]; g_autoptr(GError) local_error = NULL; -- cgit v1.2.1