[spice-gtk] New upstream release 0.8 Various small specfile improvements Enable vala bindings

Hans de Goede jwrdegoede at fedoraproject.org
Tue Jan 17 13:42:23 UTC 2012


commit 9c8f0e1ee5a072359bfb04166dc99cf2b595f4d5
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Tue Jan 17 14:43:28 2012 +0100

    New upstream release 0.8
    Various small specfile improvements
    Enable vala bindings

 .gitignore                                         |    1 +
 0001-Handle-spice_audio_new-failures.patch         |   32 +++++
 ...el-Allow-calling-spice_msg_out_send-from-.patch |  141 ++++++++++++++++++++
 sources                                            |    2 +-
 spice-gtk-controller-includes.patch                |   20 ---
 spice-gtk.spec                                     |   85 ++++++++----
 6 files changed, 234 insertions(+), 47 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index c87e041..57e959b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@
 /spice-gtk-0.7.tar.bz2
 /spice-gtk-0.7.1-d5a8.tar.bz2
 /spice-gtk-0.7.39-ab64.tar.bz2
+/spice-gtk-0.8.tar.bz2
diff --git a/0001-Handle-spice_audio_new-failures.patch b/0001-Handle-spice_audio_new-failures.patch
new file mode 100644
index 0000000..17fb08f
--- /dev/null
+++ b/0001-Handle-spice_audio_new-failures.patch
@@ -0,0 +1,32 @@
+From 424c67ab1e6be34a35a5133f6037950b8bcb25b7 Mon Sep 17 00:00:00 2001
+From: Christophe Fergeau <cfergeau at redhat.com>
+Date: Fri, 13 Jan 2012 19:19:40 +0100
+Subject: [PATCH spice-gtk 1/3] Handle spice_audio_new failures
+
+spice_audio_new can return a NULL pointer when there's a failure
+during the initialization of the audio system. When this happens,
+we shouldn't keep initializing the spice audio channel as if nothing
+happened, but just stop the connection.
+This can be tested by forcing the "self" variable to NULL in
+spice_audio_new
+This should fix https://bugzilla.redhat.com/show_bug.cgi?id=772118
+---
+ gtk/spice-audio.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/gtk/spice-audio.c b/gtk/spice-audio.c
+index f58a81e..3d6e34c 100644
+--- a/gtk/spice-audio.c
++++ b/gtk/spice-audio.c
+@@ -221,6 +221,8 @@ SpiceAudio *spice_audio_new(SpiceSession *session, GMainContext *context,
+ #ifdef WITH_GSTAUDIO
+     self = SPICE_AUDIO(spice_gstaudio_new(session, context, name));
+ #endif
++    if (!self)
++        return NULL;
+ 
+     spice_g_signal_connect_object(session, "notify::enable-audio", G_CALLBACK(session_enable_audio), self, 0);
+     spice_g_signal_connect_object(session, "channel-new", G_CALLBACK(channel_new), self, 0);
+-- 
+1.7.7.4
+
diff --git a/0002-spice-channel-Allow-calling-spice_msg_out_send-from-.patch b/0002-spice-channel-Allow-calling-spice_msg_out_send-from-.patch
new file mode 100644
index 0000000..c512854
--- /dev/null
+++ b/0002-spice-channel-Allow-calling-spice_msg_out_send-from-.patch
@@ -0,0 +1,141 @@
+From 3cf733aa98df7cdceaf8ac25b25802a606a9d6e6 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 16 Jan 2012 15:28:00 +0100
+Subject: [PATCH spice-gtk 3/3] spice-channel: Allow calling
+ spice_msg_out_send from any context
+
+spice_msg_out can be not only called from system context and usb event
+handling thread context, but also from co-routine context. Calling from
+co-routine context happens when a response gets send synchronously from
+the handle_msg handler for a certain received packet. This happens with
+certain usbredir commands.
+
+This triggers the following assert in the coroutine code:
+"GSpice-CRITICAL **: g_coroutine_wakeup: assertion `coroutine !=
+ g_coroutine_self()' failed"
+
+This patch fixes this by making spice_msg_out_send callable from any
+context and at the same time changing the code to not do unnecessary
+wakeups.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ gtk/spice-channel-priv.h |    2 +-
+ gtk/spice-channel.c      |   52 ++++++++++++++++++++++++++++++++++-----------
+ 2 files changed, 40 insertions(+), 14 deletions(-)
+
+diff --git a/gtk/spice-channel-priv.h b/gtk/spice-channel-priv.h
+index ebdc5ce..5cd7ddb 100644
+--- a/gtk/spice-channel-priv.h
++++ b/gtk/spice-channel-priv.h
+@@ -102,7 +102,7 @@ struct _SpiceChannelPrivate {
+     GQueue                      xmit_queue;
+     gboolean                    xmit_queue_blocked;
+     GStaticMutex                xmit_queue_lock;
+-    GThread                     *main_thread;
++    guint                       xmit_queue_wakeup_id;
+ 
+     char                        name[16];
+     enum spice_channel_state    state;
+diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
+index 83cd344..bdfb02b 100644
+--- a/gtk/spice-channel.c
++++ b/gtk/spice-channel.c
+@@ -110,7 +110,6 @@ static void spice_channel_init(SpiceChannel *channel)
+     spice_channel_set_common_capability(channel, SPICE_COMMON_CAP_MINI_HEADER);
+     g_queue_init(&c->xmit_queue);
+     g_static_mutex_init(&c->xmit_queue_lock);
+-    c->main_thread = g_thread_self();
+ }
+ 
+ static void spice_channel_constructed(GObject *gobject)
+@@ -649,14 +648,32 @@ void spice_msg_out_unref(SpiceMsgOut *out)
+ static gboolean spice_channel_idle_wakeup(gpointer user_data)
+ {
+     SpiceChannel *channel = SPICE_CHANNEL(user_data);
++    SpiceChannelPrivate *c = channel->priv;
++
++    /*
++     * Note:
++     *
++     * - This must be done before the wakeup as that may eventually
++     *   call channel_reset() which checks this.
++     * - The lock calls are really necessary, this fixes the following race:
++     *   1) usb-event-thread calls spice_msg_out_send()
++     *   2) spice_msg_out_send calls g_timeout_add_full(...)
++     *   3) we run, set xmit_queue_wakeup_id to 0
++     *   4) spice_msg_out_send stores the result of g_timeout_add_full() in
++     *      xmit_queue_wakeup_id, overwriting the 0 we just stored
++     *   5) xmit_queue_wakeup_id now says there is a wakeup pending which is
++     *      false
++     */
++    g_static_mutex_lock(&c->xmit_queue_lock);
++    c->xmit_queue_wakeup_id = 0;
++    g_static_mutex_unlock(&c->xmit_queue_lock);
+ 
+     spice_channel_wakeup(channel, FALSE);
+-    g_object_unref(channel);
+ 
+     return FALSE;
+ }
+ 
+-/* system context */
++/* any context (system/co-routine/usb-event-thread) */
+ G_GNUC_INTERNAL
+ void spice_msg_out_send(SpiceMsgOut *out)
+ {
+@@ -664,17 +681,23 @@ void spice_msg_out_send(SpiceMsgOut *out)
+     g_return_if_fail(out->channel != NULL);
+ 
+     g_static_mutex_lock(&out->channel->priv->xmit_queue_lock);
+-    if (!out->channel->priv->xmit_queue_blocked)
++    if (!out->channel->priv->xmit_queue_blocked) {
++        gboolean was_empty;
++
++        was_empty = g_queue_is_empty(&out->channel->priv->xmit_queue);
+         g_queue_push_tail(&out->channel->priv->xmit_queue, out);
+-    g_static_mutex_unlock(&out->channel->priv->xmit_queue_lock);
+ 
+-    /* TODO: we currently flush/wakeup immediately all buffered messages */
+-    if (g_thread_self() != out->channel->priv->main_thread)
+-        /* We use g_timeout_add_full so that can specify the priority */
+-        g_timeout_add_full(G_PRIORITY_HIGH, 0, spice_channel_idle_wakeup,
+-                           g_object_ref(out->channel), NULL);
+-    else
+-        spice_channel_wakeup(out->channel, FALSE);
++        /* One wakeup is enough to empty the entire queue -> only do a wakeup
++           if the queue was empty, and there isn't one pending already. */
++        if (was_empty && !out->channel->priv->xmit_queue_wakeup_id) {
++            out->channel->priv->xmit_queue_wakeup_id =
++                /* Use g_timeout_add_full so that can specify the priority */
++                g_timeout_add_full(G_PRIORITY_HIGH, 0,
++                                   spice_channel_idle_wakeup,
++                                   out->channel, NULL);
++        }
++    }
++    g_static_mutex_unlock(&out->channel->priv->xmit_queue_lock);
+ }
+ 
+ /* coroutine context */
+@@ -1688,7 +1711,6 @@ error:
+ }
+ 
+ /* system context */
+-/* TODO: we currently flush/wakeup immediately all buffered messages */
+ G_GNUC_INTERNAL
+ void spice_channel_wakeup(SpiceChannel *channel, gboolean cancel)
+ {
+@@ -2344,6 +2366,10 @@ static void channel_reset(SpiceChannel *channel, gboolean migrating)
+     c->xmit_queue_blocked = TRUE; /* Disallow queuing new messages */
+     g_queue_foreach(&c->xmit_queue, (GFunc)spice_msg_out_unref, NULL);
+     g_queue_clear(&c->xmit_queue);
++    if (c->xmit_queue_wakeup_id) {
++        g_source_remove(c->xmit_queue_wakeup_id);
++        c->xmit_queue_wakeup_id = 0;
++    }
+     g_static_mutex_unlock(&c->xmit_queue_lock);
+ 
+     g_array_set_size(c->remote_common_caps, 0);
+-- 
+1.7.7.4
+
diff --git a/sources b/sources
index d4045f9..0001c9e 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-7043735c55396bf634c27c5a8adb94a1  spice-gtk-0.7.39-ab64.tar.bz2
+761b6c3d74d962d437bdd72f54292498  spice-gtk-0.8.tar.bz2
diff --git a/spice-gtk.spec b/spice-gtk.spec
index 5dfba5b..cc7a533 100644
--- a/spice-gtk.spec
+++ b/spice-gtk.spec
@@ -8,23 +8,26 @@
 %if 0%{?fedora} >= 15
 %define with_gtk3 1
 %endif
-%define _version_suffix -ab64
+
+#define _version_suffix -ab64
 
 Name:           spice-gtk
-Version:        0.7.39
-Release:        3%{?dist}
-Summary:        A GTK2 widget for SPICE clients
+Version:        0.8
+Release:        1%{?dist}
+Summary:        A GTK+ widget for SPICE clients
 
 Group:          System Environment/Libraries
 License:        LGPLv2+
 URL:            http://spice-space.org/page/Spice-Gtk
 Source0:        http://www.spice-space.org/download/gtk/%{name}-%{version}%{?_version_suffix}.tar.bz2
-BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# 2 fixes from upstream git
+Patch0:         0001-Handle-spice_audio_new-failures.patch
+Patch1:         0002-spice-channel-Allow-calling-spice_msg_out_send-from-.patch
 
 BuildRequires: intltool
 BuildRequires: gtk2-devel >= 2.14
-BuildRequires: spice-protocol >= 0.9.0
-BuildRequires: usbredir-devel >= 0.3.1
+BuildRequires: spice-protocol >= 0.10.1
+BuildRequires: usbredir-devel >= 0.3.3
 BuildRequires: libusb1-devel >= 1.0.9
 BuildRequires: libgudev1-devel
 BuildRequires: perl-Text-CSV
@@ -34,12 +37,16 @@ BuildRequires: pygtk2-devel python-devel zlib-devel
 BuildRequires: cyrus-sasl-devel
 BuildRequires: libcacard-devel
 BuildRequires: gobject-introspection-devel
+BuildRequires: libacl-devel
+BuildRequires: polkit-devel
 BuildRequires: gtk-doc
+BuildRequires: vala-tools
 %if %{with_gtk3}
 BuildRequires: gtk3-devel
 %endif
 # Hack because of bz #613466
 BuildRequires: libtool
+Requires: spice-glib%{?_isa} = %{version}-%{release}
 
 ExclusiveArch: %{ix86} x86_64
 
@@ -49,8 +56,8 @@ Client libraries for SPICE desktop servers.
 %package devel
 Summary: Development files to build GTK2 applications with spice-gtk-2.0
 Group: Development/Libraries
-Requires: %{name} = %{version}-%{release}
-Requires: spice-glib-devel = %{version}-%{release}
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: spice-glib-devel%{?_isa} = %{version}-%{release}
 Requires: pkgconfig
 Requires: gtk2-devel
 
@@ -69,7 +76,7 @@ spice-client-glib-2.0 is a SPICE client library for GLib2.
 %package -n spice-glib-devel
 Summary: Development files to build Glib2 applications with spice-glib-2.0
 Group: Development/Libraries
-Requires: spice-glib = %{version}-%{release}
+Requires: spice-glib%{?_isa} = %{version}-%{release}
 Requires: pkgconfig
 Requires: glib2-devel
 
@@ -83,6 +90,7 @@ Libraries, includes, etc. to compile with the spice-glib-2.0 libraries
 %package -n spice-gtk3
 Summary: A GTK3 widget for SPICE clients
 Group: Development/Libraries
+Requires: spice-glib%{?_isa} = %{version}-%{release}
 
 %description -n spice-gtk3
 spice-client-glib-3.0 is a SPICE client library for Gtk3.
@@ -90,8 +98,8 @@ spice-client-glib-3.0 is a SPICE client library for Gtk3.
 %package -n spice-gtk3-devel
 Summary: Development files to build GTK3 applications with spice-gtk-3.0
 Group: Development/Libraries
-Requires: spice-gtk3 = %{version}-%{release}
-Requires: spice-glib-devel = %{version}-%{release}
+Requires: spice-gtk3%{?_isa} = %{version}-%{release}
+Requires: spice-glib-devel%{?_isa} = %{version}-%{release}
 Requires: pkgconfig
 Requires: gtk3-devel
 
@@ -99,6 +107,15 @@ Requires: gtk3-devel
 spice-client-gtk-3.0 provides a SPICE viewer widget for GTK3.
 
 Libraries, includes, etc. to compile with the spice-gtk3 libraries
+
+%package -n spice-gtk3-vala
+Summary: Vala bindings for the spice-gtk-3.0 library
+Group: Development/Libraries
+Requires: spice-gtk3%{?_isa} = %{version}-%{release}
+Requires: spice-gtk3-devel%{?_isa} = %{version}-%{release}
+
+%description -n spice-gtk3-vala
+A module allowing use of the spice-gtk-3.0 widget from vala
 %endif
 
 %package python
@@ -120,9 +137,15 @@ Simple clients for interacting with SPICE servers.
 spicy is a client to a SPICE desktop server.
 snappy is a tool to capture screen-shots of a SPICE desktop.
 
+
 %prep
 %setup -q -n spice-gtk-%{version}%{?_version_suffix} -c
 
+pushd spice-gtk-%{version}%{?_version_suffix}
+%patch0 -p1
+%patch1 -p1
+popd
+
 if [ -n '%{?_version_suffix}' ]; then
   mv spice-gtk-%{version}%{?_version_suffix} spice-gtk-%{version}
 fi
@@ -135,20 +158,19 @@ cp -a spice-gtk-%{version} spice-gtk3-%{version}
 %build
 
 cd spice-gtk-%{version}
-%configure --enable-gtk-doc --with-gtk=2.0
+%configure --with-gtk=2.0 --enable-gtk-doc --with-usb-acl-helper-dir=%{_libexecdir}/spice-gtk/
 make %{?_smp_mflags}
 cd ..
 
 %if %{with_gtk3}
 cd spice-gtk3-%{version}
-%configure --with-gtk=3.0
+%configure --with-gtk=3.0 --enable-vala --with-usb-acl-helper-dir=%{_libexecdir}/spice-gtk/
 make %{?_smp_mflags}
 cd ..
 %endif
 
 
 %install
-rm -rf %{buildroot}
 
 %if %{with_gtk3}
 cd spice-gtk3-%{version}
@@ -166,15 +188,20 @@ rm -f %{buildroot}%{_libdir}/python*/site-packages/*.a
 rm -f %{buildroot}%{_libdir}/python*/site-packages/*.la
 %find_lang %{name}
 
-%clean
-rm -rf %{buildroot}
 
 %post -p /sbin/ldconfig
-
 %postun -p /sbin/ldconfig
 
+%post -n spice-glib -p /sbin/ldconfig
+%postun -n spice-glib -p /sbin/ldconfig
+
+%if %{with_gtk3}
+%post -n spice-gtk3 -p /sbin/ldconfig
+%postun -n spice-gtk3 -p /sbin/ldconfig
+%endif
+
+
 %files
-%defattr(-,root,root,-)
 %doc spice-gtk-%{version}/AUTHORS
 %doc spice-gtk-%{version}/COPYING
 %doc spice-gtk-%{version}/README
@@ -183,20 +210,19 @@ rm -rf %{buildroot}
 %{_libdir}/girepository-1.0/SpiceClientGtk-2.0.typelib
 
 %files devel
-%defattr(-,root,root,-)
 %{_libdir}/libspice-client-gtk-2.0.so
 %{_includedir}/spice-client-gtk-2.0
 %{_libdir}/pkgconfig/spice-client-gtk-2.0.pc
 %{_datadir}/gir-1.0/SpiceClientGtk-2.0.gir
 
 %files -n spice-glib -f %{name}.lang
-%defattr(-,root,root,-)
 %{_libdir}/libspice-client-glib-2.0.so.*
 %{_libdir}/libspice-controller.so.*
 %{_libdir}/girepository-1.0/SpiceClientGLib-2.0.typelib
+%{_libexecdir}/spice-gtk/spice-client-glib-usb-acl-helper
+%{_datadir}/polkit-1/actions/org.spice-space.lowlevelusbaccess.policy
 
 %files -n spice-glib-devel
-%defattr(-,root,root,-)
 %{_libdir}/libspice-client-glib-2.0.so
 %{_libdir}/libspice-controller.so
 %{_includedir}/spice-client-glib-2.0
@@ -209,29 +235,36 @@ rm -rf %{buildroot}
 
 %if %{with_gtk3}
 %files -n spice-gtk3
-%defattr(-,root,root,-)
 %{_libdir}/libspice-client-gtk-3.0.so.*
 %{_libdir}/girepository-1.0/SpiceClientGtk-3.0.typelib
 
 %files -n spice-gtk3-devel
-%defattr(-,root,root,-)
 %{_libdir}/libspice-client-gtk-3.0.so
 %{_includedir}/spice-client-gtk-3.0
 %{_libdir}/pkgconfig/spice-client-gtk-3.0.pc
 %{_datadir}/gir-1.0/SpiceClientGtk-3.0.gir
+
+%files -n spice-gtk3-vala
+%{_datadir}/vala/vapi/spice-client-glib-2.0.deps
+%{_datadir}/vala/vapi/spice-client-glib-2.0.vapi
+%{_datadir}/vala/vapi/spice-client-gtk-3.0.deps
+%{_datadir}/vala/vapi/spice-client-gtk-3.0.vapi
 %endif
 
 %files python
-%defattr(-,root,root,-)
 %{_libdir}/python*/site-packages/SpiceClientGtk.so
 
 %files tools
-%defattr(-,root,root,-)
 %{_bindir}/snappy
 %{_bindir}/spicy
 %{_bindir}/spicy-stats
 
 %changelog
+* Mon Jan 16 2012 Hans de Goede <hdegoede at redhat.com> - 0.8-1
+- New upstream release 0.8
+- Various small specfile improvements
+- Enable vala bindings
+
 * Sat Jan 14 2012 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.7.39-3
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
 


More information about the scm-commits mailing list