| /** |
| * @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 */ |