diff options
author | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-02-13 12:56:47 +0100 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-02-13 12:59:27 +0100 |
commit | 7cdf37e9c5407e66615a15e0988f20b2223eb704 (patch) | |
tree | aab89a0da8b064e3699b7ac3a9df9012b4b0a6c0 | |
parent | 35e4fa26fd63e17e5123a984b880ad7e9f4c1220 (diff) |
Fix racy crash in call unit test
Keeping a ref on the stream for the timeout make it survive its TpBaseCallChannel
leading to issues later.
-rw-r--r-- | examples/cm/call/call-stream.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/examples/cm/call/call-stream.c b/examples/cm/call/call-stream.c index 9eb2e3526..7cd4b221d 100644 --- a/examples/cm/call/call-stream.c +++ b/examples/cm/call/call-stream.c @@ -42,6 +42,7 @@ struct _ExampleCallStreamPrivate guint simulation_delay; gboolean locally_requested; TpHandle handle; + guint agreed_delay_id; }; static void @@ -142,6 +143,17 @@ static gboolean stream_set_sending (TpBaseCallStream *base, GError **error); static void +finalize (GObject *object) +{ + ExampleCallStream *self = EXAMPLE_CALL_STREAM (object); + + if (self->priv->agreed_delay_id != 0) + g_source_remove (self->priv->agreed_delay_id); + + G_OBJECT_CLASS (example_call_stream_parent_class)->finalize (object); +} + +static void example_call_stream_class_init (ExampleCallStreamClass *klass) { GObjectClass *object_class = (GObjectClass *) klass; @@ -153,6 +165,7 @@ example_call_stream_class_init (ExampleCallStreamClass *klass) object_class->constructed = constructed; object_class->set_property = set_property; object_class->get_property = get_property; + object_class->finalize = finalize; stream_class->request_receiving = stream_request_receiving; stream_class->set_sending = stream_set_sending; @@ -280,9 +293,12 @@ example_call_stream_change_direction (ExampleCallStream *self, self->priv->handle, TP_SENDING_STATE_PENDING_SEND, 0, TP_CALL_STATE_CHANGE_REASON_UNKNOWN, "", ""); - g_timeout_add_full (G_PRIORITY_DEFAULT, self->priv->simulation_delay, - simulate_contact_agreed_to_send_cb, g_object_ref (self), - g_object_unref); + if (self->priv->agreed_delay_id == 0) + { + self->priv->agreed_delay_id = g_timeout_add ( + self->priv->simulation_delay, + simulate_contact_agreed_to_send_cb, self); + } } } else |