[virt-tools-list] [virt-viewer 2/2] Fix compilation with older glib versions

Christophe Fergeau cfergeau at redhat.com
Wed Mar 20 14:42:27 UTC 2013


Recent commits introduced use of g_clear_object and
g_byte_array_new_take which are only present respectively in glib
2.28 and 2.32
---
 src/Makefile.am        |  1 +
 src/virt-glib-compat.c | 32 ++++++++++++++++++++++++++++++++
 src/virt-glib-compat.h | 20 ++++++++++++++++++++
 3 files changed, 53 insertions(+)
 create mode 100644 src/virt-glib-compat.c

diff --git a/src/Makefile.am b/src/Makefile.am
index d14ab01..27420cb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -35,6 +35,7 @@ $(BUILT_SOURCES): %: %.etemplate $(ENUMS_FILES)
 COMMON_SOURCES =					\
 	$(BUILT_SOURCES)				\
 	virt-glib-compat.h				\
+	virt-glib-compat.c				\
 	virt-gtk-compat.h				\
 	virt-viewer-util.h virt-viewer-util.c		\
 	virt-viewer-auth.h virt-viewer-auth.c		\
diff --git a/src/virt-glib-compat.c b/src/virt-glib-compat.c
new file mode 100644
index 0000000..54cce62
--- /dev/null
+++ b/src/virt-glib-compat.c
@@ -0,0 +1,32 @@
+/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/*
+   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.1 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, see <http://www.gnu.org/licenses/>.
+*/
+#include "virt-glib-compat.h"
+
+#if !GLIB_CHECK_VERSION(2,32,0)
+GByteArray *g_byte_array_new_take (guint8 *data, gsize len)
+{
+  GByteArray *array;
+
+  array = g_byte_array_new ();
+  g_assert (array->data == NULL);
+  g_assert (array->len == 0);
+
+  array->data = data;
+  array->len = len;
+
+  return array;
+}
+#endif
diff --git a/src/virt-glib-compat.h b/src/virt-glib-compat.h
index 23345a0..37b6f61 100644
--- a/src/virt-glib-compat.h
+++ b/src/virt-glib-compat.h
@@ -51,6 +51,26 @@ G_BEGIN_DECLS
   } G_STMT_END
 #endif
 
+#if !GLIB_CHECK_VERSION(2,28,0)
+#define g_clear_object(object_ptr) \
+  G_STMT_START {                                                             \
+    /* Only one access, please */                                            \
+    gpointer *_p = (gpointer) (object_ptr);                                  \
+    gpointer _o;                                                             \
+                                                                             \
+    do                                                                       \
+      _o = g_atomic_pointer_get (_p);                                        \
+    while G_UNLIKELY (!g_atomic_pointer_compare_and_exchange (_p, _o, NULL));\
+                                                                             \
+    if (_o)                                                                  \
+      g_object_unref (_o);                                                   \
+  } G_STMT_END
+#endif
+
+#if !GLIB_CHECK_VERSION(2,32,0)
+GByteArray *g_byte_array_new_take (guint8 *data, gsize len);
+#endif
+
 G_END_DECLS
 
 #endif // _VIRT_GLIB_COMPAT_H
-- 
1.8.1.4




More information about the virt-tools-list mailing list