]> git.karo-electronics.de Git - linux-beck.git/commitdiff
perf ui browser: Add filter method
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 14 Oct 2011 15:27:54 +0000 (12:27 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 14 Oct 2011 15:49:08 +0000 (12:49 -0300)
Its becoming common to allow the user to filter out parts of the data
structure being browsed, like already done in the hists browser and in
the annotate browser in the next commit, so provide it directly in the
ui_browser class list_head helpers.

More work required to move the equivalent routines found now in the
hists browser to the rb_tree helpers.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-jk7danyt1d9ji4e3o2xuthpn@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/ui/browser.c
tools/perf/util/ui/browser.h

index 078ceaf5f8c108930398b87cfd2df72222adc22e..a54b926efe2b6709bae437ba295237ebfff88fbb 100644 (file)
@@ -42,31 +42,62 @@ void ui_browser__gotorc(struct ui_browser *self, int y, int x)
        SLsmg_gotorc(self->y + y, self->x + x);
 }
 
+static struct list_head *
+ui_browser__list_head_filter_entries(struct ui_browser *browser,
+                                    struct list_head *pos)
+{
+       do {
+               if (!browser->filter || !browser->filter(browser, pos))
+                       return pos;
+               pos = pos->next;
+       } while (pos != browser->entries);
+
+       return NULL;
+}
+
+static struct list_head *
+ui_browser__list_head_filter_prev_entries(struct ui_browser *browser,
+                                         struct list_head *pos)
+{
+       do {
+               if (!browser->filter || !browser->filter(browser, pos))
+                       return pos;
+               pos = pos->prev;
+       } while (pos != browser->entries);
+
+       return NULL;
+}
+
 void ui_browser__list_head_seek(struct ui_browser *self, off_t offset, int whence)
 {
        struct list_head *head = self->entries;
        struct list_head *pos;
 
+       if (self->nr_entries == 0)
+               return;
+
        switch (whence) {
        case SEEK_SET:
-               pos = head->next;
+               pos = ui_browser__list_head_filter_entries(self, head->next);
                break;
        case SEEK_CUR:
                pos = self->top;
                break;
        case SEEK_END:
-               pos = head->prev;
+               pos = ui_browser__list_head_filter_prev_entries(self, head->prev);
                break;
        default:
                return;
        }
 
+       assert(pos != NULL);
+
        if (offset > 0) {
                while (offset-- != 0)
-                       pos = pos->next;
+                       pos = ui_browser__list_head_filter_entries(self, pos->next);
        } else {
                while (offset++ != 0)
-                       pos = pos->prev;
+                       pos = ui_browser__list_head_filter_prev_entries(self, pos->prev);
        }
 
        self->top = pos;
@@ -365,15 +396,17 @@ unsigned int ui_browser__list_head_refresh(struct ui_browser *self)
        int row = 0;
 
        if (self->top == NULL || self->top == self->entries)
-                self->top = head->next;
+                self->top = ui_browser__list_head_filter_entries(self, head->next);
 
        pos = self->top;
 
        list_for_each_from(pos, head) {
-               ui_browser__gotorc(self, row, 0);
-               self->write(self, pos, row);
-               if (++row == self->height)
-                       break;
+               if (!self->filter || !self->filter(self, pos)) {
+                       ui_browser__gotorc(self, row, 0);
+                       self->write(self, pos, row);
+                       if (++row == self->height)
+                               break;
+               }
        }
 
        return row;
index 7dd9d6107d1268686b0b7673917433c22b134187..351c006dd4b5e1392a1f7731df4d84e370fac6f2 100644 (file)
@@ -21,6 +21,7 @@ struct ui_browser {
        unsigned int  (*refresh)(struct ui_browser *self);
        void          (*write)(struct ui_browser *self, void *entry, int row);
        void          (*seek)(struct ui_browser *self, off_t offset, int whence);
+       bool          (*filter)(struct ui_browser *self, void *entry);
        u32           nr_entries;
 };