From 3a622778e5f95520b9f60585ff86b0224bf39959 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Mon, 2 May 2016 11:26:54 +0200
Subject: [PATCH] basic event compression

---
 common/utils/T/tracer/gui/event.c | 47 +++++++++++++++++++++++++++++--
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/common/utils/T/tracer/gui/event.c b/common/utils/T/tracer/gui/event.c
index 378b80ccdd..842318fcea 100644
--- a/common/utils/T/tracer/gui/event.c
+++ b/common/utils/T/tracer/gui/event.c
@@ -39,6 +39,24 @@ static void free_event(struct event *e)
   free(e);
 }
 
+static int events_equal(struct event *e1, struct event *e2)
+{
+  if (e1->type != e2->type) return 0;
+  switch (e1->type) {
+  case REPACK: {
+    struct repack_event *re1 = (struct repack_event *)e1;
+    struct repack_event *re2 = (struct repack_event *)e2;
+    return re1->id == re2->id;
+  }
+  case DIRTY: {
+    struct dirty_event *re1 = (struct dirty_event *)e1;
+    struct dirty_event *re2 = (struct dirty_event *)e2;
+    return re1->id == re2->id;
+  }}
+  /* unreachable */
+  abort();
+}
+
 /*****************************************************************/
 /*                         sending events                        */
 /*****************************************************************/
@@ -61,6 +79,28 @@ static event *new_event_dirty(int id)
   return ret;
 }
 
+static void compress_event_list(struct gui *g)
+{
+  struct event *last;
+  struct event_list *cur;
+  /* basic compression, to be refined */
+
+  /* pickup last event and remove every copy of it found before
+   * if it's DIRTY or REPACK
+   */
+  last = g->queued_events->last->item;
+  if (last->type == DIRTY || last->type == REPACK) {
+    cur = g->queued_events;
+    while (cur->item != last) {
+      if (cur->item != NULL && events_equal(cur->item, last)) {
+        free_event(cur->item);
+        cur->item = NULL;
+      }
+      cur = cur->next;
+    }
+  }
+}
+
 void send_event(gui *_gui, enum event_type type, ...)
 {
   LOGD("send_event %d\n", type);
@@ -93,6 +133,7 @@ void send_event(gui *_gui, enum event_type type, ...)
   e->type = type;
 
   event_list_append(g, e);
+  compress_event_list(g);
 
   if (do_write) {
     char c = 1;
@@ -158,8 +199,10 @@ void gui_events(gui *_gui)
     struct event_list *cur = g->queued_events;
     g->queued_events = cur->next;
     if (g->queued_events) g->queued_events->last = cur->last;
-    process_event(g, cur->item);
-    free_event(cur->item);
+    if (cur->item != NULL) {
+      process_event(g, cur->item);
+      free_event(cur->item);
+    }
     free(cur);
   }
   LOGD("gui_events DONE\n");
-- 
GitLab