Update of /cvsroot/oprofile/oprofile/libpp In directory sc8-pr-cvs1:/tmp/cvs-serv454/libpp Modified Files: Tag: BRANCH_CALLGRAPH op_header.cpp op_header.h partition_files.cpp partition_files.h profile.cpp profile.h symbol_sort.cpp Log Message: biggish merge from head Index: op_header.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/op_header.cpp,v retrieving revision 1.3.2.4 retrieving revision 1.3.2.5 diff -u -p -d -r1.3.2.4 -r1.3.2.5 --- op_header.cpp 11 Jul 2003 12:26:59 -0000 1.3.2.4 +++ op_header.cpp 3 Aug 2003 19:22:00 -0000 1.3.2.5 @@ -164,11 +164,17 @@ ostream & operator<<(ostream & out, opd_ { op_cpu cpu = static_cast<op_cpu>(header.cpu_type); - out << "CPU: " << op_get_cpu_type_str(cpu); - out << ", speed " << header.cpu_speed << " MHz (estimated)" << endl; - op_print_event(out, cpu, header.ctr_event, header.ctr_um, header.ctr_count); return out; +} + + +void output_cpu_info(std::ostream & out, opd_header const & header) +{ + op_cpu cpu = static_cast<op_cpu>(header.cpu_type); + + out << "CPU: " << op_get_cpu_type_str(cpu); + out << ", speed " << header.cpu_speed << " MHz (estimated)" << endl; } Index: op_header.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/op_header.h,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -u -p -d -r1.2 -r1.2.2.1 --- op_header.h 29 May 2003 00:52:03 -0000 1.2 +++ op_header.h 3 Aug 2003 19:22:00 -0000 1.2.2.1 @@ -45,8 +45,14 @@ void check_mtime(std::string const & fil opd_header read_header(std::string const & sample_filename); /** - * output a readable form of header to out + * output a readable form of header to out, this don't include the cpu type + * and speed */ std::ostream & operator<<(std::ostream & out, opd_header const & header); + +/** + * output a readable form of cpu type and speed extracted from the gien header + */ +void output_cpu_info(std::ostream & out, opd_header const & header); #endif // OP_HEADER_H Index: partition_files.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/partition_files.cpp,v retrieving revision 1.2.2.1 retrieving revision 1.2.2.2 diff -u -p -d -r1.2.2.1 -r1.2.2.2 --- partition_files.cpp 14 Jun 2003 16:52:58 -0000 1.2.2.1 +++ partition_files.cpp 3 Aug 2003 19:22:00 -0000 1.2.2.2 @@ -48,9 +48,6 @@ vector<unmergeable_profile> merge_profil set<unmergeable_profile> spec_set; - // FIXME: what is this for ? - split_sample_filename model = split_sample_file(*files.begin()); - list<string>::const_iterator it; for (it = files.begin(); it != files.end(); ++it) { split_sample_filename spec = split_sample_file(*it); @@ -59,6 +56,43 @@ vector<unmergeable_profile> merge_profil vector<unmergeable_profile> result; copy(spec_set.begin(), spec_set.end(), back_inserter(result)); + + return result; +} + + +unmergeable_samplefile +unmerge_samplefile(list<string> const & files, + vector<unmergeable_profile> const & profiles) +{ + unmergeable_samplefile result(profiles.size()); + + // FIXME: inneficient, a multiset would do the trick in a better way + // but for now I want to test synched walking through multiple profile + unmergeable_samplefile::iterator result_it = result.begin(); + vector<unmergeable_profile>::const_iterator const cend = + profiles.end(); + vector<unmergeable_profile>::const_iterator cit = profiles.begin(); + for ( ; cit != cend ; ++cit, ++result_it) { + list<string>::const_iterator const files_cend = files.end(); + list<string>::const_iterator files_cit = files.begin(); + for ( ; files_cit != files_cend; ++files_cit) { + // FIXME: this is redudant with partition_files, this + // mean we would use split_sample_file rather than + // string earlier and we would get a + // list<split_sample_filename> const & rather than a + // list<string> const & files parameter + // or we want to ret vector<list<split_sample_filename) + split_sample_filename splitted = + split_sample_file(*files_cit); + + if (cit->event == splitted.event && + cit->count == splitted.count) { + result_it->push_back(*files_cit); + } + } + + } return result; } Index: partition_files.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/partition_files.h,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -u -p -d -r1.3 -r1.3.2.1 --- partition_files.h 31 May 2003 18:21:41 -0000 1.3 +++ partition_files.h 3 Aug 2003 19:22:00 -0000 1.3.2.1 @@ -55,6 +55,17 @@ std::vector<unmergeable_profile> merge_p /// convenience function for debug/verbose std::ostream & operator<<(std::ostream & out, unmergeable_profile const & lhs); +/// split samples filenames lists by unmergeable profile +typedef std::vector<std::list<std::string> > unmergeable_samplefile; + +/** + * @param files samples filename list + * @param profiles different unmergeable profile built from files + */ +unmergeable_samplefile +unmerge_samplefile(std::list<std::string> const & files, + std::vector<unmergeable_profile> const & profiles); + /// Partition a list of sample filename. class partition_files { Index: profile.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/profile.cpp,v retrieving revision 1.6.2.3 retrieving revision 1.6.2.4 diff -u -p -d -r1.6.2.3 -r1.6.2.4 --- profile.cpp 14 Jun 2003 01:07:27 -0000 1.6.2.3 +++ profile.cpp 3 Aug 2003 19:22:00 -0000 1.6.2.4 @@ -38,20 +38,40 @@ profile_t::~profile_t() } -void profile_t::add_sample_file(string const & filename, u32 offset) +// static member +unsigned int profile_t::sample_count(string const & filename) { samples_odb_t samples_db; - int rc = odb_open(&samples_db, filename.c_str(), ODB_RDONLY, + open_sample_file(filename, samples_db); + + unsigned int count = 0; + + odb_node_nr_t node_nr, pos; + odb_node_t * node = odb_get_iterator(&samples_db, &node_nr); + for (pos = 0; pos < node_nr; ++pos) { + if (node[pos].key) + count += node[pos].value; + } + + odb_close(&samples_db); + + return count; +} + +//static member +void profile_t::open_sample_file(string const & filename, samples_odb_t & db) +{ + int rc = odb_open(&db, filename.c_str(), ODB_RDONLY, sizeof(struct opd_header)); if (rc != EXIT_SUCCESS) { ostringstream os; - os << samples_db.err_msg << endl; + os << db.err_msg << endl; throw op_fatal_error(os.str()); } - opd_header const & head = *static_cast<opd_header *>(samples_db.base_memory); + opd_header const & head = *static_cast<opd_header *>(db.base_memory); if (head.version != OPD_VERSION) { ostringstream os; @@ -60,6 +80,15 @@ void profile_t::add_sample_file(string c << "mismatch ?\n"; throw op_fatal_error(os.str()); } +} + +void profile_t::add_sample_file(string const & filename, u32 offset) +{ + samples_odb_t samples_db; + + open_sample_file(filename, samples_db); + + opd_header const & head = *static_cast<opd_header *>(samples_db.base_memory); // if we already read a sample file header pointer is non null if (file_header.get()) { @@ -108,7 +137,7 @@ profile_t::samples_range(unsigned int st ordered_samples_t::const_iterator first = ordered_samples.lower_bound(start); ordered_samples_t::const_iterator last = - last = ordered_samples.lower_bound(end); + ordered_samples.lower_bound(end); return make_pair(const_iterator(first, start_offset), const_iterator(last, start_offset)); Index: profile.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/profile.h,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -u -p -d -r1.7 -r1.7.2.1 --- profile.h 9 Jun 2003 00:58:18 -0000 1.7 +++ profile.h 3 Aug 2003 19:22:01 -0000 1.7.2.1 @@ -15,6 +15,7 @@ #include <string> #include <map> +#include <iterator> #include "odb_hash.h" #include "op_types.h" @@ -43,6 +44,16 @@ public: } /** + * count samples count w/o recording them + * @param filename sample filename + * + * convenience interface for raw access to sample count w/o recording + * them. It's placed here so all access to samples files go through + * profile_t static or non static member. + */ + static unsigned int sample_count(string const & filename); + + /** * cumulate sample file to our container of samples * @param filename sample file name * @param offset the offset for kernel files, \sa start_offset @@ -69,6 +80,9 @@ public: iterator_pair samples_range() const; private: + /// helper for sample_count() and add_sample_file(). All error launch + /// an exception. + static void open_sample_file(string const & filename, samples_odb_t &); /// copy of the samples file header scoped_ptr<opd_header> file_header; @@ -97,7 +111,25 @@ private: u32 start_offset; }; -class profile_t::const_iterator { + +// It will be easier to derive profile_t::const_iterator from +// std::iterator<std::input_iterator_tag, unsigned int> but this doesn't +// work for gcc <= 2.95 so we provide the neccessary typedef in the hard way. +// See ISO C++ 17.4.3.1 § 1 and 14.7.3 § 9. +namespace std { + template <> + struct iterator_traits<profile_t::const_iterator> { + typedef ptrdiff_t difference_type; + typedef unsigned int value_type; + typedef unsigned int* pointer; + typedef unsigned int& reference; + typedef input_iterator_tag iterator_category; + }; +} + + +class profile_t::const_iterator +{ typedef ordered_samples_t::const_iterator iterator_t; public: const_iterator() : start_offset(0) {} Index: symbol_sort.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/symbol_sort.cpp,v retrieving revision 1.3.2.1 retrieving revision 1.3.2.2 diff -u -p -d -r1.3.2.1 -r1.3.2.2 --- symbol_sort.cpp 11 Jun 2003 18:48:15 -0000 1.3.2.1 +++ symbol_sort.cpp 3 Aug 2003 19:22:01 -0000 1.3.2.2 @@ -113,7 +113,7 @@ bool symbol_compare::operator()(symbol_e if (ret != 0) return ret < 0; } - return true; + return false; } } // anonymous namespace |