summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.co.uk>2012-02-13 12:56:47 +0100
committerXavier Claessens <xavier.claessens@collabora.co.uk>2012-02-13 12:59:27 +0100
commit7cdf37e9c5407e66615a15e0988f20b2223eb704 (patch)
treeaab89a0da8b064e3699b7ac3a9df9012b4b0a6c0
parent35e4fa26fd63e17e5123a984b880ad7e9f4c1220 (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.c22
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