Home | History | Annotate | Download | only in libpp
      1 /**
      2  * @file sample_container.h
      3  * Internal implementation of sample container
      4  *
      5  * @remark Copyright 2002 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author Philippe Elie
      9  * @author John Levon
     10  */
     11 
     12 #ifndef SAMPLE_CONTAINER_H
     13 #define SAMPLE_CONTAINER_H
     14 
     15 #include <map>
     16 #include <set>
     17 #include <string>
     18 
     19 #include "symbol.h"
     20 #include "symbol_functors.h"
     21 
     22 /**
     23  * Arbitrary container of sample entries. Can return
     24  * number of samples for a file or line number and
     25  * return the particular sample information for a VMA.
     26  */
     27 class sample_container {
     28 	typedef std::pair<symbol_entry const *, bfd_vma> sample_index_t;
     29 public:
     30 	typedef std::map<sample_index_t, sample_entry> samples_storage;
     31 	typedef samples_storage::const_iterator samples_iterator;
     32 
     33 	/// return iterator to the first samples for this symbol
     34 	samples_iterator begin(symbol_entry const *) const;
     35 	/// return iterator to the last samples for this symbol
     36 	samples_iterator end(symbol_entry const *) const;
     37 
     38 	/// return iterator to the first samples
     39 	samples_iterator begin() const;
     40 	/// return iterator to the last samples
     41 	samples_iterator end() const;
     42 
     43 	/// insert a sample entry by creating a new entry or by cumulating
     44 	/// samples into an existing one. Can only be done before any lookups
     45 	void insert(symbol_entry const * symbol, sample_entry const &);
     46 
     47 	/// return nr of samples in the given filename
     48 	count_array_t accumulate_samples(debug_name_id filename_id) const;
     49 
     50 	/// return nr of samples at the given line nr in the given file
     51 	count_array_t accumulate_samples(debug_name_id, size_t linenr) const;
     52 
     53 	/// return the sample entry for the given image_name and vma if any
     54 	sample_entry const * find_by_vma(symbol_entry const * symbol,
     55 					 bfd_vma vma) const;
     56 
     57 private:
     58 	/// build the symbol by file-location cache
     59 	void build_by_loc() const;
     60 
     61 	/// main sample entry container
     62 	samples_storage samples;
     63 
     64 	typedef std::multiset<sample_entry const *, less_by_file_loc>
     65 		samples_by_loc_t;
     66 
     67 	// must be declared after the samples_storage to ensure a
     68 	// correct life-time.
     69 
     70 	/**
     71 	 * Sample entries by file location. Lazily built when necessary,
     72 	 * so mutable.
     73 	 */
     74 	mutable samples_by_loc_t samples_by_loc;
     75 };
     76 
     77 #endif /* SAMPLE_CONTAINER_H */
     78