Making hists col_len dynamicaly allocated as a support
for dynamic sort entries.

Signed-off-by: Jiri Olsa <jo...@redhat.com>
Cc: Corey Ashford <cjash...@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweis...@gmail.com>
Cc: Ingo Molnar <mi...@elte.hu>
Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Paul Mackerras <pau...@samba.org>
Cc: Peter Zijlstra <a.p.zijls...@chello.nl>
Cc: Arnaldo Carvalho de Melo <a...@redhat.com>
Cc: David Ahern <dsah...@gmail.com>
---
 tools/perf/util/evsel.c  | 23 ++++++++++++++++-------
 tools/perf/util/evsel.h  |  6 +++---
 tools/perf/util/hist.c   | 15 +++++++++++++++
 tools/perf/util/hist.h   |  4 +++-
 tools/perf/util/python.c |  3 +--
 5 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 5baf13b..2661870 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -115,7 +115,7 @@ void perf_evsel__calc_id_pos(struct perf_evsel *evsel)
        evsel->is_pos = __perf_evsel__calc_is_pos(evsel->attr.sample_type);
 }
 
-void hists__init(struct hists *hists)
+int hists__init(struct hists *hists)
 {
        memset(hists, 0, sizeof(*hists));
        hists->entries_in_array[0] = hists->entries_in_array[1] = RB_ROOT;
@@ -124,6 +124,12 @@ void hists__init(struct hists *hists)
        hists->entries = RB_ROOT;
        INIT_LIST_HEAD(&hists->sort_list);
        pthread_mutex_init(&hists->lock, NULL);
+       return hists__alloc_col_len(hists, HISTC_NR_COLS);
+}
+
+static void hists__exit(struct hists *hists)
+{
+       free(hists->col_len);
 }
 
 void __perf_evsel__set_sample_bit(struct perf_evsel *evsel,
@@ -158,8 +164,8 @@ void perf_evsel__set_sample_id(struct perf_evsel *evsel,
        evsel->attr.read_format |= PERF_FORMAT_ID;
 }
 
-void perf_evsel__init(struct perf_evsel *evsel,
-                     struct perf_event_attr *attr, int idx)
+int perf_evsel__init(struct perf_evsel *evsel,
+                    struct perf_event_attr *attr, int idx)
 {
        evsel->idx         = idx;
        evsel->attr        = *attr;
@@ -167,19 +173,20 @@ void perf_evsel__init(struct perf_evsel *evsel,
        evsel->unit        = "";
        evsel->scale       = 1.0;
        INIT_LIST_HEAD(&evsel->node);
-       hists__init(&evsel->hists);
        evsel->sample_size = __perf_evsel__sample_size(attr->sample_type);
        perf_evsel__calc_id_pos(evsel);
+       return hists__init(&evsel->hists);
 }
 
 struct perf_evsel *perf_evsel__new_idx(struct perf_event_attr *attr, int idx)
 {
        struct perf_evsel *evsel = zalloc(sizeof(*evsel));
+       int err = -ENOMEM;
 
        if (evsel != NULL)
-               perf_evsel__init(evsel, attr, idx);
+               err = perf_evsel__init(evsel, attr, idx);
 
-       return evsel;
+       return err ? NULL : evsel;
 }
 
 struct perf_evsel *perf_evsel__newtp_idx(const char *sys, const char *name, 
int idx)
@@ -203,7 +210,8 @@ struct perf_evsel *perf_evsel__newtp_idx(const char *sys, 
const char *name, int
                event_attr_init(&attr);
                attr.config = evsel->tp_format->id;
                attr.sample_period = 1;
-               perf_evsel__init(evsel, &attr, idx);
+               if (perf_evsel__init(evsel, &attr, idx))
+                       goto out_free;
        }
 
        return evsel;
@@ -776,6 +784,7 @@ void perf_evsel__exit(struct perf_evsel *evsel)
        assert(list_empty(&evsel->node));
        perf_evsel__free_fd(evsel);
        perf_evsel__free_id(evsel);
+       hists__exit(&evsel->hists);
 }
 
 void perf_evsel__delete(struct perf_evsel *evsel)
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index f1b3256..cdc2681 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -114,8 +114,8 @@ static inline struct perf_evsel *perf_evsel__newtp(const 
char *sys, const char *
 
 struct event_format *event_format__new(const char *sys, const char *name);
 
-void perf_evsel__init(struct perf_evsel *evsel,
-                     struct perf_event_attr *attr, int idx);
+int perf_evsel__init(struct perf_evsel *evsel,
+                    struct perf_event_attr *attr, int idx);
 void perf_evsel__exit(struct perf_evsel *evsel);
 void perf_evsel__delete(struct perf_evsel *evsel);
 
@@ -272,7 +272,7 @@ static inline int perf_evsel__read_scaled(struct perf_evsel 
*evsel,
        return __perf_evsel__read(evsel, ncpus, nthreads, true);
 }
 
-void hists__init(struct hists *hists);
+int hists__init(struct hists *hists);
 
 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
                             struct perf_sample *sample);
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 92c3d76..794d0cb 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -21,6 +21,21 @@ struct callchain_param       callchain_param = {
        .key    = CCKEY_FUNCTION
 };
 
+int hists__alloc_col_len(struct hists *hists, int n)
+{
+       u16 *col_len = hists->col_len;
+       int old_n = hists->col_n;
+
+       col_len = realloc(col_len, n * sizeof(u16));
+       if (col_len) {
+               memset(col_len + old_n, 0, n - old_n);
+               hists->col_len = col_len;
+               hists->col_n   = n;
+       }
+
+       return col_len ? 0 : -ENOMEM;
+}
+
 u16 hists__col_len(struct hists *hists, enum hist_column col)
 {
        return hists->col_len[col];
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index ff52c3bf..c2f4bd1 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -91,7 +91,8 @@ struct hists {
        struct events_stats     stats;
        u64                     time_base;
        u64                     event_stream;
-       u16                     col_len[HISTC_NR_COLS];
+       u16                     *col_len;
+       int                     col_n;
        struct list_head        sort_list;
 };
 
@@ -168,6 +169,7 @@ void hists__filter_by_dso(struct hists *hists);
 void hists__filter_by_thread(struct hists *hists);
 void hists__filter_by_symbol(struct hists *hists);
 
+int hists__alloc_col_len(struct hists *hists, int n);
 u16 hists__col_len(struct hists *hists, enum hist_column col);
 void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len);
 bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len);
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 122669c..b5824d2 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -605,8 +605,7 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,
        attr.mmap_data      = mmap_data;
        attr.sample_id_all  = sample_id_all;
 
-       perf_evsel__init(&pevsel->evsel, &attr, idx);
-       return 0;
+       return perf_evsel__init(&pevsel->evsel, &attr, idx);
 }
 
 static void pyrf_evsel__delete(struct pyrf_evsel *pevsel)
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to