perf tools: Add dso__data_status_seen()
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 22 Jul 2014 13:17:19 +0000 (16:17 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 23 Jul 2014 14:23:44 +0000 (11:23 -0300)
Add a function to track whether a caller has seen the data status of a
dso.  This is needed to enable callers to report the error exactly once
only per dso.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1406035081-14301-11-git-send-email-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/dso.c
tools/perf/util/dso.h

index 8827db3d2cba370885ef2d175958d5a213a42508..84e4a0546a31d22d6aff732caaf1d7c297950da0 100644 (file)
@@ -359,6 +359,18 @@ out:
        return dso->data.fd;
 }
 
+bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by)
+{
+       u32 flag = 1 << by;
+
+       if (dso->data.status_seen & flag)
+               return true;
+
+       dso->data.status_seen |= flag;
+
+       return false;
+}
+
 static void
 dso_cache__free(struct rb_root *root)
 {
index aeb7bcbf023978ac142ec5b4f11373131467d441..c805f604da1fe4cd7dd2b41787e1405f01e0ea43 100644 (file)
@@ -46,6 +46,10 @@ enum dso_data_status {
        DSO_DATA_STATUS_OK      = 1,
 };
 
+enum dso_data_status_seen {
+       DSO_DATA_STATUS_SEEN_ITRACE,
+};
+
 #define DSO__SWAP(dso, type, val)                      \
 ({                                                     \
        type ____r = val;                               \
@@ -111,6 +115,7 @@ struct dso {
                struct rb_root   cache;
                int              fd;
                int              status;
+               u32              status_seen;
                size_t           file_size;
                struct list_head open_entry;
        } data;
@@ -203,6 +208,7 @@ ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
                            struct machine *machine, u64 addr,
                            u8 *data, ssize_t size);
+bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
 
 struct map *dso__new_map(const char *name);
 struct dso *dso__kernel_findnew(struct machine *machine, const char *name,