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