summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@freedesktop.org>2012-07-05 12:18:02 +0200
committerDebarshi Ray <debarshir@freedesktop.org>2012-08-28 19:37:56 +0200
commite2283df2fe5e894067edc5dcbe5207c6ad365d06 (patch)
tree41b453754eea7a9f2448a3febcb4fdbf2a280dd0
parent7c93de6ba523445ab44ecd034d04764b0833114c (diff)
downloadtelepathy-logger-e2283df2fe5e894067edc5dcbe5207c6ad365d06.tar.gz
log-walker: Treat the internal state as a critical section
Since the TplLogWalker API is asynchronous, we do not want multiple overlapping calls to stamp on each others' toes. Fixes: https://bugs.freedesktop.org/41772
-rw-r--r--telepathy-logger/log-walker.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/telepathy-logger/log-walker.c b/telepathy-logger/log-walker.c
index b400a07..9abc2e0 100644
--- a/telepathy-logger/log-walker.c
+++ b/telepathy-logger/log-walker.c
@@ -45,6 +45,7 @@ struct _TplLogWalkerPriv
{
GList *caches;
GList *iters;
+ GMutex mutex;
gboolean is_begin;
gboolean is_end;
};
@@ -113,6 +114,8 @@ tpl_log_walker_get_events (TplLogWalker *walker,
events = NULL;
i = 0;
+ g_mutex_lock (&priv->mutex);
+
if (priv->is_end == TRUE)
goto out;
@@ -173,6 +176,8 @@ tpl_log_walker_get_events (TplLogWalker *walker,
priv->is_begin = FALSE;
out:
+ g_mutex_unlock (&priv->mutex);
+
return events;
}
@@ -222,6 +227,11 @@ tpl_log_walker_dispose (GObject *object)
static void
tpl_log_walker_finalize (GObject *object)
{
+ TplLogWalkerPriv *priv;
+
+ priv = TPL_LOG_WALKER (object)->priv;
+ g_mutex_clear (&priv->mutex);
+
G_OBJECT_CLASS (tpl_log_walker_parent_class)->finalize (object);
}
@@ -235,6 +245,8 @@ tpl_log_walker_init (TplLogWalker *walker)
TplLogWalkerPriv);
priv = walker->priv;
+ g_mutex_init (&priv->mutex);
+
priv->is_begin = TRUE;
priv->is_end = FALSE;
}
@@ -360,7 +372,16 @@ tpl_log_walker_get_events_finish (TplLogWalker *walker,
gboolean
tpl_log_walker_is_begin (TplLogWalker *walker)
{
- return walker->priv->is_begin;
+ TplLogWalkerPriv *priv;
+ gboolean retval;
+
+ priv = walker->priv;
+
+ g_mutex_lock (&priv->mutex);
+ retval = priv->is_begin;
+ g_mutex_unlock (&priv->mutex);
+
+ return retval;
}
@@ -376,5 +397,14 @@ tpl_log_walker_is_begin (TplLogWalker *walker)
gboolean
tpl_log_walker_is_end (TplLogWalker *walker)
{
- return walker->priv->is_end;
+ TplLogWalkerPriv *priv;
+ gboolean retval;
+
+ priv = walker->priv;
+
+ g_mutex_lock (&priv->mutex);
+ retval = priv->is_end;
+ g_mutex_unlock (&priv->mutex);
+
+ return retval;
}