diff options
author | Debarshi Ray <debarshir@freedesktop.org> | 2012-07-05 12:18:02 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@freedesktop.org> | 2012-08-28 19:37:56 +0200 |
commit | e2283df2fe5e894067edc5dcbe5207c6ad365d06 (patch) | |
tree | 41b453754eea7a9f2448a3febcb4fdbf2a280dd0 | |
parent | 7c93de6ba523445ab44ecd034d04764b0833114c (diff) | |
download | telepathy-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.c | 34 |
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; } |