[Spice-devel] [PATCH 3/4] pulse: use spice_g_signal_connect_object
Marc-André Lureau
marcandre.lureau at gmail.com
Thu Sep 22 16:22:43 PDT 2011
Disconnect all handlers when either emitter or observer is gone.
That should help https://bugzilla.redhat.com/show_bug.cgi?id=737202
---
gtk/spice-pulse.c | 74 +++++++++++++++++++++++-----------------------------
1 files changed, 33 insertions(+), 41 deletions(-)
diff --git a/gtk/spice-pulse.c b/gtk/spice-pulse.c
index dce4e9c..7231251 100644
--- a/gtk/spice-pulse.c
+++ b/gtk/spice-pulse.c
@@ -19,6 +19,7 @@
#include "spice-common.h"
#include "spice-session-priv.h"
#include "spice-channel-priv.h"
+#include "spice-util-priv.h"
#include <pulse/glib-mainloop.h>
#include <pulse/pulseaudio.h>
@@ -113,26 +114,17 @@ static void spice_pulse_dispose(GObject *obj)
pa_operation_unref(p->record.cork_op);
p->record.cork_op = NULL;
- if (p->pchannel != NULL) {
- g_signal_handlers_disconnect_by_func(p->pchannel,
- channel_event, obj);
+ if (p->pchannel)
g_object_unref(p->pchannel);
- p->pchannel = NULL;
- }
+ p->pchannel = NULL;
- if (p->rchannel != NULL) {
- g_signal_handlers_disconnect_by_func(p->rchannel,
- channel_event, obj);
+ if (p->rchannel)
g_object_unref(p->rchannel);
- p->rchannel = NULL;
- }
+ p->rchannel = NULL;
- if (p->session != NULL) {
- g_signal_handlers_disconnect_by_func(p->session,
- channel_new, obj);
+ if (p->session)
g_object_unref(p->session);
- p->session = NULL;
- }
+ p->session = NULL;
G_OBJECT_CLASS(spice_pulse_parent_class)->dispose(obj);
}
@@ -720,36 +712,36 @@ static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer data)
if (SPICE_IS_PLAYBACK_CHANNEL(channel)) {
g_return_if_fail(p->pchannel == NULL);
p->pchannel = g_object_ref(channel);
- g_signal_connect(channel, "playback-start",
- G_CALLBACK(playback_start), pulse);
- g_signal_connect(channel, "playback-get-delay",
- G_CALLBACK(playback_get_delay), pulse);
- g_signal_connect(channel, "playback-data",
- G_CALLBACK(playback_data), pulse);
- g_signal_connect(channel, "playback-stop",
- G_CALLBACK(playback_stop), pulse);
- g_signal_connect(channel, "channel-event",
- G_CALLBACK(channel_event), pulse);
- g_signal_connect(channel, "notify::volume",
- G_CALLBACK(playback_volume_changed), pulse);
- g_signal_connect(channel, "notify::mute",
- G_CALLBACK(playback_mute_changed), pulse);
+ spice_g_signal_connect_object(channel, "playback-start",
+ G_CALLBACK(playback_start), pulse, 0);
+ spice_g_signal_connect_object(channel, "playback-get-delay",
+ G_CALLBACK(playback_get_delay), pulse, 0);
+ spice_g_signal_connect_object(channel, "playback-data",
+ G_CALLBACK(playback_data), pulse, 0);
+ spice_g_signal_connect_object(channel, "playback-stop",
+ G_CALLBACK(playback_stop), pulse, 0);
+ spice_g_signal_connect_object(channel, "channel-event",
+ G_CALLBACK(channel_event), pulse, 0);
+ spice_g_signal_connect_object(channel, "notify::volume",
+ G_CALLBACK(playback_volume_changed), pulse, 0);
+ spice_g_signal_connect_object(channel, "notify::mute",
+ G_CALLBACK(playback_mute_changed), pulse, 0);
spice_channel_connect(channel);
}
if (SPICE_IS_RECORD_CHANNEL(channel)) {
g_return_if_fail(p->rchannel == NULL);
p->rchannel = g_object_ref(channel);
- g_signal_connect(channel, "record-start",
- G_CALLBACK(record_start), pulse);
- g_signal_connect(channel, "record-stop",
- G_CALLBACK(record_stop), pulse);
- g_signal_connect(channel, "channel-event",
- G_CALLBACK(channel_event), pulse);
- g_signal_connect(channel, "notify::volume",
- G_CALLBACK(record_volume_changed), pulse);
- g_signal_connect(channel, "notify::mute",
- G_CALLBACK(record_mute_changed), pulse);
+ spice_g_signal_connect_object(channel, "record-start",
+ G_CALLBACK(record_start), pulse, 0);
+ spice_g_signal_connect_object(channel, "record-stop",
+ G_CALLBACK(record_stop), pulse, 0);
+ spice_g_signal_connect_object(channel, "channel-event",
+ G_CALLBACK(channel_event), pulse, 0);
+ spice_g_signal_connect_object(channel, "notify::volume",
+ G_CALLBACK(record_volume_changed), pulse, 0);
+ spice_g_signal_connect_object(channel, "notify::mute",
+ G_CALLBACK(record_mute_changed), pulse, 0);
spice_channel_connect(channel);
}
}
@@ -800,8 +792,8 @@ SpicePulse *spice_pulse_new(SpiceSession *session, GMainContext *context,
p = SPICE_PULSE_GET_PRIVATE(pulse);
p->session = g_object_ref(session);
- g_signal_connect(session, "channel-new",
- G_CALLBACK(channel_new), pulse);
+ spice_g_signal_connect_object(session, "channel-new",
+ G_CALLBACK(channel_new), pulse, 0);
list = spice_session_get_channels(session);
for (tmp = g_list_first(list); tmp != NULL; tmp = g_list_next(tmp)) {
channel_new(session, tmp->data, (gpointer)pulse);
--
1.7.6.2
More information about the Spice-devel
mailing list