oprofile 0.9.6
Copy in the rest of the oprofile 0.9.6 tree so we have a source
copy to match the prebuilt binaries that are checked into
external/.
Change-Id: Iaac327571d5d583594a4194973bf256569061048
diff --git a/libpp/sample_container.h b/libpp/sample_container.h
new file mode 100644
index 0000000..74c9ab0
--- /dev/null
+++ b/libpp/sample_container.h
@@ -0,0 +1,77 @@
+/**
+ * @file sample_container.h
+ * Internal implementation of sample container
+ *
+ * @remark Copyright 2002 OProfile authors
+ * @remark Read the file COPYING
+ *
+ * @author Philippe Elie
+ * @author John Levon
+ */
+
+#ifndef SAMPLE_CONTAINER_H
+#define SAMPLE_CONTAINER_H
+
+#include <map>
+#include <set>
+#include <string>
+
+#include "symbol.h"
+#include "symbol_functors.h"
+
+/**
+ * Arbitrary container of sample entries. Can return
+ * number of samples for a file or line number and
+ * return the particular sample information for a VMA.
+ */
+class sample_container {
+ typedef std::pair<symbol_entry const *, bfd_vma> sample_index_t;
+public:
+ typedef std::map<sample_index_t, sample_entry> samples_storage;
+ typedef samples_storage::const_iterator samples_iterator;
+
+ /// return iterator to the first samples for this symbol
+ samples_iterator begin(symbol_entry const *) const;
+ /// return iterator to the last samples for this symbol
+ samples_iterator end(symbol_entry const *) const;
+
+ /// return iterator to the first samples
+ samples_iterator begin() const;
+ /// return iterator to the last samples
+ samples_iterator end() const;
+
+ /// insert a sample entry by creating a new entry or by cumulating
+ /// samples into an existing one. Can only be done before any lookups
+ void insert(symbol_entry const * symbol, sample_entry const &);
+
+ /// return nr of samples in the given filename
+ count_array_t accumulate_samples(debug_name_id filename_id) const;
+
+ /// return nr of samples at the given line nr in the given file
+ count_array_t accumulate_samples(debug_name_id, size_t linenr) const;
+
+ /// return the sample entry for the given image_name and vma if any
+ sample_entry const * find_by_vma(symbol_entry const * symbol,
+ bfd_vma vma) const;
+
+private:
+ /// build the symbol by file-location cache
+ void build_by_loc() const;
+
+ /// main sample entry container
+ samples_storage samples;
+
+ typedef std::multiset<sample_entry const *, less_by_file_loc>
+ samples_by_loc_t;
+
+ // must be declared after the samples_storage to ensure a
+ // correct life-time.
+
+ /**
+ * Sample entries by file location. Lazily built when necessary,
+ * so mutable.
+ */
+ mutable samples_by_loc_t samples_by_loc;
+};
+
+#endif /* SAMPLE_CONTAINER_H */