From: Philippe E. <ph...@us...> - 2002-04-07 16:14:21
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv11629/pp Modified Files: op_time.cpp opf_container.cpp opf_filter.cpp oprofpp.cpp oprofpp.h oprofpp_util.cpp Log Message: Reuse samples_file_t to implement opp_samples_file allowing some cleanup and a slighlty performance increase. Now all read access to samples files are made through samples_file_t Phil Index: op_time.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/op_time.cpp,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- op_time.cpp 20 Mar 2002 05:42:36 -0000 1.30 +++ op_time.cpp 7 Apr 2002 16:14:17 -0000 1.31 @@ -615,7 +615,7 @@ opp_samples_files samples_file(samples_filename, counter); - opp_bfd abfd(samples_file.header[samples_file.first_file], + opp_bfd abfd(samples_file.first_header(), samples_file.nr_samples, image_name); samples.add(samples_file, abfd); Index: opf_container.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_container.cpp,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- opf_container.cpp 20 Mar 2002 05:42:36 -0000 1.32 +++ opf_container.cpp 7 Apr 2002 16:14:17 -0000 1.33 @@ -379,7 +379,7 @@ extract_app_name(*it, lib_name); opp_samples_files samples_files(dir + "/" + *it, counter_mask); - opp_bfd abfd(samples_files.header[samples_files.first_file], + opp_bfd abfd(samples_files.first_header(), samples_files.nr_samples, demangle_filename(lib_name)); Index: opf_filter.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_filter.cpp,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- opf_filter.cpp 2 Apr 2002 14:36:11 -0000 1.62 +++ opf_filter.cpp 7 Apr 2002 16:14:18 -0000 1.63 @@ -370,9 +370,12 @@ continue; counter_info[i].enabled = true; - counter_info[i].ctr_event = samples_files.header[i]->ctr_event; - counter_info[i].unit_mask = samples_files.header[i]->ctr_um; - counter_info[i].event_count_sample = samples_files.header[i]->ctr_count; + + const struct opd_header * header = + samples_files.samples[i]->header; + counter_info[i].ctr_event = header->ctr_event; + counter_info[i].unit_mask = header->ctr_um; + counter_info[i].event_count_sample = header->ctr_count; have_counter_info = true; } @@ -813,7 +816,7 @@ // this order of declaration is required to ensure proper // initialisation of oprofpp opp_samples_files samples_files(sample_file, counter_mask); - opp_bfd abfd(samples_files.header[samples_files.first_file], + opp_bfd abfd(samples_files.first_header(), samples_files.nr_samples, image_name); if (!assembly && !abfd.have_debug_info()) { @@ -822,8 +825,8 @@ exit(EXIT_FAILURE); } - cpu_speed = samples_files.header[samples_files.first_file]->cpu_speed; - uint tmp = samples_files.header[samples_files.first_file]->cpu_type; + cpu_speed = samples_files.first_header()->cpu_speed; + uint tmp = samples_files.first_header()->cpu_type; cpu_type = static_cast<op_cpu>(tmp); samples->add(samples_files, abfd); Index: oprofpp.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.cpp,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- oprofpp.cpp 2 Apr 2002 14:36:11 -0000 1.38 +++ oprofpp.cpp 7 Apr 2002 16:14:18 -0000 1.39 @@ -361,18 +361,18 @@ */ void opp_samples_files::output_header() const { - op_cpu cpu = static_cast<op_cpu>(header[first_file]->cpu_type); + const struct opd_header * header = first_header(); + + op_cpu cpu = static_cast<op_cpu>(header->cpu_type); printf("Cpu type: %s\n", op_get_cpu_type_str(cpu)); - printf("Cpu speed was (MHz estimation) : %f\n", - header[first_file]->cpu_speed); + printf("Cpu speed was (MHz estimation) : %f\n", header->cpu_speed); for (uint i = 0 ; i < OP_MAX_COUNTERS; ++i) { - if (fd[i] != -1) { - op_print_event(cout, i, cpu, header[i]->ctr_event, - header[i]->ctr_um, - header[i]->ctr_count); + if (samples[i] != 0) { + op_print_event(cout, i, cpu, header->ctr_event, + header->ctr_um, header->ctr_count); } } } @@ -388,7 +388,7 @@ opp_get_options(argc, argv, image_file, sample_file, counter); opp_samples_files samples_files(sample_file, counter); - opp_bfd abfd(samples_files.header[samples_files.first_file], + opp_bfd abfd(samples_files.first_header(), samples_files.nr_samples, image_file); if (!gproffile) Index: oprofpp.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.h,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- oprofpp.h 2 Apr 2002 14:36:11 -0000 1.49 +++ oprofpp.h 7 Apr 2002 16:14:18 -0000 1.50 @@ -155,6 +155,14 @@ void check_headers(const opd_header * f1, const opd_header * f2); /** + * sanity check of a struct opd_header * + * \param header a pointer to header to check + * + * all error are fatal + */ +void check_event(const opd_header * header); + +/** * validate the counter number * \param counter_mask bit mask specifying the counter nr to use * \param sort_by the counter nr from which we sort @@ -179,7 +187,7 @@ extern char const *samplefile; /** command line option specifying an image filename */ extern const char *imagefile; -/** command line option which specify the base directory of samples files */ +/** command line option specifying the base directory of samples files */ extern char *basedir; /** command line option specifying the set of symbols to ignore */ extern const char * exclude_symbols_str; @@ -309,6 +317,10 @@ bool check_headers(const samples_file_t & headers) const; + u32 count(uint start) const { + return samples[start].count; + } + u32 count(uint start, uint end) const; // probably needs to be private and create the neccessary member @@ -328,8 +340,7 @@ }; /** Store multiple samples files belonging to the same image and the same - * session */ -/* I think this would be rewritten to use an array of samples_file_t */ + * sessionn can hold OP_MAX_COUNTERS sampels files */ struct opp_samples_files { /** * \param sample_file name of sample file to open w/o the #nr suffix @@ -362,7 +373,7 @@ * samples at position sample_nr */ uint samples_count(int index, int sample_nr) const { - return is_open(index) ? samples[index][sample_nr].count : 0; + return is_open(index) ? samples[index]->count(sample_nr) : 0; } /** @@ -386,18 +397,14 @@ // this look like a free fun void output_header() const; + /// return a struct opd_header * of the first openened samples file + const struct opd_header * first_header() const { + return samples[first_file]->header; + } + // TODO privatisze as we can. - /* if entry i is invalid all members are set to zero except fd[i] - * set to -1 */ - opd_fentry *samples[OP_MAX_COUNTERS]; // header + sizeof(header) - opd_header *header[OP_MAX_COUNTERS]; // mapping begin here - fd_t fd[OP_MAX_COUNTERS]; - // This do not include the header size - size_t size[OP_MAX_COUNTERS]; + samples_file_t * samples[OP_MAX_COUNTERS]; uint nr_counters; - // cached value: index to the first opened file, setup as nearly as we - // can in ctor. - int first_file; uint nr_samples; std::string sample_filename; @@ -405,9 +412,12 @@ size_t counter_mask; private: + // cached value: index to the first opened file, setup as nearly as we + // can in ctor. + int first_file; + // ctor helper void open_samples_file(u32 counter, bool can_fail); - void check_event(int i); }; #endif /* OPROFPP_H */ Index: oprofpp_util.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp_util.cpp,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- oprofpp_util.cpp 2 Apr 2002 14:36:11 -0000 1.44 +++ oprofpp_util.cpp 7 Apr 2002 16:14:18 -0000 1.45 @@ -802,6 +802,17 @@ } } +void check_event(const struct opd_header * header) +{ + char * ctr_name; + char * ctr_desc; + char * ctr_um_desc; + + op_cpu cpu = static_cast<op_cpu>(header->cpu_type); + op_get_event_desc(cpu, header->ctr_event, header->ctr_um, + &ctr_name, &ctr_desc, &ctr_um_desc); +} + /** * opp_samples_files - construct an opp_samples_files object * \param sample_file the base name of sample file @@ -829,9 +840,6 @@ /* no samplefiles open initially */ for (i = 0; i < OP_MAX_COUNTERS; ++i) { samples[i] = 0; - header[i] = 0; - fd[i] = -1; - size[i] = 0; } for (i = 0; i < OP_MAX_COUNTERS ; ++i) { @@ -845,7 +853,7 @@ /* find first open file */ for (first_file = 0; first_file < OP_MAX_COUNTERS ; ++first_file) { - if (fd[first_file] != -1) + if (samples[first_file] != 0) break; } @@ -854,31 +862,25 @@ exit(EXIT_FAILURE); } - nr_samples = size[first_file] / sizeof(opd_fentry); - mtime = header[first_file]->mtime; + const struct opd_header * header = samples[first_file]->header; + nr_samples = samples[first_file]->nr_samples; + mtime = header->mtime; /* determine how many counters are possible via the sample file */ - op_cpu cpu = static_cast<op_cpu>(header[first_file]->cpu_type); + op_cpu cpu = static_cast<op_cpu>(header->cpu_type); nr_counters = op_get_cpu_nr_counters(cpu); /* check sample files match */ for (j = first_file + 1; j < OP_MAX_COUNTERS; ++j) { - if (fd[j] == -1) + if (samples[j] == 0) continue; - if (size[first_file] != size[j]) { - fprintf(stderr, "oprofpp: mapping file size for ctr " - "(%d, %d) are different (%d, %d)\n", - first_file, j, size[first_file], size[j]); - - exit(EXIT_FAILURE); - } - check_headers(header[first_file], header[j]); + samples[first_file]->check_headers(*samples[j]); } /* sanity check on ctr_um, ctr_event and cpu_type */ for (i = 0 ; i < OP_MAX_COUNTERS; ++i) { - if (fd[i] != -1) - check_event(i); + if (samples[i] != 0) + check_event(samples[i]->header); } verbprintf("nr_samples %d\n", nr_samples); @@ -894,10 +896,7 @@ uint i; for (i = 0 ; i < OP_MAX_COUNTERS; ++i) { - if (header[i]) { - munmap(header[i], size[i] + sizeof(opd_header)); - close(fd[i]); - } + delete samples[i]; } } @@ -965,41 +964,16 @@ filename << sample_filename << "#" << counter; std::string temp = filename.str(); - fd[counter] = open(temp.c_str(), O_RDONLY); - if (fd[counter] == -1) { - if (can_fail == false) { + if (access(temp.c_str(), R_OK) == 0) { + samples[counter] = new samples_file_t(temp); + } + else { + if (can_fail == false) { /* FIXME: nicer message if e.g. wrong counter */ fprintf(stderr, "oprofpp: Opening %s failed. %s\n", temp.c_str(), strerror(errno)); exit(EXIT_FAILURE); } - header[counter] = NULL; - samples[counter] = NULL; - size[counter] = 0; - return; } - - ::open_samples_file(fd[counter], size[counter], - samples[counter], header[counter], temp); -} - -/** - * check_event - check and translate an event - * \param i counter number - * - * the member variable describing the event are - * updated. - * - * all error are fatal - */ -void opp_samples_files::check_event(int i) -{ - char * ctr_name; - char * ctr_desc; - char * ctr_um_desc; - - op_cpu cpu = static_cast<op_cpu>(header[i]->cpu_type); - op_get_event_desc(cpu, header[i]->ctr_event, header[i]->ctr_um, - &ctr_name, &ctr_desc, &ctr_um_desc); } /** @@ -1038,12 +1012,9 @@ for (uint k = 0; k < nr_counters; ++k) { if (is_open(k)) { - for (uint j = start ; j < end; ++j) { - if (samples[k][j].count) { - counter[k] += samples[k][j].count; - found_samples = true; - } - } + counter[k] += samples[k]->count(start, end); + if (counter[k]) + found_samples = true; } } |