diff options
author | Debarshi Ray <debarshir@freedesktop.org> | 2012-07-11 19:42:58 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@freedesktop.org> | 2012-08-28 19:37:57 +0200 |
commit | 401e164871a9664de951f287d335bf58372ee4c4 (patch) | |
tree | 318ce675617c5429ae414d125d2b8924f49f3f51 | |
parent | e1188dea59d3cbdc4999ae92b1a36a20ad1bf602 (diff) | |
download | telepathy-logger-401e164871a9664de951f287d335bf58372ee4c4.tar.gz |
log-walker: Keep a list of (iter, count) tuples
This represents the order in which events were handed over to the user
from each iterator. Lets say we have 10 events numbered from 0 to 9,
with 0 being the oldest and 9 the latest event, and we have 3
iterators Ia, Ib and Ic. If they were returned in batches of 5 as:
+-----+--------+
|event|iterator|
+-----+--------+
| 5 | Ia |
| 6 | Ib |
| 7 | Ia |
| 8 | Ia |
| 9 | Ic |
+ - - + - -- - +
| 0 | Ic |
| 1 | Ic |
| 2 | Ib |
| 3 | Ib |
| 4 | Ia |
+-----+--------+
Then the list would be:
(Ic, 2), (Ib, 2), (Ia, 2), (Ib, 1), (Ia, 2), (Ic, 1)
Fixes: https://bugs.freedesktop.org/41772
-rw-r--r-- | telepathy-logger/log-walker.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/telepathy-logger/log-walker.c b/telepathy-logger/log-walker.c index 9abc2e0..d9cbf1b 100644 --- a/telepathy-logger/log-walker.c +++ b/telepathy-logger/log-walker.c @@ -44,6 +44,7 @@ struct _TplLogWalkerPriv { GList *caches; + GList *history; GList *iters; GMutex mutex; gboolean is_begin; @@ -63,6 +64,12 @@ typedef struct guint num_events; } TplLogWalkerAsyncData; +typedef struct +{ + TplLogIter *iter; + guint count; +} TplLogWalkerHistoryData; + static TplLogWalkerAsyncData * tpl_log_walker_async_data_new (void) @@ -78,6 +85,21 @@ tpl_log_walker_async_data_free (TplLogWalkerAsyncData *data) } +static TplLogWalkerHistoryData * +tpl_log_walker_history_data_new (void) +{ + return g_slice_new0 (TplLogWalkerHistoryData); +} + + +static void +tpl_log_walker_history_data_free (TplLogWalkerHistoryData *data) +{ + g_object_unref (data->iter); + g_slice_free (TplLogWalkerHistoryData, data); +} + + static void tpl_log_walker_async_operation_cb (GObject *source_object, GAsyncResult *result, @@ -125,10 +147,12 @@ tpl_log_walker_get_events (TplLogWalker *walker, GList *l; GList **latest_cache; GList *latest_event; + TplLogIter *latest_iter; gint64 latest_timestamp; latest_cache = NULL; latest_event = NULL; + latest_iter = NULL; latest_timestamp = 0; for (k = priv->caches, l = priv->iters; @@ -157,15 +181,32 @@ tpl_log_walker_get_events (TplLogWalker *walker, { latest_cache = cache; latest_event = event; + latest_iter = iter; latest_timestamp = timestamp; } } if (latest_event != NULL) { + GList *h; + TplLogWalkerHistoryData *data; + *latest_cache = g_list_remove_link (*latest_cache, latest_event); events = g_list_prepend (events, latest_event->data); i++; + + h = priv->history; + if (h == NULL || + ((TplLogWalkerHistoryData *) h->data)->iter != latest_iter) + { + data = tpl_log_walker_history_data_new (); + data->iter = g_object_ref (latest_iter); + priv->history = g_list_prepend (priv->history, data); + } + else + data = (TplLogWalkerHistoryData *) h->data; + + data->count++; } else priv->is_end = TRUE; @@ -217,6 +258,10 @@ tpl_log_walker_dispose (GObject *object) g_list_free_full (priv->caches, tpl_log_walker_caches_free_func); priv->caches = NULL; + g_list_free_full (priv->history, + (GDestroyNotify) tpl_log_walker_history_data_free); + priv->history = NULL; + g_list_free_full (priv->iters, g_object_unref); priv->iters = NULL; |