You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(7) |
Aug
(50) |
Sep
(210) |
Oct
(93) |
Nov
(99) |
Dec
(101) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
(283) |
Feb
(42) |
Mar
(148) |
Apr
(94) |
May
(256) |
Jun
(206) |
Jul
(101) |
Aug
(28) |
Sep
(159) |
Oct
(102) |
Nov
(216) |
Dec
(159) |
2003 |
Jan
(112) |
Feb
(149) |
Mar
(332) |
Apr
(261) |
May
(528) |
Jun
(270) |
Jul
(231) |
Aug
(231) |
Sep
(338) |
Oct
(445) |
Nov
(212) |
Dec
(26) |
2004 |
Jan
(179) |
Feb
(109) |
Mar
(20) |
Apr
(20) |
May
(55) |
Jun
(11) |
Jul
(38) |
Aug
(13) |
Sep
(28) |
Oct
(13) |
Nov
(41) |
Dec
(30) |
2005 |
Jan
(17) |
Feb
(4) |
Mar
(62) |
Apr
(176) |
May
(44) |
Jun
(13) |
Jul
(16) |
Aug
(154) |
Sep
(6) |
Oct
(13) |
Nov
(4) |
Dec
(6) |
2006 |
Jan
(12) |
Feb
(11) |
Mar
(9) |
Apr
(1) |
May
(10) |
Jun
(6) |
Jul
(10) |
Aug
(10) |
Sep
(27) |
Oct
(25) |
Nov
(40) |
Dec
(18) |
2007 |
Jan
(13) |
Feb
(25) |
Mar
(6) |
Apr
(14) |
May
(52) |
Jun
(22) |
Jul
(20) |
Aug
(8) |
Sep
(2) |
Oct
(138) |
Nov
(152) |
Dec
(73) |
2008 |
Jan
(52) |
Feb
(31) |
Mar
(5) |
Apr
(48) |
May
(20) |
Jun
(14) |
Jul
(36) |
Aug
(16) |
Sep
(1) |
Oct
(19) |
Nov
(13) |
Dec
(4) |
2009 |
Jan
(2) |
Feb
(13) |
Mar
(10) |
Apr
(28) |
May
(46) |
Jun
(21) |
Jul
(21) |
Aug
(22) |
Sep
(8) |
Oct
(25) |
Nov
(15) |
Dec
(2) |
2010 |
Jan
(12) |
Feb
|
Mar
(8) |
Apr
(3) |
May
(2) |
Jun
(5) |
Jul
(11) |
Aug
(17) |
Sep
|
Oct
(12) |
Nov
(14) |
Dec
(10) |
2011 |
Jan
(6) |
Feb
|
Mar
(8) |
Apr
(6) |
May
(17) |
Jun
(8) |
Jul
(4) |
Aug
(9) |
Sep
(2) |
Oct
(3) |
Nov
(4) |
Dec
(2) |
2012 |
Jan
(4) |
Feb
(7) |
Mar
(16) |
Apr
(9) |
May
(15) |
Jun
(22) |
Jul
(30) |
Aug
(36) |
Sep
(6) |
Oct
(5) |
Nov
(9) |
Dec
(11) |
2013 |
Jan
(17) |
Feb
(11) |
Mar
(7) |
Apr
(8) |
May
(15) |
Jun
(19) |
Jul
(27) |
Aug
(3) |
Sep
(3) |
Oct
(8) |
Nov
(6) |
Dec
(10) |
2014 |
Jan
(15) |
Feb
(16) |
Mar
(4) |
Apr
(3) |
May
(10) |
Jun
(9) |
Jul
(9) |
Aug
(31) |
Sep
(11) |
Oct
(6) |
Nov
(4) |
Dec
(3) |
2015 |
Jan
(2) |
Feb
(1) |
Mar
(2) |
Apr
(3) |
May
(4) |
Jun
(5) |
Jul
(14) |
Aug
(2) |
Sep
(2) |
Oct
(1) |
Nov
(4) |
Dec
(4) |
2016 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
(4) |
May
(2) |
Jun
|
Jul
(2) |
Aug
(1) |
Sep
(1) |
Oct
(3) |
Nov
(1) |
Dec
|
2017 |
Jan
(4) |
Feb
|
Mar
(1) |
Apr
(3) |
May
|
Jun
(9) |
Jul
(11) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
(1) |
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
(3) |
Jul
(10) |
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2019 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
(6) |
Jun
|
Jul
(2) |
Aug
(2) |
Sep
(1) |
Oct
|
Nov
|
Dec
(1) |
2020 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
(4) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
From: John L. <mov...@us...> - 2001-09-18 02:16:58
|
Update of /cvsroot/oprofile/oprofile/dae In directory usw-pr-cvs1:/tmp/cvs-serv7793/dae Modified Files: opd_proc.c oprofiled.h Log Message: doc fixes, implement image hashing in daemon Index: opd_proc.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/opd_proc.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- opd_proc.c 2001/09/18 01:00:33 1.72 +++ opd_proc.c 2001/09/18 02:16:55 1.73 @@ -55,10 +55,11 @@ static struct opd_proc *opd_add_proc(u16 pid); static void opd_grow_images(void); static void opd_open_sample_file(struct opd_image *image, int counter); -static void opd_open_image(struct opd_image *image, const char *name, int kernl); -static int opd_find_image(const char *name); -static int opd_add_image(const char *name, int kernel); -static int opd_get_image(const char *name, int kernel); +static void opd_open_image(struct opd_image *image, int hash, const char *name, int kernl); +static int opd_find_image(const char *name, int hash); +static int opd_add_image(const char *name, int hash, int kernel); +static int opd_get_image(const char *name, int hash, int kernel); +static int opd_get_image_by_hash(int hash); static void opd_init_maps(struct opd_proc *proc); static void opd_grow_maps(struct opd_proc *proc); static void opd_kill_maps(struct opd_proc *proc); @@ -285,6 +286,7 @@ /** * opd_open_image - open an image sample file * @image: image to open file for + * @hash: hash of image * @name: name of the image to add * @kernel: is the image a kernel/module image * @@ -296,12 +298,13 @@ * without opening the associated samples files. At return * the @image is fully initialized. */ -static void opd_open_image(struct opd_image *image, const char *name, int kernel) +static void opd_open_image(struct opd_image *image, int hash, const char *name, int kernel) { uint i; image->name = opd_strdup(name); image->kernel = kernel; + image->hash = hash; image->len = 0; for (i = 0 ; i < op_nr_counters ; ++i) { @@ -463,7 +466,7 @@ } free(mangled); - opd_open_image(image, tmp, image->kernel); + opd_open_image(image, image->hash, tmp, image->kernel); free(tmp); } @@ -533,7 +536,7 @@ opd_images[0].name = opd_strdup(vmlinux); opd_images[0].kernel = 1; - opd_open_image(&opd_images[0], vmlinux, 1); + opd_open_image(&opd_images[0], -1, vmlinux, 1); nr_images = 1; } @@ -576,18 +579,22 @@ /** * opd_find_image - find an image - * @name: file name of image to find + * @name: name of image to find + * @hash: hash of image to find * * Returns the image number for the file specified by @name, or -1. */ -static int opd_find_image(const char *name) +static int opd_find_image(const char * name, int hash) { unsigned int i; - /* FIXME: use hash table */ - for (i=1; i<nr_images; i++) { - if (bstreq(opd_images[i].name, name)) + /* we can have hashless images from /proc/pid parsing */ + for (i=1; i < nr_images; i++) { + if (bstreq(opd_images[i].name, name)) { + if (hash != -1) + opd_images[i].hash = hash; return i; + } } return -1; @@ -596,6 +603,7 @@ /** * opd_add_image - add an image to the image structure * @name: name of the image to add + * @hash: hash of image * @kernel: is the image a kernel/module image * * Add an image to the image structure with name @name. @@ -605,9 +613,9 @@ * * The image number is returned. */ -static int opd_add_image(const char *name, int kernel) +static int opd_add_image(const char * name, int hash, int kernel) { - opd_open_image(&opd_images[nr_images], name, kernel); + opd_open_image(&opd_images[nr_images], hash, name, kernel); nr_images++; if (nr_images == max_nr_images) @@ -617,8 +625,28 @@ } /** + * opd_get_image_by_hash - get an image from the image structure by hash value + * @hash: hash of the image to get + * + * Get the image specified by the hash @hash if present, else return -1 + */ +static int opd_get_image_by_hash(int hash) +{ + unsigned int i; + + for (i=1; i < nr_images; i++) { + verbprintf("Looking for hash %d, this (%s) is %d\n", hash, opd_images[i].name, opd_images[i].hash); + if (opd_images[i].hash == hash) + return i; + } + return -1; +} + + +/** * opd_get_image - get an image from the image structure - * @name: name of the image to get + * @name: name of image + * @hash: hash of the image to get * @kernel: is the image a kernel/module image * * Get the image specified by the file name @name from the @@ -626,11 +654,11 @@ * added to the structure. In either case, the image number * is returned. */ -static int opd_get_image(const char *name, int kernel) +static int opd_get_image(const char * name, int hash, int kernel) { int image_nr; - if ((image_nr = opd_find_image(name)) == -1) - image_nr = opd_add_image(name, kernel); + if ((image_nr = opd_find_image(name, hash)) == -1) + image_nr = opd_add_image(name, hash, kernel); return image_nr; } @@ -968,7 +996,7 @@ strncpy(filename, cp2, (size_t)(cp3 - cp2)); filename[cp3-cp2] = '\0'; - mod->image = opd_get_image(filename, 1); + mod->image = opd_get_image(filename, -1, 1); opd_free(filename); break; @@ -1326,7 +1354,36 @@ } } + /** + * opd_handle_hashmap - parse image from kernel hash map + * @hash: hash value + * @c: string to fill + * + * Finds an image from a hashmap hash value + */ +static int opd_handle_hashmap(int hash, char **c) +{ + int orighash = hash; + + while (hash) { + if (strlen(hashmap[hash].name)+ 1 + strlen(*c) >= PATH_MAX) { + fprintf(stderr,"String \"%s\" too large.\n", *c); + exit(1); + } + + *c -= strlen(hashmap[hash].name) + 1; + **c = '/'; + strncpy(*c + 1, hashmap[hash].name, strlen(hashmap[hash].name)); + + /* move onto parent */ + hash = hashmap[hash].parent; + } + return opd_get_image(*c, orighash, 0); +} + + +/** * opd_handle_mapping - deal with mapping notification * @mapping: mapping info * @@ -1339,7 +1396,8 @@ static char file[PATH_MAX]; char *c=&file[PATH_MAX-1]; struct opd_proc *proc; - short hash; + int hash; + int im_nr; proc = opd_get_proc(mapping->pid); @@ -1352,34 +1410,21 @@ hash = mapping->hash; - while (hash) { - if (hash == -1) { - /* possibly deleted file */ - return; - } - - if (hash < 0 || hash >= OP_HASH_MAP_NR) { - fprintf(stderr,"hash value %u out of range.\n",hash); - return; - } - - if (strlen(hashmap[hash].name)+1+strlen(c) >= PATH_MAX) { - fprintf(stderr,"String \"%s\" too large.\n", file); - exit(1); - } + if (hash == -1) { + /* possibly deleted file */ + return; + } - c -= strlen(hashmap[hash].name)+1; - strncpy(c,"/",1); - strncpy(c+1, hashmap[hash].name, strlen(hashmap[hash].name)); - - /* move onto parent */ - hash = hashmap[hash].parent; + if (hash < 0 || hash >= OP_HASH_MAP_NR) { + fprintf(stderr,"hash value %u out of range.\n",hash); + return; } - verbprintf("Mapping for pid %d: \"%s\", 0x%x, len 0x%x, offset 0x%x\n", - mapping->pid, c, mapping->addr, mapping->len, mapping->offset); + im_nr = opd_get_image_by_hash(hash); + if (im_nr == -1) + im_nr = opd_handle_hashmap(hash, &c); - opd_put_mapping(proc, opd_get_image(c,0), mapping->addr, mapping->offset, mapping->addr + mapping->len); + opd_put_mapping(proc, im_nr, mapping->addr, mapping->offset, mapping->addr + mapping->len); } /** @@ -1447,7 +1492,7 @@ if (!*cp) return FALSE; - map->image = opd_get_image(cp, 0); + map->image = opd_get_image(cp, -1, 0); if (!map->image) return FALSE; Index: oprofiled.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/oprofiled.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- oprofiled.h 2001/09/01 02:03:34 1.31 +++ oprofiled.h 2001/09/18 02:16:55 1.32 @@ -92,6 +92,7 @@ struct opd_image { struct opd_sample_file sample_files[OP_MAX_COUNTERS]; + int hash; /* NOT counted the size of footer, to allow quick access check */ off_t len; time_t mtime; /* image file mtime */ |
From: John L. <mov...@us...> - 2001-09-18 02:16:58
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv7793 Modified Files: ChangeLog Log Message: doc fixes, implement image hashing in daemon Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.121 retrieving revision 1.122 diff -u -d -r1.121 -r1.122 --- ChangeLog 2001/09/18 01:00:33 1.121 +++ ChangeLog 2001/09/18 02:16:55 1.122 @@ -1,5 +1,12 @@ 2001-09-18 John Levon <mo...@co...> + * dae/opd_proc.c: + * dae/oprofiled.h: implement hashing of images + + * doc/oprofile.sgml: fix -- issue and use <screen> + +2001-09-18 John Levon <mo...@co...> + * .cvsignore: * README: update |
From: John L. <mov...@us...> - 2001-09-18 01:00:41
|
Update of /cvsroot/oprofile/oprofile/dae In directory usw-pr-cvs1:/tmp/cvs-serv28569/dae Modified Files: opd_proc.c Log Message: couple of bug fixes, fix mtime and changed binary issue (I doubt the over head is noticable) Index: opd_proc.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/opd_proc.c,v retrieving revision 1.71 retrieving revision 1.72 diff -u -d -r1.71 -r1.72 --- opd_proc.c 2001/09/15 01:51:30 1.71 +++ opd_proc.c 2001/09/18 01:00:33 1.72 @@ -254,8 +254,8 @@ /** - * opd_handle_old_sample_files - deal with old sample file - * @image_name: image to open file for + * opd_handle_old_sample_files - deal with old sample files + * @image_name: image to open files for * @mtime: the new mtime of the binary * * to simplify admin of sample file we rename or remove sample @@ -268,12 +268,14 @@ { uint i; char *mangled; + uint len; mangled = opd_mangle_filename(smpdir, image_name); + len = strlen(mangled); + for (i = 0 ; i < op_nr_counters ; ++i) { - sprintf(mangled + strlen(mangled), "#%d", i); - + sprintf(mangled + len, "#%d", i); opd_handle_old_sample_file(i, mangled, mtime); } @@ -308,13 +310,13 @@ image->sample_files[i].footer = (void *)-1; } - verbprintf("Statting \"%s\"\n", name); + verbprintf("Getting size of \"%s\"\n", name); /* for each byte in original one counter */ image->len = opd_get_fsize(name, 0) * sizeof(struct opd_fentry); if (!image->len) { - fprintf(stderr, "stat failed for %s\n", name); + verbprintf("Size check failed for %s\n", name); return; } @@ -329,7 +331,7 @@ opd_handle_old_sample_files(name, image->mtime); - /* samples files are lazilly openeded */ + /* samples files are lazily openeded */ } /** @@ -427,6 +429,45 @@ goto out; } + +/** + * opd_check_image_mtime - ensure samples file is up to date + * @image: image to check + */ +static void opd_check_image_mtime(struct opd_image * image) +{ + uint i; + char *mangled; + uint len; + char * tmp = image->name; + time_t newmtime = opd_get_mtime(image->name); + + if (image->mtime == newmtime) + return; + + verbprintf("Current mtime %lu differs from stored " + "mtime %lu for %s\n", newmtime, image->mtime, image->name); + + mangled = opd_mangle_filename(smpdir, image->name); + len = strlen(mangled); + + for (i=0; i < op_nr_counters; i++) { + struct opd_sample_file * file = &image->sample_files[i]; + if (file->fd > 0) { + close(file->fd); + munmap(file->footer, image->len + sizeof(struct opd_footer)); + } + sprintf(mangled + len, "#%d", i); + verbprintf("Deleting out of date \"%s\"\n", mangled); + unlink(mangled); + } + free(mangled); + + opd_open_image(image, tmp, image->kernel); + free(tmp); +} + + /** * opd_put_image_sample - write sample to file * @image: image for sample @@ -1209,6 +1250,8 @@ verbprintf("Placing mapping for process %d: 0x%.8x-0x%.8x, off 0x%.8x, \"%s\"\n", proc->pid, start, end, offset, opd_images[image_nr].name); + opd_check_image_mtime(&opd_images[image_nr]); + proc->maps[proc->nr_maps].image = image_nr; proc->maps[proc->nr_maps].start = start; proc->maps[proc->nr_maps].offset = offset; @@ -1351,6 +1394,9 @@ verbprintf("DO_EXEC: pid %u\n", pid); + /* FIXME: we should save old maps into ->old_exec() + * to reduce loss of samples in fork()/exec() window + */ proc = opd_get_proc(pid); if (proc) opd_kill_maps(proc); |
From: John L. <mov...@us...> - 2001-09-18 01:00:40
|
Update of /cvsroot/oprofile/oprofile/doc In directory usw-pr-cvs1:/tmp/cvs-serv28569/doc Modified Files: oprofile.sgml Log Message: couple of bug fixes, fix mtime and changed binary issue (I doubt the over head is noticable) Index: oprofile.sgml =================================================================== RCS file: /cvsroot/oprofile/oprofile/doc/oprofile.sgml,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- oprofile.sgml 2001/09/08 21:46:04 1.25 +++ oprofile.sgml 2001/09/18 01:00:33 1.26 @@ -661,8 +661,9 @@ along with the binary file being profiled, to produce human-readable data. Note that if the binary file changes after the sample file was created, you won't be able to get useful data out. This situation is detected for you. A similar scenario can happen when re-starting profiling, as the old sample files from previous sessions don't -get deleted (allowing you to build profiles over many distinct profiling sessions). However in this case, if the -binary has changed, the old sample file is automatically deleted for you. +get deleted (allowing you to build profiles over many distinct profiling sessions). +If the sample file is determined to be out of date, it is backed up with a different session number (appended to +the name of the sample file), or deleted, as appropriate. </para> <para> Note that kernel modules without symbol data (this can happen with some initrd setups) cannot be profiled (modules |
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv28569 Modified Files: .cvsignore ChangeLog README configure.in op_init.c op_syscalls.c op_x86.c oprofile.c oprofile.h Log Message: couple of bug fixes, fix mtime and changed binary issue (I doubt the over head is noticable) Index: .cvsignore =================================================================== RCS file: /cvsroot/oprofile/oprofile/.cvsignore,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- .cvsignore 2001/09/01 21:50:35 1.3 +++ .cvsignore 2001/09/18 01:00:33 1.4 @@ -2,8 +2,10 @@ Makefile version.h a.diff +aclocal.m4 oprofile.s confdefs.h config.log config.cache config.status +tags Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.120 retrieving revision 1.121 diff -u -d -r1.120 -r1.121 --- ChangeLog 2001/09/16 18:05:25 1.120 +++ ChangeLog 2001/09/18 01:00:33 1.121 @@ -1,3 +1,22 @@ +2001-09-18 John Levon <mo...@co...> + + * .cvsignore: + * README: update + + * configure.in: small cleanup + + * op_init.c: add comment + + * oprofile.h: + * op_syscalls.c: + * op_x86.c: move fixmap stuff, remove disable APIC + + * oprofile.c: init failure fix + + * doc/oprofile.sgml: + * dae/opd_proc.c: fix handle_old_sample_files() bug, + check mtime hasn't changed on a new map + 2001-09-16 John Levon <mo...@co...> * acinclude.m4: Index: README =================================================================== RCS file: /cvsroot/oprofile/oprofile/README,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- README 2001/08/19 20:09:17 1.12 +++ README 2001/09/18 01:00:33 1.13 @@ -8,7 +8,7 @@ oprofile was written by John Levon <mo...@co...>. Philippe Elie <ph...@cl...> contributed many bug fixes, -wrote the tcl/tk oprofile interface and the source annotation facility, +started the Qt2 oprofile interface, wrote the source annotation facility, and more. Dave Jones <da...@su...> provided bug fixes and the Athlon support. Index: configure.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/configure.in,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- configure.in 2001/09/16 18:05:25 1.31 +++ configure.in 2001/09/18 01:00:33 1.32 @@ -30,19 +30,6 @@ test "x$1" = "x1" && x=yes AC_MSG_RESULT($x)]) -dnl AX_EGREP(expr, file, action-if-found, action-if-not-found) -dnl egrep for expr in file -AC_DEFUN(AX_EGREP, [dnl -changequote(, )dnl - if egrep "$1" $2 >/dev/null 2>&1; then -changequote([, ])dnl - ifelse([$3], , :, [$3]) -ifelse([$4], , , [else - $4 -])dnl -fi -]) - dnl AX_COMPILE_OPTION(option, action-if-found, action-if-not-found) dnl see if autoconf.h defines the option AC_DEFUN(AX_COMPILE_OPTION, [ @@ -122,10 +109,6 @@ test "$mv" = 1 && MODVERSIONS="-DMODVERSIONS -include $KINC/linux/modversions.h" AC_SUBST(MODVERSIONS) -# this serves to ensure that CONFIG_X86_UP_IOAPIC *or* CONFIG_X86_UP_APIC -# have been selected. The first case means we have to do APIC setup ourselves, -# the second case, it is important NOT to do it ! -# in SMP, I have NO idea... if test "$smp" = 0; then AC_MSG_CHECKING(for local APIC) AX_COMPILE_OPTION(CONFIG_X86_LOCAL_APIC,apic=1,apic=0) Index: op_init.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_init.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- op_init.c 2001/09/12 02:54:30 1.9 +++ op_init.c 2001/09/18 01:00:33 1.10 @@ -17,6 +17,8 @@ #include "oprofile.h" +/* these routines are in a separate file so the rest can be compiled for i686 */ + EXPORT_NO_SYMBOLS; MODULE_PARM(expected_cpu_type, "i"); Index: op_syscalls.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_syscalls.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- op_syscalls.c 2001/09/12 05:21:57 1.17 +++ op_syscalls.c 2001/09/18 01:00:33 1.18 @@ -31,43 +31,6 @@ extern pid_t pgrp_filter; extern u32 prof_on; -/* FIXME: can remove this code altogether if UP oopser makes mainline, and insist on - * CONFIG_X86_UP_APIC - */ -#ifndef CONFIG_X86_UP_APIC - -#ifndef APIC_DEFAULT_PHYS_BASE -#define APIC_DEFAULT_PHYS_BASE 0xfee00000 -#endif -static void set_pte_phys(ulong vaddr, ulong phys) -{ - pgprot_t prot; - pgd_t *pgd; - pmd_t *pmd; - pte_t *pte; - - pgd = pgd_offset_k(vaddr); - pmd = pmd_offset(pgd, vaddr); - pte = pte_offset(pmd, vaddr); - prot = PAGE_KERNEL; - if (test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability)) - pgprot_val(prot) |= _PAGE_GLOBAL; - set_pte(pte, mk_pte_phys(phys, prot)); - __flush_tlb_one(vaddr); -} - -void my_set_fixmap(void) -{ - ulong address = __fix_to_virt(FIX_APIC_BASE); - - set_pte_phys (address, APIC_DEFAULT_PHYS_BASE); -} -#else /* !CONFIG_X86_UP_APIC */ -void my_set_fixmap(void) -{ -} -#endif /* !CONFIG_X86_UP_APIC */ - /* Given PGD from the address space's page table, return the kernel * virtual mapping of the physical memory mapped at ADR. */ Index: op_x86.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/op_x86.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- op_x86.c 2001/09/12 05:21:57 1.2 +++ op_x86.c 2001/09/18 01:00:33 1.3 @@ -71,59 +71,6 @@ static int smp_hardware; -/* PHE : this would be probably an unconditionnaly restore state from a saved - *state - */ -void disable_local_P6_APIC(void *dummy) -{ -#ifndef CONFIG_X86_UP_APIC - ulong v; - uint l; - uint h; - - /* FIXME: maybe this should go at end of function ? */ - /* PHE I think when the doc says : -if you disable the apic the bits - * of LVT cannot be reset- it talk about the SW disable through bit 8 - * of SPIV see 7.4.14 (7.5.14) not the hardware disable, so it is ok - * but perhaps we need a software disable of the APIC at the end - */ - /* first disable via MSR */ - /* IA32 V3, 7.4.2 */ - rdmsr(MSR_IA32_APICBASE, l, h); - wrmsr(MSR_IA32_APICBASE, l & ~(1<<11), h); - - /* - * Careful: we have to set masks only first to deassert - * any level-triggered sources. - */ - v = apic_read(APIC_LVTT); - apic_write(APIC_LVTT, v | APIC_LVT_MASKED); - v = apic_read(APIC_LVT0); - apic_write(APIC_LVT0, v | APIC_LVT_MASKED); - v = apic_read(APIC_LVT1); - apic_write(APIC_LVT1, v | APIC_LVT_MASKED); - v = apic_read(APIC_LVTERR); - apic_write(APIC_LVTERR, v | APIC_LVT_MASKED); - v = apic_read(APIC_LVTPC); - apic_write(APIC_LVTPC, v | APIC_LVT_MASKED); - - /* - * Clean APIC state for other OSs: - */ - apic_write(APIC_LVTT, APIC_LVT_MASKED); - apic_write(APIC_LVT0, APIC_LVT_MASKED); - apic_write(APIC_LVT1, APIC_LVT_MASKED); - apic_write(APIC_LVTERR, APIC_LVT_MASKED); - apic_write(APIC_LVTPC, APIC_LVT_MASKED); - - v = apic_read(APIC_SPIV); - v &= ~APIC_SPIV_APIC_ENABLED; - apic_write(APIC_SPIV, v); - - printk(KERN_INFO "oprofile: disabled local APIC.\n"); -#endif -} - static uint lvtpc_old_mask[NR_CPUS]; static uint lvtpc_old_mode[NR_CPUS]; @@ -260,6 +207,45 @@ wrmsr(MSR_IA32_APICBASE, msr_low & ~(1<<11), msr_high); return -ENODEV; } + +/* ---------------- fixmap hack ------------------ */ + +/* FIXME: can remove this code altogether if UP oopser makes mainline, and insist on + * CONFIG_X86_UP_APIC + */ +#ifndef CONFIG_X86_UP_APIC + +#ifndef APIC_DEFAULT_PHYS_BASE +#define APIC_DEFAULT_PHYS_BASE 0xfee00000 +#endif +static void set_pte_phys(ulong vaddr, ulong phys) +{ + pgprot_t prot; + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + + pgd = pgd_offset_k(vaddr); + pmd = pmd_offset(pgd, vaddr); + pte = pte_offset(pmd, vaddr); + prot = PAGE_KERNEL; + if (test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability)) + pgprot_val(prot) |= _PAGE_GLOBAL; + set_pte(pte, mk_pte_phys(phys, prot)); + __flush_tlb_one(vaddr); +} + +void my_set_fixmap(void) +{ + ulong address = __fix_to_virt(FIX_APIC_BASE); + + set_pte_phys (address, APIC_DEFAULT_PHYS_BASE); +} +#else /* !CONFIG_X86_UP_APIC */ +void my_set_fixmap(void) +{ +} +#endif /* !CONFIG_X86_UP_APIC */ /* ---------------- MP table code ------------------ */ Index: oprofile.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/oprofile.c,v retrieving revision 1.88 retrieving revision 1.89 diff -u -d -r1.88 -r1.89 --- oprofile.c 2001/09/15 01:51:30 1.88 +++ oprofile.c 2001/09/18 01:00:33 1.89 @@ -975,20 +975,20 @@ return err; if ((err = init_sysctl())) - goto out_err; + return err; if ((err = smp_call_function(lvtpc_apic_setup, NULL, 0, 1))) goto out_err; err = op_major = register_chrdev(0, "oprof", &oprof_fops); if (err<0) - goto out_err; + goto out_err2; err = oprof_init_hashmap(); if (err < 0) { printk("oprofile: couldn't allocate hash map !\n"); unregister_chrdev(op_major, "oprof"); - goto out_err; + goto out_err2; } /* module might not be unloadable */ @@ -1000,9 +1000,11 @@ printk("oprofile: oprofile loaded, major %u\n", op_major); return 0; +out_err2: + smp_call_function(lvtpc_apic_restore, NULL, 0, 1); + lvtpc_apic_restore(NULL); out_err: - smp_call_function(disable_local_P6_APIC, NULL, 0, 1); - disable_local_P6_APIC(NULL); + cleanup_sysctl(); return err; } Index: oprofile.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/oprofile.h,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- oprofile.h 2001/09/12 05:21:58 1.52 +++ oprofile.h 2001/09/18 01:00:33 1.53 @@ -133,7 +133,7 @@ ((((((eip&0xff000)>>3) ^ eip) ^ (pid&0xff)) ^ (eip<<9)) \ ^ (ctr<<8)) & (data->hash_size - 1) -/* do not rely on MSR numbers being neighbours */ +/* read/write of perf counters */ #define get_perfctr(l,h,c) do { rdmsr(perfctr_msr[(c)], (l), (h)); } while (0) #define set_perfctr(l,c) do { wrmsr(perfctr_msr[(c)], -(u32)(l), -1); } while (0) #define ctr_overflowed(n) (!((n) & (1U<<31))) @@ -230,4 +230,3 @@ void install_nmi(void); void restore_nmi(void); int apic_setup(void); -void disable_local_P6_APIC(void *dummy); |
From: John L. <mov...@us...> - 2001-09-16 18:05:28
|
Update of /cvsroot/oprofile/oprofile/gui/ui In directory usw-pr-cvs1:/tmp/cvs-serv5344/gui/ui Added Files: Makefile.in oprof_start.base.ui Log Message: autoconfiscation for Qt2 --- NEW FILE: Makefile.in --- MOC=@MOC@ UIC=@UIC@ .PHONY: all clean install uninstall .SUFFIXES: all: oprof_start.base.o oprof_start.base.moc.o # oprof_start.cpp, oprof_start.h are generated file, but must not re-generated clean: rm -f *.o *.moc.* oprof_start.base.cpp oprof_start.base.h # TODO: the sys_include is for the <sstream> thing add it to distrib CFLAGS=-g -ansi -Wall --pedantic -O2 @QT2_INCLUDES@ install: uninstall: %.o: %.cpp g++ -c $(CFLAGS) $< -o $@ %.o: %.c gcc -c $(CFLAGS) $< -o $@ oprof_start.base.moc.o: oprof_start.base.moc.cpp oprof_start.base.h oprof_start.base.o: oprof_start.base.cpp oprof_start.base.h # generate qt header file oprof_start.base.h: oprof_start.base.ui $(UIC) -o oprof_start.base.h oprof_start.base.ui # generate qt implementation file oprof_start.base.cpp: oprof_start.base.h oprof_start.base.ui $(UIC) -o oprof_start.base.cpp -impl oprof_start.base.h oprof_start.base.ui # generate qt moc code for base class oprof_start.base.moc.cpp: oprof_start.base.h $(MOC) -o oprof_start.base.moc.cpp oprof_start.base.h # DO NOT un-comment these lines: just an examples of how to start a new form. # after using this line you must edit oprof_start.cpp and replace the include # oprof_start_base.h by oprof_start.h before compile it. I follow the following # name scheme : xxxx.base.ui is the saved designer file form. xxxx_base.cpp/.h # are base class read-only file. xxx.cpp/.h are derived class. # generate qt subclass header/implementation file, these file are created once #uic -o oprof_start.h -subdecl oprof_start oprof_start.base.h oprof_start.base.ui #uic -o oprof_start.cpp -subimpl oprof_start oprof_start.h oprof_start.base.ui --- NEW FILE: oprof_start.base.ui --- <!DOCTYPE UI><UI> <class>oprof_start_base</class> <widget> <class>QDialog</class> <property stdset="1"> <name>name</name> <cstring>oprof_start_base</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> <width>669</width> <height>547</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Start profiler</string> </property> <property stdset="1"> <name>sizeGripEnabled</name> <bool>true</bool> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>buttonHelp</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>480</y> <width>80</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>&Help</string> </property> <property stdset="1"> <name>autoDefault</name> <bool>true</bool> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>quit_and_save_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>560</x> <y>480</y> <width>100</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>&Quit and save</string> </property> <property stdset="1"> <name>autoDefault</name> <bool>true</bool> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>start_stop_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>150</x> <y>480</y> <width>350</width> <height>30</height> </rect> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>start_profiler_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Start profiler</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>flush_profiler_data_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Flush profiler data</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>stop_profiler_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Stop profiler</string> </property> </widget> </hbox> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>event_help_label</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>true</bool> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>520</y> <width>650</width> <height>20</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>WinPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Sunken</enum> </property> <property stdset="1"> <name>text</name> <string>event help label, should be redim if main form redim</string> </property> </widget> <widget> <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>setup_config_tab</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>290</x> <y>10</y> <width>380</width> <height>460</height> </rect> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>counter_setup_page</cstring> </property> <attribute> <name>title</name> <string>Counter setup</string> </attribute> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>all_events_to_default_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>40</x> <y>400</y> <width>130</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>All events to default</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>selected_event_to_default</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>200</x> <y>400</y> <width>150</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Selected event to default</string> </property> </widget> <widget> <class>QFrame</class> <property stdset="1"> <name>name</name> <cstring>unit_mask_frame</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>8</x> <y>105</y> <width>360</width> <height>280</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>StyledPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Raised</enum> </property> <widget> <class>QButtonGroup</class> <property stdset="1"> <name>name</name> <cstring>unit_mask_group</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> <width>360</width> <height>280</height> </rect> </property> <property stdset="1"> <name>title</name> <string>unit mask</string> </property> </widget> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel1_2</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>20</x> <y>70</y> <width>50</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Count</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>user_ring_count_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>30</x> <y>40</y> <width>151</width> <height>19</height> </rect> </property> <property stdset="1"> <name>text</name> <string>User ring count</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>os_ring_count_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>30</x> <y>10</y> <width>151</width> <height>19</height> </rect> </property> <property stdset="1"> <name>text</name> <string>OS ring count</string> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>event_count_edit</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>80</x> <y>70</y> <width>110</width> <height>22</height> </rect> </property> </widget> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>configuration_page</cstring> </property> <attribute> <name>title</name> <string>Configuration</string> </attribute> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>label_configuration_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>10</y> <width>98</width> <height>330</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel1</cstring> </property> <property stdset="1"> <name>text</name> <string>kernel filename</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel6</cstring> </property> <property stdset="1"> <name>text</name> <string>System.map</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel2</cstring> </property> <property stdset="1"> <name>text</name> <string>buffer size</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel7</cstring> </property> <property stdset="1"> <name>text</name> <string>hash table size</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel3</cstring> </property> <property stdset="1"> <name>text</name> <string>pid filter</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel8</cstring> </property> <property stdset="1"> <name>text</name> <string>pgrp filter</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel4</cstring> </property> <property stdset="1"> <name>text</name> <string>base dir</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel9</cstring> </property> <property stdset="1"> <name>text</name> <string>samples files dir</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel5</cstring> </property> <property stdset="1"> <name>text</name> <string>device file</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel10</cstring> </property> <property stdset="1"> <name>text</name> <string>hash map device</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel11</cstring> </property> <property stdset="1"> <name>text</name> <string>daemon log file</string> </property> </widget> </vbox> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>save_config_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>50</x> <y>390</y> <width>120</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Save configuration</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>default_config_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>220</x> <y>390</y> <width>111</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Restore default</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout4</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>350</x> <y>200</y> <width>20</width> <height>140</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>base_opd_dir_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>samples_files_dir_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>device_file_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>false</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>hash_map_device_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>false</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> <property> <name>toolTip</name> <string></string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>daemon_log_file_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>true</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> </vbox> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>kernel_only_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>60</x> <y>350</y> <width>87</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Kernel only</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>ignore_daemon_samples_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>200</x> <y>350</y> <width>150</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Do not profile daemon</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>configuration_edit_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>120</x> <y>10</y> <width>220</width> <height>330</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>kernel_filename_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>map_filename_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>buffer_size_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>hash_table_size_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>pid_filter_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>pgrp_filter_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>base_opd_dir_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>samples_files_dir_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>device_file_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>hash_map_device_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>daemon_log_file_edit</cstring> </property> </widget> </vbox> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout5</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>350</x> <y>20</y> <width>20</width> <height>50</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>kernel_filename_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>map_filename_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> </vbox> </widget> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>debug_tab</cstring> </property> <attribute> <name>title</name> <string>Debug</string> </attribute> </widget> </widget> <widget> <class>QFrame</class> <property stdset="1"> <name>name</name> <cstring>events_frame</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>10</y> <width>270</width> <height>460</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>StyledPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Raised</enum> </property> <property stdset="1"> <name>lineWidth</name> <number>1</number> </property> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>midLineWidth</name> <number>0</number> </property> </widget> </widget> <connections> <connection> <sender>kernel_filename_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>map_filename_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>base_opd_dir_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>samples_files_dir_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>device_file_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>hash_map_device_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>daemon_log_file_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>start_profiler_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_start_profiler()</slot> </connection> <connection> <sender>stop_profiler_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_stop_profiler()</slot> </connection> <connection> <sender>flush_profiler_data_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_flush_profiler_data()</slot> </connection> <connection> <sender>quit_and_save_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>accept()</slot> </connection> <slot access="protected">on_choose_file_or_dir()</slot> <slot access="protected">on_event_clicked()</slot> <slot access="protected">on_flush_profiler_data()</slot> <slot access="protected">on_start_profiler()</slot> <slot access="protected">on_stop_profiler()</slot> </connections> <tabstops> <tabstop>setup_config_tab</tabstop> <tabstop>os_ring_count_cb</tabstop> <tabstop>user_ring_count_cb</tabstop> <tabstop>event_count_edit</tabstop> <tabstop>all_events_to_default_btn</tabstop> <tabstop>selected_event_to_default</tabstop> <tabstop>buttonHelp</tabstop> <tabstop>start_profiler_btn</tabstop> <tabstop>flush_profiler_data_btn</tabstop> <tabstop>stop_profiler_btn</tabstop> <tabstop>quit_and_save_btn</tabstop> <tabstop>kernel_filename_edit</tabstop> <tabstop>map_filename_edit</tabstop> <tabstop>buffer_size_edit</tabstop> <tabstop>hash_table_size_edit</tabstop> <tabstop>pid_filter_edit</tabstop> <tabstop>pgrp_filter_edit</tabstop> <tabstop>base_opd_dir_edit</tabstop> <tabstop>samples_files_dir_edit</tabstop> <tabstop>device_file_edit</tabstop> <tabstop>hash_map_device_edit</tabstop> <tabstop>daemon_log_file_edit</tabstop> <tabstop>kernel_only_cb</tabstop> <tabstop>ignore_daemon_samples_cb</tabstop> <tabstop>save_config_btn</tabstop> <tabstop>default_config_btn</tabstop> </tabstops> </UI> |
From: John L. <mov...@us...> - 2001-09-16 18:05:28
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv5344 Modified Files: ChangeLog autogen.sh configure.in Added Files: acinclude.m4 Log Message: autoconfiscation for Qt2 --- NEW FILE: acinclude.m4 --- # Configure paths and libs when using Qt2 GUI ## -*- shell-script -*- ## Based on KDE file written by : ## Copyright (C) 1997 Janos Farkas (ch...@sh...) ## (C) 1997 Stephan Kulow (co...@kd...) ## This file is free software; you can redistribute it and/or ## modify it under the terms of the GNU Library General Public ## License as published by the Free Software Foundation; either ## version 2 of the License, or (at your option) any later version. ## This library is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## Library General Public License for more details. ## You should have received a copy of the GNU Library General Public License ## along with this library; see the file COPYING.LIB. If not, write to ## the Free Software Foundation, Inc., 59 Temple Place - Suite 330, ## Boston, MA 02111-1307, USA. ## ------------------------------------------------------------------------ ## Find a file (or one of more files in a list of dirs) ## ------------------------------------------------------------------------ ## AC_DEFUN(AC_FIND_FILE, [ $3=NO for i in $2; do for j in $1; do if test -r "$i/$j"; then $3=$i break 2 fi done done ]) AC_DEFUN(QT2_MOC_ERROR_MESSAGE, [ AC_MSG_ERROR([No Qt meta object compiler (moc) found! Please check whether you installed Qt correctly. You need to have a running moc binary. configure tried to run $ac_cv_path_qt2moc and the test didn't succeed. If configure shouldn't have tried this one, set the environment variable MOC to the right one before running configure. ]) ]) AC_DEFUN(QT2_FIND_PATH, [ AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(qt2_cv_path_$1, [ qt2_cv_path_$1="NONE" if test -n "$$2"; then qt2_cv_path_$1="$$2"; else dirs="$3" qt2_save_IFS=$IFS IFS=':' for dir in $PATH; do dirs="$dirs $dir" done IFS=$qt2_save_IFS for dir in $dirs; do if test -x "$dir/$1"; then if test -n "$5" then evalstr="$dir/$1 $5 2>&1 " if eval $evalstr; then qt2_cv_path_$1="$dir/$1" break fi else qt2_cv_path_$1="$dir/$1" break fi fi done fi ]) if test -z "$qt2_cv_path_$1" || test "$qt2_cv_path_$1" = "NONE"; then AC_MSG_RESULT(not found) $4 else AC_MSG_RESULT($qt2_cv_path_$1) $2=$qt2_cv_path_$1 fi ]) dnl ------------------------------------------------------------------------ dnl Find the UIC compiler if available dnl ------------------------------------------------------------------------ AC_DEFUN(QT2_AC_PATH_UIC, [ QT2_FIND_PATH(uic, UIC, [$ac_qt2_bindir $QTDIR/bin \ /usr/bin /usr/X11R6/bin /usr/lib/qt2/bin \ /usr/local/qt2/bin /usr/local/qt/bin /usr/lib/qt/bin], ) AC_SUBST(UIC) ]) dnl ------------------------------------------------------------------------ dnl Find the meta object compiler in the PATH, in $QTDIR/bin, and some dnl more usual places dnl ------------------------------------------------------------------------ dnl AC_DEFUN(QT2_AC_PATH_MOC, [ QT2_FIND_PATH(moc, MOC, [$ac_qt2_bindir $QTDIR/bin \ /usr/bin /usr/X11R6/bin /usr/lib/qt2/bin \ /usr/local/qt2/bin /usr/local/qt/bin /usr/lib/qt/bin], [QT2_MOC_ERROR_MESSAGE]) if test -z "$MOC"; then if test -n "$ac_cv_path_qt2moc"; then output=`eval "$ac_cv_path_qt2moc --help 2>&1 | sed -e '1q' | grep Qt"` fi echo "configure:__oline__: tried to call $ac_cv_path_qt2moc --help 2>&1 | sed -e '1q' | grep Qt" >&AC_FD_CC echo "configure:__oline__: moc output: $output" >&AC_FD_CC if test -z "$output"; then MOC_ERROR_MESSAGE fi fi AC_SUBST(MOC) ]) AC_DEFUN(QT2_PRINT_PROGRAM, [ AC_LANG_CPLUSPLUS cat > conftest.$ac_ext <<EOF #include "confdefs.h" #include <qmovie.h> #include <qapplication.h> int main() { QMovie m; m.setSpeed(20); return 0; } EOF ]) ## ------------------------------------------------------------------------ ## Try to find the Qt2 headers and libraries. ## $(QT2_LDFLAGS) will be -Lqt2liblocation (if needed) ## and $(QT2_INCLUDES) will be -Iqt2hdrlocation (if needed) ## ------------------------------------------------------------------------ ## AC_DEFUN(QT2_AC_PATH, [ AC_MSG_CHECKING([for Qt 2]) ac_qt2_includes=NO ac_qt2_libraries=NO ac_qt2_bindir=NO qt2_libraries="" qt2_includes="" AC_ARG_WITH(qt2-dir, [ --with-qt2-dir where the root of Qt2 is installed ], [ ac_qt2_includes="$withval"/include ac_qt2_libraries="$withval"/lib ac_qt2_bindir="$withval"/bin ]) AC_ARG_WITH(qt2-includes, [ --with-qt2-includes where the Qt2 includes are. ], [ ac_qt2_includes="$withval" ]) qt2_libs_given=no AC_ARG_WITH(qt2-libraries, [ --with-qt2-libraries where the Qt2 library is installed.], [ ac_qt2_libraries="$withval" qt2_libs_given=yes ]) if test "$ac_qt2_includes" = NO || test "$ac_qt2_libraries" = NO; then AC_CACHE_VAL(ac_cv_have_qt2, [#try to guess Qt2 locations qt2_incdirs="$ac_qt2_includes /usr/lib/qt2/include /usr/local/qt2/include /usr/include/qt2 /usr/X11R6/include/X11/qt2 /usr/lib/qt/include /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt $x_includes $QTINC" test -n "$QTDIR" && qt2_incdirs="$QTDIR/include/qt2 $QTDIR/include/qt $QTDIR/include $QTDIR $qt2_incdirs" AC_FIND_FILE(qmovie.h, $qt2_incdirs, qt2_incdir) ac_qt2_includes="$qt2_incdir" if test ! "$ac_qt2_libraries" = "NO"; then qt2_libdirs="$ac_qt2_libraries" fi qt2_libdirs="$qt2_libdirs /usr/lib/qt2/lib /usr/lib/qt/lib /usr/X11R6/lib /usr/lib /usr/local/qt2/lib /usr/lib/qt2 /usr/local/qt/lib /usr/lib/qt $x_libraries $QTLIB" test -n "$QTDIR" && qt2_libdirs="$QTDIR/lib $QTDIR $qt2_libdirs" test=NONE qt2_libdir=NONE for dir in $qt2_libdirs; do try="ls -1 $dir/libqt*" if test=`eval $try 2> /dev/null`; then qt2_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi done ac_qt2_name="-lqt" AC_FIND_FILE(libqt.so.2.3.1 libqt.so.2.3 libqt.so.2.2.3 libqt.so.2.2 libqt.so.2 libqt2.so libqt.a libqt.sl, $qt2_libdirs, qt2_libdir) ac_qt2_libraries="$qt2_libdir" dnl check for -lqt2 not -lqt ac_cxxflags_safe="$CXXFLAGS" ac_ldflags_safe="$LDFLAGS" ac_libs_safe="$LIBS" CXXFLAGS="$CXXFLAGS -I$qt2_incdir" LDFLAGS="-L$qt2_libdir $X_LDFLAGS" LIBS="$LIBS -lqt2 -lXext -lX11 $LIBSOCKET" QT2_PRINT_PROGRAM if AC_TRY_EVAL(ac_link) && test -s conftest; then rm -f conftest* ac_qt2_name="-lqt2" else echo "configure: failed program was:" >&AC_FD_CC cat conftest.$ac_ext >&AC_FD_CC fi rm -f conftest* CXXFLAGS="$ac_cxxflags_safe" LDFLAGS="$ac_ldflags_safe" LIBS="$ac_libs_safe" dnl end check for -lqt2 if test "$ac_qt2_name" = "-lqt"; then ac_qt2_libraries="$qt2_libdir" ac_cxxflags_safe="$CXXFLAGS" ac_ldflags_safe="$LDFLAGS" ac_libs_safe="$LIBS" CXXFLAGS="$CXXFLAGS -I$qt2_incdir" LDFLAGS="-L$qt2_libdir $X_LDFLAGS" LIBS="$LIBS -lqt -lXext -lX11 $LIBSOCKET" QT2_PRINT_PROGRAM if AC_TRY_EVAL(ac_link) && test -s conftest; then rm -f conftest* else echo "configure: failed program was:" >&AC_FD_CC cat conftest.$ac_ext >&AC_FD_CC ac_qt2_libraries="NO" fi rm -f conftest* CXXFLAGS="$ac_cxxflags_safe" LDFLAGS="$ac_ldflags_safe" LIBS="$ac_libs_safe" fi if test "$ac_qt2_includes" = NO || test "$ac_qt2_libraries" = NO; then ac_cv_have_qt2="have_qt2=no" ac_qt2_notfound="" if test "$ac_qt2_includes" = NO; then if test "$ac_qt2_libraries" = NO; then ac_qt2_notfound="(headers and libraries)"; else ac_qt2_notfound="(headers)"; fi else ac_qt2_notfound="(libraries)"; fi else have_qt2="yes" fi ]) else have_qt2="yes" fi eval "$ac_cv_have_qt2" if test "$have_qt2" != yes; then AC_MSG_RESULT([$have_qt2]); else ac_cv_have_qt2="have_qt2=yes ac_qt2_name=$ac_qt2_name \ ac_qt2_includes=$ac_qt2_includes ac_qt2_libraries=$ac_qt2_libraries" AC_MSG_RESULT([libraries $ac_qt2_libraries, headers $ac_qt2_includes]) qt2_libraries="$ac_qt2_libraries" qt2_includes="$ac_qt2_includes" fi dnl check it is Qt2 if we have it if test "$have_qt2" = "yes"; then SAVE_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS -I$qt2_includes -L$qt2_libraries" dnl specify we are definitely C++ compiling first AC_LANG_CPLUSPLUS AC_TRY_COMPILE([ #include <qglobal.h> ], [ #if (QT_VERSION < 221) break_me_(\\\); #endif ], ac_qt2_ok=yes, ac_qt2_ok=no ) test "$ac_qt2_ok" = no && AC_MSG_ERROR([Found an earlier version of Qt - you must specify the path to Qt2]) CXXFLAGS="$SAVE_CXXFLAGS" AC_SUBST(qt2_libraries) AC_SUBST(qt2_includes) if test "$qt2_includes" = "$x_includes" || test -z "$qt2_includes"; then QT2_INCLUDES=""; else QT2_INCLUDES="-I$qt2_includes" all_includes="$QT2_INCLUDES $all_includes" fi if test "$qt2_libraries" = "$x_libraries" || test -z "$qt2_libraries"; then QT2_LDFLAGS="" else QT2_LDFLAGS="-L$qt2_libraries" all_libraries="$QT2_LDFLAGS $all_libraries" fi QT2_LIBS="$ac_qt2_name" AC_SUBST(QT2_INCLUDES) AC_SUBST(QT2_LDFLAGS) AC_SUBST(QT2_LIBS) QT2_AC_PATH_MOC QT2_AC_PATH_UIC HAVE_QT2=1 else HAVE_QT2=0 fi AC_SUBST(HAVE_QT2) ]) AC_DEFUN(QT2_DO_IT_ALL, [ if test "$QT2DIR" != ""; then QTDIR=$QT2DIR fi QT2_AC_PATH ]) Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.119 retrieving revision 1.120 diff -u -d -r1.119 -r1.120 --- ChangeLog 2001/09/16 04:43:38 1.119 +++ ChangeLog 2001/09/16 18:05:25 1.120 @@ -1,3 +1,15 @@ +2001-09-16 John Levon <mo...@co...> + + * acinclude.m4: + * autogen.sh: + * configure.in: + * gui/Makefile.in: + * gui/ui/Makefile.in: + * gui/ui/oprof_start.base.ui: + * gui/oprof_start.h: autoconfiscation for Qt2 + + * gui/oprof_start_config.cpp: add comments + 2001-09-16 Philippe Elie <ph...@cl...> * pp/opf_filter.cpp: fix unrecognized input Index: autogen.sh =================================================================== RCS file: /cvsroot/oprofile/oprofile/autogen.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- autogen.sh 2001/02/02 15:56:43 1.1 +++ autogen.sh 2001/09/16 18:05:25 1.2 @@ -2,4 +2,5 @@ # this simple currently +aclocal autoconf Index: configure.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/configure.in,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- configure.in 2001/09/12 02:54:30 1.30 +++ configure.in 2001/09/16 18:05:25 1.31 @@ -133,6 +133,7 @@ test "$apic" = 0 && AC_MSG_ERROR(local APIC not configured) fi +AC_SUBST(KINC) BKCFLAGS="-I$KINC $BKCFLAGS" AC_SUBST(BKCFLAGS) @@ -183,4 +184,13 @@ AC_CHECK_LIB(iberty, cplus_demangle,, AC_MSG_ERROR(liberty library not found)) AC_CHECK_LIB(bfd, bfd_openr,, AC_MSG_ERROR(bfd library not found)) -AC_OUTPUT(Makefile dae/Makefile doc/Makefile doc/oprofile.1 pp/Makefile gui/Makefile version.h) +AC_PATH_XTRA +LIBS="$X_PRE_LIBS $LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" + +QT2_DO_IT_ALL + +AC_OUTPUT(Makefile dae/Makefile doc/Makefile doc/oprofile.1 pp/Makefile gui/Makefile gui/ui/Makefile version.h) + +if test "$HAVE_QT2" -eq 0; then + echo "WARNING: Qt2 not found; no GUI will be built" +fi |
From: John L. <mov...@us...> - 2001-09-16 18:05:28
|
Update of /cvsroot/oprofile/oprofile/gui In directory usw-pr-cvs1:/tmp/cvs-serv5344/gui Modified Files: Makefile.in oprof_start.h oprof_start_config.cpp oprof_start_impl.cpp Removed Files: oprof_start.base.ui Log Message: autoconfiscation for Qt2 Index: Makefile.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/Makefile.in,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Makefile.in 2001/09/16 01:45:11 1.6 +++ Makefile.in 2001/09/16 18:05:25 1.7 @@ -1,19 +1,23 @@ -all: oprof_start - prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ MKDIR_P=mkdir -p +MOC=@MOC@ +UIC=@UIC@ .PHONY: all clean install uninstall .SUFFIXES: +ifeq "@HAVE_QT2@" "1" +all: oprof_start + # oprof_start.cpp, oprof_start.h are generated file, but must not re-generated clean: - rm -f *.o *.moc.* oprof_start.base.cpp oprof_start.base.h oprof_start + $(MAKE) -C ui clean + rm -f *.o *.moc.* oprof_start # TODO: the sys_include is for the <sstream> thing add it to distrib -CFLAGS=-I ../sys_include -DOP_EVENTS_DESC -g -ansi -Wall --pedantic -O2 +CFLAGS=-I@KINC@ -I../sys_include -DOP_EVENTS_DESC -g -ansi -Wall --pedantic -O2 @QT2_INCLUDES@ install: all oprofile oprof_start -$(MKDIR_P) $(BINDIR) @@ -27,12 +31,13 @@ @echo "The uninstall target does not remove your ~/.oprofile directory" @echo "---------------------------------------------------------------" -SOURCES=oprof_start.base.o oprof_start.base.moc.o oprof_start.o \ - oprof_start.moc.o oprof_start_impl.o op_events.o oprof_start_config.o \ - oprof_start_main.o +UISOURCES=ui/oprof_start.base.o ui/oprof_start.base.moc.o +SOURCES=oprof_start.o oprof_start.moc.o oprof_start_impl.o op_events.o \ + oprof_start_config.o oprof_start_main.o oprof_start: $(SOURCES) - g++ -o $@ $^ -L$(QTDIR)/lib -lqt + $(MAKE) -C ui + g++ -o $@ $^ $(UISOURCES) @QT2_LDFLAGS@ @QT2_LIBS@ %.o: %.cpp g++ -c $(CFLAGS) $< -o $@ @@ -43,46 +48,31 @@ op_events.o: ../op_events.c gcc -c $(CFLAGS) $< -o $@ -# dependencies: auto-generated through CFLAGS += -MM, cat *.o +ui/oprof_start.base.h: + $(MAKE) -C ui + op_events.o: ../op_events.c ../op_user.h ../version.h -oprof_start.base.moc.o: oprof_start.base.moc.cpp oprof_start.base.h -oprof_start.base.o: oprof_start.base.cpp oprof_start.base.h oprof_start.moc.o: oprof_start.moc.cpp oprof_start.h \ - oprof_start.base.h oprof_start_config.h persistent_config.h \ + ui/oprof_start.base.h oprof_start_config.h persistent_config.h \ ../op_user.h ../version.h -oprof_start.o: oprof_start.cpp oprof_start.h oprof_start.base.h \ +oprof_start.o: oprof_start.cpp oprof_start.h ui/oprof_start.base.h \ oprof_start_config.h persistent_config.h ../op_user.h ../version.h oprof_start_config.o: oprof_start_config.cpp oprof_start_config.h \ persistent_config.h ../op_user.h ../version.h oprof_start_impl.o: oprof_start_impl.cpp oprof_start.h \ - oprof_start.base.h oprof_start_config.h persistent_config.h \ + ui/oprof_start.base.h oprof_start_config.h persistent_config.h \ ../op_user.h ../version.h oprof_start_main.o: oprof_start_main.cpp oprof_start.h \ - oprof_start.base.h oprof_start_config.h persistent_config.h \ + ui/oprof_start.base.h oprof_start_config.h persistent_config.h \ ../op_user.h ../version.h -# generate qt header file -oprof_start.base.h: oprof_start.base.ui - uic -o oprof_start.base.h oprof_start.base.ui - -# generate qt implementation file -oprof_start.base.cpp: oprof_start.base.h oprof_start.base.ui - uic -o oprof_start.base.cpp -impl oprof_start.base.h oprof_start.base.ui - -# generate qt moc code for base class -oprof_start.base.moc.cpp: oprof_start.base.h - moc -o oprof_start.base.moc.cpp oprof_start.base.h - # generate qt moc code for subclass -oprof_start.moc.cpp: oprof_start.h oprof_start.base.moc.cpp - moc -o oprof_start.moc.cpp oprof_start.h - -# DO NOT un-comment these lines: just an examples of how to start a new form. -# after using this line you must edit oprof_start.cpp and replace the include -# oprof_start_base.h by oprof_start.h before compile it. I follow the following -# name scheme : xxxx.base.ui is the saved designer file form. xxxx_base.cpp/.h -# are base class read-only file. xxx.cpp/.h are derived class. +oprof_start.moc.cpp: oprof_start.h ui/oprof_start.base.moc.cpp + $(MOC) -o oprof_start.moc.cpp oprof_start.h -# generate qt subclass header/implementation file, these file are created once -#uic -o oprof_start.h -subdecl oprof_start oprof_start.base.h oprof_start.base.ui -#uic -o oprof_start.cpp -subimpl oprof_start oprof_start.h oprof_start.base.ui +else +all: +clean: +install: +uninstall: +endif Index: oprof_start.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/oprof_start.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- oprof_start.h 2001/09/16 02:21:22 1.1 +++ oprof_start.h 2001/09/16 18:05:25 1.2 @@ -19,7 +19,7 @@ #include <vector> -#include "oprof_start.base.h" +#include "ui/oprof_start.base.h" #include "oprof_start_config.h" #include "persistent_config.h" #include "../op_user.h" Index: oprof_start_config.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/oprof_start_config.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- oprof_start_config.cpp 2001/09/16 02:21:22 1.1 +++ oprof_start_config.cpp 2001/09/16 18:05:25 1.2 @@ -64,7 +64,8 @@ return get_user_dir() + "/" + filename; } -// too tricky perhaps: exec a command and redirect stdout / stdout to the +// FIXME: let's use a proper fork/exec with pipes +// too tricky perhaps: exec a command and redirect stdout / stderr to the // corresponding ostream. int exec_command(const std::string& cmd_line, std::ostream& out, std::ostream& err) @@ -72,7 +73,7 @@ char name_stdout[L_tmpnam]; char name_stderr[L_tmpnam]; - // using tmpnam is not recommanded... + // FIXME: using tmpnam is not recommanded... tmpnam(name_stdout); tmpnam(name_stderr); Index: oprof_start_impl.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/oprof_start_impl.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- oprof_start_impl.cpp 2001/09/16 02:21:22 1.1 +++ oprof_start_impl.cpp 2001/09/16 18:05:25 1.2 @@ -107,6 +107,7 @@ return result; } +#if 0 void display_qt_hierarchy(QObject* root, int level = 0) { for (int i = 0 ; i < level * 2 ; ++i) { @@ -137,6 +138,7 @@ // delete l; } } +#endif // like posix shell utils basename, do not append trailing '/' to result. std::string basename(const std::string& path_name) --- oprof_start.base.ui DELETED --- |
From: John L. <mov...@us...> - 2001-09-16 18:01:31
|
Update of /cvsroot/oprofile/oprofile/gui/ui In directory usw-pr-cvs1:/tmp/cvs-serv4589/ui Log Message: Directory /cvsroot/oprofile/oprofile/gui/ui added to the repository |
From: Philippe E. <ph...@us...> - 2001-09-16 04:43:41
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv31757/oprofile Modified Files: ChangeLog Log Message: fix op_to_source problem Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.118 retrieving revision 1.119 diff -u -d -r1.118 -r1.119 --- ChangeLog 2001/09/16 03:27:47 1.118 +++ ChangeLog 2001/09/16 04:43:38 1.119 @@ -1,6 +1,6 @@ 2001-09-16 Philippe Elie <ph...@cl...> - * pp/opf_filter.cpp: + * pp/opf_filter.cpp: fix unrecognized input * pp/opf_container.cpp: better error messages. put op_nr_counters in the global namespace (gcc 2.91 work around) |
From: Philippe E. <ph...@us...> - 2001-09-16 04:43:41
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv31757/oprofile/pp Modified Files: opf_filter.cpp Log Message: fix op_to_source problem Index: opf_filter.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_filter.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- opf_filter.cpp 2001/09/16 03:27:47 1.7 +++ opf_filter.cpp 2001/09/16 04:43:38 1.8 @@ -921,9 +921,6 @@ bool output::treat_input(input & in) { - setup_counter_param(in); - setup_counter_param(in); - string str; in.read_line(str); @@ -943,6 +940,9 @@ return false; } + + setup_counter_param(in); + setup_counter_param(in); bool have_counter_info = false; for (size_t i = 0 ; i < op_nr_counters && !have_counter_info ; ++i) { |
From: Philippe E. <ph...@us...> - 2001-09-16 03:27:49
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv21923/oprofile/pp Modified Files: opf_container.cpp opf_filter.cpp Log Message: typo Index: opf_container.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_container.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- opf_container.cpp 2001/09/06 18:13:28 1.5 +++ opf_container.cpp 2001/09/16 03:27:47 1.6 @@ -25,10 +25,7 @@ #include "opf_filter.h" -namespace { - // FIXME ! - uint op_nr_counters = 2; -} +extern uint op_nr_counters; //--------------------------------------------------------------------------- // Functors used as predicate for vma comparison. @@ -185,10 +182,10 @@ if (range_iterator_sorted_p(v.begin(), v.end(), less_sample_entry_by_vma()) == false) { - cerr << "post condition fail : symbol_vector not " + cerr << "opf_filter: post condition fail : symbol_vector not " << "sorted by increased vma" << endl; - exit(1); + exit(EXIT_FAILURE); } } @@ -383,10 +380,10 @@ if (range_iterator_sorted_p(v.begin(), v.end(), less_sample_entry_by_vma()) == false) { - cerr << "post condition fail : counter_vector not " + cerr << "opf_filter: post condition fail : counter_vector not " << "sorted by increased vma" << endl; - exit(1); + exit(EXIT_FAILURE); } } Index: opf_filter.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_filter.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- opf_filter.cpp 2001/09/08 21:46:04 1.6 +++ opf_filter.cpp 2001/09/16 03:27:47 1.7 @@ -45,9 +45,10 @@ double do_ratio(size_t a, size_t total); +} + // The correct value is passed by oprofpp on standard input. uint op_nr_counters = 2; -} //--------------------------------------------------------------------------- // Just allow to read one line in advance and to put_back this line. @@ -103,7 +104,7 @@ bool treat_input(input &); - void debug_dump_vector(ostream & out) const; + void debug_dump_vector() const; private: void output_command_line() const; @@ -353,23 +354,23 @@ { } -void output::debug_dump_vector(ostream & out) const { +void output::debug_dump_vector() const { - out << "total samples :"; + cerr << "total samples :"; for (size_t i = 0 ; i < op_nr_counters ; ++i) - cout << " " << counter_info[i].total_samples; + cerr << " " << counter_info[i].total_samples; - cout << endl; + cerr << endl; for (size_t i = 0 ; i < symbols.size() ; ++i) { - symbols[i].debug_dump(cout); - cout << endl; + symbols[i].debug_dump(cerr); + cerr << endl; for (size_t j = symbols[i].first ; j < symbols[i].last; ++j) { - samples[j].debug_dump(cout); - cout << endl; + samples[j].debug_dump(cerr); + cerr << endl; } } } @@ -461,12 +462,11 @@ for (size_t i = 0 ; i < op_nr_counters ; ++i) { if (total_counter[i] != counter_info[i].total_samples) { - cerr << "output::calc_total_samples() : " - << "bad counter accumulation" + cerr << "opf_filter: output::calc_total_samples() : bad counter accumulation" << " " << total_counter[i] << " " << counter_info[i].total_samples << endl; - exit(1); + exit(EXIT_FAILURE); } } } @@ -734,7 +734,7 @@ ifstream in(file_by_samples[i].filename.c_str()); if (!in) { - cerr << "unable to open for reading: " << file_by_samples[i].filename << endl; + cerr << "opf_filter (warning): unable to open for reading: " << file_by_samples[i].filename << endl; } else { if (until_more_than_samples) { do_output_one_file(in, file_by_samples[i].filename, @@ -766,7 +766,8 @@ break; } - cerr << "sort_by_counter invalid or counter[sort_by_counter] disabled : switch " + cerr << "opf_filter (warning): sort_by_counter invalid or " + << "counter[sort_by_counter] disabled : switch " << "to the first valid counter " << index << endl; } @@ -825,9 +826,9 @@ for (size_t i = 0 ; i < symbols.size() ; ++i) { if (sanity_check_symbol_entry(i) == false) { - cerr << "post condition fail : symbols range failure" << endl; + cerr << "opf_filter: post condition fail : symbols range failure" << endl; - exit(1); + exit(EXIT_FAILURE); } } } @@ -927,7 +928,7 @@ in.read_line(str); if (sscanf(str.c_str(), "Cpu type: %d", &cpu_type) != 1) { - cerr << "unable to read cpu_type\n"; + cerr << "opf_filter: unable to read cpu_type\n"; return false; } @@ -938,7 +939,7 @@ in.read_line(str); if (sscanf(str.c_str(), "Cpu speed was (MHz estimation) : %lf", &cpu_speed) != 1) { - cerr << "unable to read cpu_speed\n"; + cerr << "opf_filter: unable to read cpu_speed\n"; return false; } @@ -950,7 +951,7 @@ } if (!have_counter_info) { - cerr << "Malformed input, expect at least one counter description" << endl; + cerr << "opf_filter: malformed input, expect at least one counter description" << endl; return false; } @@ -960,7 +961,7 @@ // debug_dump_vector(out); if (calc_total_samples() == false) { - cerr << "The input contains zero samples" << endl; + cerr << "opf_filter: the input contains zero samples" << endl; return false; } @@ -1081,15 +1082,15 @@ } catch (const string & e) { - cerr << "Exception : " << e << endl; + cerr << "opf_filter: Exception : " << e << endl; return 1; } catch (const char * e) { - cerr << "Exception : " << e << endl; + cerr << "opf_flter: Exception : " << e << endl; return 1; } catch (...) { - cerr << "Unknown exception : really sorry " << endl; + cerr << "opf_filter: Unknown exception : really sorry " << endl; return 1; } |
From: Philippe E. <ph...@us...> - 2001-09-16 03:27:49
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv21923/oprofile Modified Files: ChangeLog Log Message: typo Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.117 retrieving revision 1.118 diff -u -d -r1.117 -r1.118 --- ChangeLog 2001/09/16 02:21:22 1.117 +++ ChangeLog 2001/09/16 03:27:47 1.118 @@ -1,3 +1,10 @@ +2001-09-16 Philippe Elie <ph...@cl...> + + * pp/opf_filter.cpp: + * pp/opf_container.cpp: better error messages. put + op_nr_counters in the global namespace (gcc 2.91 + work around) + 2001-09-16 John Levon <mo...@co...> * pp/oprofpp.cpp: small tidy |
From: John L. <mov...@us...> - 2001-09-16 02:21:25
|
Update of /cvsroot/oprofile/oprofile/gui In directory usw-pr-cvs1:/tmp/cvs-serv13394/gui Added Files: oprof_start.base.ui oprof_start.cpp oprof_start.h oprof_start_config.cpp oprof_start_config.h oprof_start_impl.cpp oprof_start_main.cpp persistent_config.h Log Message: add missing files --- NEW FILE: oprof_start.base.ui --- <!DOCTYPE UI><UI> <class>oprof_start_base</class> <widget> <class>QDialog</class> <property stdset="1"> <name>name</name> <cstring>oprof_start_base</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> <width>669</width> <height>547</height> </rect> </property> <property stdset="1"> <name>caption</name> <string>Start profiler</string> </property> <property stdset="1"> <name>sizeGripEnabled</name> <bool>true</bool> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>buttonHelp</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>480</y> <width>80</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>&Help</string> </property> <property stdset="1"> <name>autoDefault</name> <bool>true</bool> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>quit_and_save_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>560</x> <y>480</y> <width>100</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>&Quit and save</string> </property> <property stdset="1"> <name>autoDefault</name> <bool>true</bool> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>start_stop_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>150</x> <y>480</y> <width>350</width> <height>30</height> </rect> </property> <hbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>start_profiler_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Start profiler</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>flush_profiler_data_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Flush profiler data</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>stop_profiler_btn</cstring> </property> <property stdset="1"> <name>text</name> <string>Stop profiler</string> </property> </widget> </hbox> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>event_help_label</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>true</bool> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>520</y> <width>650</width> <height>20</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>WinPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Sunken</enum> </property> <property stdset="1"> <name>text</name> <string>event help label, should be redim if main form redim</string> </property> </widget> <widget> <class>QTabWidget</class> <property stdset="1"> <name>name</name> <cstring>setup_config_tab</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>290</x> <y>10</y> <width>380</width> <height>460</height> </rect> </property> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>counter_setup_page</cstring> </property> <attribute> <name>title</name> <string>Counter setup</string> </attribute> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>all_events_to_default_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>40</x> <y>400</y> <width>130</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>All events to default</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>selected_event_to_default</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>200</x> <y>400</y> <width>150</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Selected event to default</string> </property> </widget> <widget> <class>QFrame</class> <property stdset="1"> <name>name</name> <cstring>unit_mask_frame</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>8</x> <y>105</y> <width>360</width> <height>280</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>StyledPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Raised</enum> </property> <widget> <class>QButtonGroup</class> <property stdset="1"> <name>name</name> <cstring>unit_mask_group</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> <width>360</width> <height>280</height> </rect> </property> <property stdset="1"> <name>title</name> <string>unit mask</string> </property> </widget> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel1_2</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>20</x> <y>70</y> <width>50</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Count</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>user_ring_count_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>30</x> <y>40</y> <width>151</width> <height>19</height> </rect> </property> <property stdset="1"> <name>text</name> <string>User ring count</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>os_ring_count_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>30</x> <y>10</y> <width>151</width> <height>19</height> </rect> </property> <property stdset="1"> <name>text</name> <string>OS ring count</string> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>event_count_edit</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>80</x> <y>70</y> <width>110</width> <height>22</height> </rect> </property> </widget> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>configuration_page</cstring> </property> <attribute> <name>title</name> <string>Configuration</string> </attribute> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>label_configuration_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>10</y> <width>98</width> <height>330</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel1</cstring> </property> <property stdset="1"> <name>text</name> <string>kernel filename</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel6</cstring> </property> <property stdset="1"> <name>text</name> <string>System.map</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel2</cstring> </property> <property stdset="1"> <name>text</name> <string>buffer size</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel7</cstring> </property> <property stdset="1"> <name>text</name> <string>hash table size</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel3</cstring> </property> <property stdset="1"> <name>text</name> <string>pid filter</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel8</cstring> </property> <property stdset="1"> <name>text</name> <string>pgrp filter</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel4</cstring> </property> <property stdset="1"> <name>text</name> <string>base dir</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel9</cstring> </property> <property stdset="1"> <name>text</name> <string>samples files dir</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel5</cstring> </property> <property stdset="1"> <name>text</name> <string>device file</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel10</cstring> </property> <property stdset="1"> <name>text</name> <string>hash map device</string> </property> </widget> <widget> <class>QLabel</class> <property stdset="1"> <name>name</name> <cstring>TextLabel11</cstring> </property> <property stdset="1"> <name>text</name> <string>daemon log file</string> </property> </widget> </vbox> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>save_config_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>50</x> <y>390</y> <width>120</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Save configuration</string> </property> </widget> <widget> <class>QPushButton</class> <property stdset="1"> <name>name</name> <cstring>default_config_btn</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>220</x> <y>390</y> <width>111</width> <height>28</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Restore default</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout4</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>350</x> <y>200</y> <width>20</width> <height>140</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>base_opd_dir_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>samples_files_dir_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>device_file_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>false</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>hash_map_device_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>false</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> <property> <name>toolTip</name> <string></string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>daemon_log_file_tb</cstring> </property> <property stdset="1"> <name>enabled</name> <bool>true</bool> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> </vbox> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>kernel_only_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>60</x> <y>350</y> <width>87</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Kernel only</string> </property> </widget> <widget> <class>QCheckBox</class> <property stdset="1"> <name>name</name> <cstring>ignore_daemon_samples_cb</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>200</x> <y>350</y> <width>150</width> <height>20</height> </rect> </property> <property stdset="1"> <name>text</name> <string>Do not profile daemon</string> </property> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>configuration_edit_layout</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>120</x> <y>10</y> <width>220</width> <height>330</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>kernel_filename_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>map_filename_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>buffer_size_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>hash_table_size_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>pid_filter_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>pgrp_filter_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>base_opd_dir_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>samples_files_dir_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>device_file_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>hash_map_device_edit</cstring> </property> </widget> <widget> <class>QLineEdit</class> <property stdset="1"> <name>name</name> <cstring>daemon_log_file_edit</cstring> </property> </widget> </vbox> </widget> <widget> <class>QLayoutWidget</class> <property stdset="1"> <name>name</name> <cstring>Layout5</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>350</x> <y>20</y> <width>20</width> <height>50</height> </rect> </property> <vbox> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>spacing</name> <number>6</number> </property> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>kernel_filename_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> <widget> <class>QToolButton</class> <property stdset="1"> <name>name</name> <cstring>map_filename_tb</cstring> </property> <property stdset="1"> <name>text</name> <string>°°°</string> </property> </widget> </vbox> </widget> </widget> <widget> <class>QWidget</class> <property stdset="1"> <name>name</name> <cstring>debug_tab</cstring> </property> <attribute> <name>title</name> <string>Debug</string> </attribute> </widget> </widget> <widget> <class>QFrame</class> <property stdset="1"> <name>name</name> <cstring>events_frame</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>10</x> <y>10</y> <width>270</width> <height>460</height> </rect> </property> <property stdset="1"> <name>frameShape</name> <enum>StyledPanel</enum> </property> <property stdset="1"> <name>frameShadow</name> <enum>Raised</enum> </property> <property stdset="1"> <name>lineWidth</name> <number>1</number> </property> <property stdset="1"> <name>margin</name> <number>0</number> </property> <property stdset="1"> <name>midLineWidth</name> <number>0</number> </property> </widget> </widget> <connections> <connection> <sender>kernel_filename_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>map_filename_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>base_opd_dir_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>samples_files_dir_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>device_file_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>hash_map_device_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>daemon_log_file_tb</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_choose_file_or_dir()</slot> </connection> <connection> <sender>start_profiler_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_start_profiler()</slot> </connection> <connection> <sender>stop_profiler_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_stop_profiler()</slot> </connection> <connection> <sender>flush_profiler_data_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>on_flush_profiler_data()</slot> </connection> <connection> <sender>quit_and_save_btn</sender> <signal>clicked()</signal> <receiver>oprof_start_base</receiver> <slot>accept()</slot> </connection> <slot access="protected">on_choose_file_or_dir()</slot> <slot access="protected">on_event_clicked()</slot> <slot access="protected">on_flush_profiler_data()</slot> <slot access="protected">on_start_profiler()</slot> <slot access="protected">on_stop_profiler()</slot> </connections> <tabstops> <tabstop>setup_config_tab</tabstop> <tabstop>os_ring_count_cb</tabstop> <tabstop>user_ring_count_cb</tabstop> <tabstop>event_count_edit</tabstop> <tabstop>all_events_to_default_btn</tabstop> <tabstop>selected_event_to_default</tabstop> <tabstop>buttonHelp</tabstop> <tabstop>start_profiler_btn</tabstop> <tabstop>flush_profiler_data_btn</tabstop> <tabstop>stop_profiler_btn</tabstop> <tabstop>quit_and_save_btn</tabstop> <tabstop>kernel_filename_edit</tabstop> <tabstop>map_filename_edit</tabstop> <tabstop>buffer_size_edit</tabstop> <tabstop>hash_table_size_edit</tabstop> <tabstop>pid_filter_edit</tabstop> <tabstop>pgrp_filter_edit</tabstop> <tabstop>base_opd_dir_edit</tabstop> <tabstop>samples_files_dir_edit</tabstop> <tabstop>device_file_edit</tabstop> <tabstop>hash_map_device_edit</tabstop> <tabstop>daemon_log_file_edit</tabstop> <tabstop>kernel_only_cb</tabstop> <tabstop>ignore_daemon_samples_cb</tabstop> <tabstop>save_config_btn</tabstop> <tabstop>default_config_btn</tabstop> </tabstops> </UI> --- NEW FILE: oprof_start.cpp --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qvalidator.h> #include <qlineedit.h> #include "oprof_start.h" /* * Constructs a oprof_start which is a child of 'parent', with the * name 'name' and widget flags set to 'f' * * The dialog will by default be modeless, unless you set 'modal' to * TRUE to construct a modal dialog. */ oprof_start::oprof_start( QWidget* parent, const char* name, bool modal, WFlags fl ) : oprof_start_base( parent, name, modal, fl ), validate_buffer_size(new QIntValidator(buffer_size_edit)), validate_hash_table_size(new QIntValidator(hash_table_size_edit)), validate_event_count(new QIntValidator(event_count_edit)), validate_pid_filter(new QIntValidator(pid_filter_edit)), validate_pgrp_filter(new QIntValidator(pgrp_filter_edit)), scroll_view_events(0), event_selected(0), last_mouse_motion_cb_index((uint)-1), cpu_type(op_get_cpu_type()), op_nr_counters(2) { if (cpu_type == CPU_ATHLON) op_nr_counters = 4; // validator range/value are set only when we have build the // description of events. buffer_size_edit->setValidator(validate_buffer_size); hash_table_size_edit->setValidator(validate_hash_table_size); event_count_edit->setValidator(validate_event_count); pid_filter_edit->setValidator(validate_pid_filter); pgrp_filter_edit->setValidator(validate_pgrp_filter); init(); } /* * Destroys the object and frees any allocated resources */ oprof_start::~oprof_start() { // no need to delete child widgets, Qt does it all for us } --- NEW FILE: oprof_start.h --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPROF_START_H #define OPROF_START_H #include <vector> #include "oprof_start.base.h" #include "oprof_start_config.h" #include "persistent_config.h" #include "../op_user.h" class QIntValidator; class QScrollView; struct op_event_descr { op_event_descr(); uint counter_mask; // bitmask of allowed counter u8 val; // event number const op_unit_mask* unit; // != 0 if unit mask allowed const op_unit_desc* um_descr; // ditto const char* name; // never nil const char* help_str; // ditto uint min_count; // minimum counter value allowed QCheckBox* cb; }; class oprof_start : public oprof_start_base { Q_OBJECT public: oprof_start( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); ~oprof_start(); protected: void on_choose_file_or_dir(); void on_event_clicked(); void on_flush_profiler_data(); void on_start_profiler(); void on_stop_profiler(); void accept(); private: void init(); bool eventFilter(QObject* o, QEvent* e); // return 0 if not found const op_event_descr* locate_event(const char* name); void do_selected_event_change(const op_event_descr*); void event_checked(const op_event_descr*); void event_unchecked(const op_event_descr*); // recorded in memory, noy to persistent storage void record_selected_event_config(); bool record_config(); uint get_unit_mask_part(const QCheckBox* cb, uint result); uint get_unit_mask(); void create_unit_mask_btn(const op_event_descr* descr); void load_event_config_file(); bool save_event_config_file(); void load_config_file(); bool save_config_file(); QIntValidator* validate_buffer_size; QIntValidator* validate_hash_table_size; QIntValidator* validate_event_count; QIntValidator* validate_pid_filter; QIntValidator* validate_pgrp_filter; QScrollView* scroll_view_events; std::vector<op_event_descr> v_events; // to avoid wasting cpu time when re-selecting the same event. const op_event_descr* event_selected; // same: used to optimize mouse move event uint last_mouse_motion_cb_index; // We give a visual feedback to user by changing the background of the // selected event. event_background_mode is used to restore the // background mode when selection of events is changing. BackgroundMode event_background_mode; // selected events set. Must be coherent with the events check state std::vector<const op_event_descr*> v_events_selected; persistent_config_t<event_setting> event_cfg; config_setting config; // the expansion of "~" directory std::string user_dir; int cpu_type; uint op_nr_counters; }; #endif // OPROF_START_H --- NEW FILE: oprof_start_config.cpp --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdio.h> #include <sstream> #include <fstream> #include "oprof_start_config.h" // FIXME: how make gcc 2.91 accept correctly anonymous namespace // namespace { // TODO: many things here are mis-placed // output default_value if value is empty (empty <==> contains non blank char) void save_value(std::ostream& out, const std::string& value, const std::string& default_value) { std::istringstream in(value); std::string word; in >> word; if (word.empty()) out << default_value; else out << value; } // return the ~ expansion suffixed with a '/' std::string get_user_dir() { static std::string user_dir; if (user_dir.empty()) { std::ostringstream out; exec_command("echo -n ~", out); user_dir = out.str(); if (user_dir.length() && user_dir[user_dir.length() -1] != '/') user_dir += '/'; } return user_dir; } // return get_user_dir() + filename std::string get_user_filename(const std::string& filename) { return get_user_dir() + "/" + filename; } // too tricky perhaps: exec a command and redirect stdout / stdout to the // corresponding ostream. int exec_command(const std::string& cmd_line, std::ostream& out, std::ostream& err) { char name_stdout[L_tmpnam]; char name_stderr[L_tmpnam]; // using tmpnam is not recommanded... tmpnam(name_stdout); tmpnam(name_stderr); std::string cmd = cmd_line ; cmd += std::string(" 2> ") + name_stderr; cmd += std::string(" > ") + name_stdout; int ret = system(cmd.c_str()); std::ifstream in_stdout(name_stdout); if (!in_stdout) { std::cerr << "fail to open stdout " << name_stdout << std::endl; } std::ifstream in_stderr(name_stderr); if (!in_stderr) { std::cerr << "fail to open stderr " << name_stderr << std::endl; } // this order is preferable in case we pass the same stream as out and // err, the stdout things come first in the output generally out << in_stdout.rdbuf(); err << in_stderr.rdbuf(); remove(name_stdout); remove(name_stderr); return ret; } #if 0 // FIXME: better but do not work, see bad comment. int exec_command(const std::string& cmd_line, std::ostream& output) { char name_output[L_tmpnam]; tmpnam(name_output); std::string cmd = cmd_line ; // bad: return the exit code of cat so there is never error. // cmd += std::string(" 2>&1 | cat > ") + name_output; // bad: command receive the temp filename as command line option. Why? // cmd += std::string(" 2>&1 ") + name_output; int ret = system(cmd.c_str()); std::ifstream in_output(name_output); if (!in_output) { std::cerr << "fail to open output " << name_output << std::endl; } output << in_output.rdbuf(); remove(name_output); return ret; } #else // this work but assume than a command which make an error exit without // any output to stdout after the first output to stderr... int exec_command(const std::string& cmd_line, std::ostream& out) { return exec_command(cmd_line, out, out); } #endif bool is_profiler_started() { return !system("ps aux | grep oprofiled | grep -v grep > /dev/null"); } // } // anonymous namespace event_setting::event_setting() : count(0), umask(0), os_ring_count(0), user_ring_count(0) { } void event_setting::save(std::ostream& out) const { out << count << " "; out << umask << " "; out << os_ring_count << " "; out << user_ring_count << " "; } void event_setting::load(std::istream& in) { in >> count; in >> umask; in >> os_ring_count; in >> user_ring_count; } std::ostream& operator<<(std::ostream& out, const event_setting& object) { object.save(out); return out; } std::istream& operator>>(std::istream& in, event_setting& object) { object.load(in); return in; } config_setting::config_setting() : buffer_size(OP_DEFAULT_BUFFER_SIZE), hash_table_size(OP_DEFAULT_HASH_SIZE), // TODO: member of config, hardcoded value probably come from ? base_opd_dir("/var/opd/"), samples_files_dir("samples"), device_file("opdev"), hash_map_device("ophashmapdev"), daemon_log_file("oprofiled.log"), kernel_filename(BUILD_DIR "vmlinux"), map_filename(BUILD_DIR "System.map"), kernel_only(0), ignore_daemon_samples(0), pgrp_filter(0), pid_filter(0) { } // sanitize needed ? void config_setting::load(std::istream& in) { in >> buffer_size; in >> hash_table_size; in >> base_opd_dir; in >> samples_files_dir; in >> device_file; in >> hash_map_device; in >> daemon_log_file; in >> kernel_filename; in >> map_filename; in >> kernel_only; in >> ignore_daemon_samples; in >> pgrp_filter; } // sanitize needed ? void config_setting::save(std::ostream& out) const { out << buffer_size << std::endl; out << hash_table_size << std::endl; // for this we need always to put something sensible, else if we save // empty string reload is confused by this empty string. config_setting def_val; save_value(out, base_opd_dir, def_val.base_opd_dir); out << std::endl; save_value(out, samples_files_dir, def_val.samples_files_dir); out << std::endl; save_value(out, device_file, def_val.device_file); out << std::endl; save_value(out, hash_map_device, def_val.hash_map_device); out << std::endl; save_value(out, daemon_log_file, def_val.daemon_log_file); out << std::endl; save_value(out, kernel_filename, def_val.kernel_filename); out << std::endl; save_value(out, map_filename, def_val.map_filename); out << std::endl; out << kernel_only << std::endl; out << ignore_daemon_samples << std::endl; out << pgrp_filter << std::endl; } std::ostream& operator<<(std::ostream& out, const config_setting& object) { object.save(out); return out; } std::istream& operator>>(std::istream& in, config_setting& object) { object.load(in); return in; } --- NEW FILE: oprof_start_config.h --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPROF_START_CONFIG_H #define OPROF_START_CONFIG_H #include <linux/version.h> #include <string> #include <iostream> #include "persistent_config.h" #include "../op_user.h" // FIXME: must be shared. #define OP_MAX_PERF_COUNT 2147483647UL #define OP_DEFAULT_BUFFER_SIZE 262144 #define OP_MAX_BUFFER_SIZE 1048576 #define OP_MIN_BUFFER_SIZE 1024 #define OP_DEFAULT_HASH_SIZE 65536 #define OP_MAX_HASH_TABLE_SIZE 262144 #define OP_MIN_HASH_TABLE_SIZE 256 // FIXME: come from where? #define OP_MIN_PID 0 #define OP_MAX_PID 32767 #define OP_MIN_PGRP 0 #define OP_MAX_PGRP 32767 #define BUILD_DIR "/lib/modules/" UTS_RELEASE "/build/" // FIXME: how make gcc 2.91 accept correctly namespace // namespace { // return the ~ expansion suffixed with a '/' std::string get_user_dir(); // return get_user_dir() + filename std::string get_user_filename(const std::string& filename); // exec a command and redirect stdout/stderr to out/err. int exec_command(const std::string& cmd_line, std::ostream& out, std::ostream& err); // this work but output but all stdout are put in out before all output to // stderr. See the implementation. int exec_command(const std::string& cmd_line, std::ostream& out); bool is_profiler_started(); // } // anonymous namespace // Store the setup of one events. struct event_setting { event_setting(); void save(std::ostream& out) const; void load(std::istream& in); uint count; uint umask; int os_ring_count; int user_ring_count; }; std::ostream& operator<<(std::ostream& out, const event_setting& object); std::istream& operator>>(std::istream& in, event_setting& object); // Store the general configuration of the profiler. File/path name buffer // size ETC. struct config_setting { config_setting(); void load(std::istream& in); void save(std::ostream& out) const; uint buffer_size; uint hash_table_size; std::string base_opd_dir; std::string samples_files_dir; std::string device_file; std::string hash_map_device; std::string daemon_log_file; std::string kernel_filename; std::string map_filename; int kernel_only; int ignore_daemon_samples; // as string to allow symbolic group name ? int pgrp_filter; // not persistent, no interest to save from one session to another? int pid_filter; }; std::ostream& operator<<(std::ostream& out, const config_setting& object); std::istream& operator>>(std::istream& in, config_setting& object); #endif // ! OPROF_START_CONFIG_H --- NEW FILE: oprof_start_impl.cpp --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <sys/stat.h> #include <unistd.h> #include <stdio.h> [...1106 lines suppressed...] if (is_profiler_started()) { if (do_exec_command("op_dump") == 0) { do_exec_command("op_stop"); } } else { QMessageBox::warning(this, 0, "The profiler is already stopped."); } } // helper to retrieve an event descr through its name. const op_event_descr* oprof_start::locate_event(const char* name) { for (size_t i = 0 ; i < v_events.size() ; ++i) { if (std::string(v_events[i].name) == name) { return &v_events[i]; } } return 0; } --- NEW FILE: oprof_start_main.cpp --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qapplication.h> #include "oprof_start.h" int main(int argc, char* argv[]) { QApplication a(argc, argv); oprof_start* dlg = new oprof_start(); a.setMainWidget(dlg); dlg->show(); return a.exec(); } --- NEW FILE: persistent_config.h --- /* COPYRIGHT (C) 2001 Philippe Elie * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PERSISTENT_CONFIG_H #define PERSISTENT_CONFIG_H #include <iostream> #include <string> #include <map> // a simple association between a string and a type T. try to handle // also a dirty flag to track non const access. a typical use: // define a struct T: // // persistent_cfg_t<T> cfg; // // cfg[string].field_name = XXXX; // // if (cfg[string].field_name == yyyy) then ... // // the behavior try to mimic script language with associative array. template <typename T> class persistent_config_t { public: persistent_config_t() : is_dirty(false) {} bool dirty() const { return is_dirty; } void set_dirty(bool dirty) { is_dirty = dirty; } // set dirty flag T& operator[](const std::string& key); // does not change dirty flag. // if you try to: // if (cfg[string].member == xxxx) you call the non-const [] operator const T& operator[](const std::string& key) const; // these two function reset the dirty flag // save and load use the folloing file format // key value1 value2 value3 ... valueN through the overload of // operator>> [<<] (ostream&[istream&], [const] T&); void save(std::ostream& out) const; // take care: this do not reset the current recorded value. It only // override or create new key/value. void load(std::istream& out); private: typedef std::map<std::string, T> map_t; map_t map; bool is_dirty; }; template <typename T> T& persistent_config_t<T>::operator[](const std::string& key) { is_dirty = true; return map[key]; } template <typename T> const T& persistent_config_t<T>::operator[](const std::string& key) const { return const_cast<map_t&>(map)[key]; } template <typename T> void persistent_config_t<T>::save(std::ostream& out) const { typename map_t::const_iterator it; for (it = map.begin() ; it != map.end() ; ++it) { out << it->first; out << " "; out << it->second << std::endl; } } template <typename T> void persistent_config_t<T>::load(std::istream& in) { typename map_t::const_iterator it; for (it = map.begin() ; it != map.end() ; ++it) { std::string name; in >> name; in >> map[name]; } } template <typename T> std::istream& operator>>(std::istream& in, persistent_config_t<T>& cfg) { cfg.load(in); return in; } template <typename T> std::ostream& operator<<(std::ostream& out, const persistent_config_t<T>& cfg) { cfg.save(out); return out; } #endif // !PERSISTENT_CONFIG_H |
From: John L. <mov...@us...> - 2001-09-16 02:21:25
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv13394/pp Modified Files: oprofpp.c Log Message: add missing files Index: oprofpp.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- oprofpp.c 2001/09/15 22:03:57 1.45 +++ oprofpp.c 2001/09/16 02:21:22 1.46 @@ -18,9 +18,9 @@ #include "oprofpp.h" static int showvers; -static int verbose; +static int verbose; +/* set to 4 later for the athlon case */ static uint op_nr_counters = 2; - static char const *samplefile; static char *basedir="/var/opd"; static const char *imagefile; @@ -31,7 +31,6 @@ static int list_all_symbols_details; static int output_linenr_info; -/* PHE FIXME would be an array of struct ? */ /* indexed by samples[counter_nr][offset] */ static struct opd_fentry *samples[OP_MAX_COUNTERS]; static struct opd_footer *footer[OP_MAX_COUNTERS]; @@ -696,7 +695,6 @@ * Dump gprof-format samples for the image specified by samplefile to * the file specified by gproffile. */ -/* PHE: FIXME: this fun has not been tested */ void do_dump_gprof(asymbol **syms, uint num) { static struct gmon_hdr hdr = { "gmon", GMON_VERSION, {0,0,0,},}; |
From: John L. <mov...@us...> - 2001-09-16 02:21:25
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv13394 Modified Files: ChangeLog Log Message: add missing files Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.116 retrieving revision 1.117 diff -u -d -r1.116 -r1.117 --- ChangeLog 2001/09/16 01:45:10 1.116 +++ ChangeLog 2001/09/16 02:21:22 1.117 @@ -1,3 +1,7 @@ +2001-09-16 John Levon <mo...@co...> + + * pp/oprofpp.cpp: small tidy + 2001-09-16 Philippe Elie <ph...@cl...> * pp/opf_filter.cpp: minor tidy |
From: Philippe E. <ph...@us...> - 2001-09-16 01:45:13
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv8302/oprofile/pp Modified Files: opf_filter.h Log Message: gui oprof_start Index: opf_filter.h =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/opf_filter.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- opf_filter.h 2001/09/01 02:03:34 1.5 +++ opf_filter.h 2001/09/16 01:45:11 1.6 @@ -11,7 +11,7 @@ static const bool sanity_check = true; //--------------------------------------------------------------------------- -// A simple container of counter to give independency on the number of hardware counters. +// A simple container of counter. class counter_array_t { public: counter_array_t(); @@ -29,6 +29,9 @@ counter_array_t & operator+=(const counter_array_t &); private: + // for now we avoid dyn alloc here by allowing OP_MAX_COUNTERS rather + // than op_nr_counters. This is probably the bad way if the number of + // counters available becomes great. size_t value[OP_MAX_COUNTERS]; }; @@ -36,8 +39,8 @@ // A simple container for a fileno:linr location struct file_location { // This rely on a ref counted string implementation for efficiency. - string filename; // string() if not valid. - int linenr; // 0 means internally generated by the compiler. + string filename; // string() if not valid. + int linenr; // 0 means internally generated by the compiler }; //--------------------------------------------------------------------------- @@ -57,7 +60,7 @@ struct symbol_entry { sample_entry sample; string name; - // [first, last[ index inside the container of sample_entry. + // [first, last[ gives the range of symbol_entry. size_t first; size_t last; |
From: Philippe E. <ph...@us...> - 2001-09-16 01:45:13
|
Update of /cvsroot/oprofile/oprofile/gui In directory usw-pr-cvs1:/tmp/cvs-serv8302/oprofile/gui Modified Files: Makefile.in Log Message: gui oprof_start Index: Makefile.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/Makefile.in,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Makefile.in 2001/09/15 20:55:45 1.5 +++ Makefile.in 2001/09/16 01:45:11 1.6 @@ -1,18 +1,25 @@ -all: - -.PHONY: all clean install uninstall - -clean: +all: oprof_start prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ MKDIR_P=mkdir -p -install: all oprofile +.PHONY: all clean install uninstall +.SUFFIXES: + +# oprof_start.cpp, oprof_start.h are generated file, but must not re-generated +clean: + rm -f *.o *.moc.* oprof_start.base.cpp oprof_start.base.h oprof_start + +# TODO: the sys_include is for the <sstream> thing add it to distrib +CFLAGS=-I ../sys_include -DOP_EVENTS_DESC -g -ansi -Wall --pedantic -O2 + +install: all oprofile oprof_start -$(MKDIR_P) $(BINDIR) - cp oprofile $(BINDIR)/oprofile - cd $(BINDIR) && chmod 755 oprofile +# obsolete line, cleanup when remove oprofile gui. + cp oprofile $(BINDIR)/oprofile && chmod 755 $(BINDIR)/oprofile + cp oprof_start $(BINDIR)/oprof_start && chmod 755 $(BINDIR)/oprof_start uninstall: -rm -f $(BINDIR)/oprofile @@ -20,3 +27,62 @@ @echo "The uninstall target does not remove your ~/.oprofile directory" @echo "---------------------------------------------------------------" +SOURCES=oprof_start.base.o oprof_start.base.moc.o oprof_start.o \ + oprof_start.moc.o oprof_start_impl.o op_events.o oprof_start_config.o \ + oprof_start_main.o + +oprof_start: $(SOURCES) + g++ -o $@ $^ -L$(QTDIR)/lib -lqt + +%.o: %.cpp + g++ -c $(CFLAGS) $< -o $@ + +%.o: %.c + gcc -c $(CFLAGS) $< -o $@ + +op_events.o: ../op_events.c + gcc -c $(CFLAGS) $< -o $@ + +# dependencies: auto-generated through CFLAGS += -MM, cat *.o +op_events.o: ../op_events.c ../op_user.h ../version.h +oprof_start.base.moc.o: oprof_start.base.moc.cpp oprof_start.base.h +oprof_start.base.o: oprof_start.base.cpp oprof_start.base.h +oprof_start.moc.o: oprof_start.moc.cpp oprof_start.h \ + oprof_start.base.h oprof_start_config.h persistent_config.h \ + ../op_user.h ../version.h +oprof_start.o: oprof_start.cpp oprof_start.h oprof_start.base.h \ + oprof_start_config.h persistent_config.h ../op_user.h ../version.h +oprof_start_config.o: oprof_start_config.cpp oprof_start_config.h \ + persistent_config.h ../op_user.h ../version.h +oprof_start_impl.o: oprof_start_impl.cpp oprof_start.h \ + oprof_start.base.h oprof_start_config.h persistent_config.h \ + ../op_user.h ../version.h +oprof_start_main.o: oprof_start_main.cpp oprof_start.h \ + oprof_start.base.h oprof_start_config.h persistent_config.h \ + ../op_user.h ../version.h + +# generate qt header file +oprof_start.base.h: oprof_start.base.ui + uic -o oprof_start.base.h oprof_start.base.ui + +# generate qt implementation file +oprof_start.base.cpp: oprof_start.base.h oprof_start.base.ui + uic -o oprof_start.base.cpp -impl oprof_start.base.h oprof_start.base.ui + +# generate qt moc code for base class +oprof_start.base.moc.cpp: oprof_start.base.h + moc -o oprof_start.base.moc.cpp oprof_start.base.h + +# generate qt moc code for subclass +oprof_start.moc.cpp: oprof_start.h oprof_start.base.moc.cpp + moc -o oprof_start.moc.cpp oprof_start.h + +# DO NOT un-comment these lines: just an examples of how to start a new form. +# after using this line you must edit oprof_start.cpp and replace the include +# oprof_start_base.h by oprof_start.h before compile it. I follow the following +# name scheme : xxxx.base.ui is the saved designer file form. xxxx_base.cpp/.h +# are base class read-only file. xxx.cpp/.h are derived class. + +# generate qt subclass header/implementation file, these file are created once +#uic -o oprof_start.h -subdecl oprof_start oprof_start.base.h oprof_start.base.ui +#uic -o oprof_start.cpp -subimpl oprof_start oprof_start.h oprof_start.base.ui |
From: Philippe E. <ph...@us...> - 2001-09-16 01:45:13
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv8302/oprofile Modified Files: ChangeLog Log Message: gui oprof_start Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.115 retrieving revision 1.116 diff -u -d -r1.115 -r1.116 --- ChangeLog 2001/09/15 22:03:57 1.115 +++ ChangeLog 2001/09/16 01:45:10 1.116 @@ -1,3 +1,17 @@ +2001-09-16 Philippe Elie <ph...@cl...> + + * pp/opf_filter.cpp: minor tidy + + * gui/oprof_start.base.ui: new oprof_start gui + * gui/oprof_start.cpp: new, derived class of oprof_start_base + * gui/oprof_start.h: ditto + * gui/oprof_start_impl.cpp: implementation of oprof_start class + * gui/oprof_start_config.cpp: utilities function for oprof_start + * gui/oprof_start_config.h: ditto + * gui/persistent_config.h: utility template + * gui/oprof_start_main.cpp: main() for oprof_start + * gui/Makefile.in: handle this stuff + 2001-09-15 John Levon <mo...@co...> * pp/oprofpp.c: some cleanup |
From: John L. <mov...@us...> - 2001-09-15 22:04:03
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv8147/pp Modified Files: oprofpp.c Log Message: some pp cleanup Index: oprofpp.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- oprofpp.c 2001/09/15 21:05:59 1.44 +++ oprofpp.c 2001/09/15 22:03:57 1.45 @@ -15,16 +15,6 @@ * Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - * You can start this program in various ways, e.g. - * - * oprofpp <options> /var/opd/samples/}bin}mv - * oprofpp <options> /bin/mv - * oprofpp <options> -f /var/opd/samples/}bin}mv -i /bin/mv - * oprofpp <options> -i /path/to/the/same/bin/mv /var/opd/samples/}bin}mv - * - */ - #include "oprofpp.h" static int showvers; @@ -66,8 +56,7 @@ { "dump-gprof-file", 'g', POPT_ARG_STRING, &gproffile, 0, "dump gprof format file", "file", }, { "list-symbol", 's', POPT_ARG_STRING, &symbol, 0, "give detailed samples for a symbol", "symbol", }, { "demangle", 'd', POPT_ARG_NONE, &demangle, 0, "demangle GNU C++ symbol names", NULL, }, - /* DJ FIXME: --counter should show max-counter.*/ - { "counter", 'c', POPT_ARG_INT, &ctr, 0, "which counter to use", "0|1", }, + { "counter", 'c', POPT_ARG_INT, &ctr, 0, "which counter to use", "counter number", }, { "version", 'v', POPT_ARG_NONE, &showvers, 0, "show version", NULL, }, { "verbose", 'V', POPT_ARG_NONE, &verbose, 0, "verbose output", NULL, }, { "base-dir", 'b', POPT_ARG_STRING, &basedir, 0, "base directory of profile daemon", NULL, }, @@ -79,6 +68,10 @@ { NULL, 0, 0, NULL, 0, NULL, NULL, }, }; +/** + * remangle - convert a filename into the related sample file name + * @image: the image filename + */ char *remangle(const char *image) { char *file; @@ -106,13 +99,27 @@ } /** + * quit_error - quit with error + * @optcon: popt context + * @err: error to show + * + * err may be NULL + */ +static void quit_error(poptContext * optcon, char const *err) +{ + if (err) + fprintf(stderr, err); + poptPrintHelp(*optcon, stderr, 0); + exit(EXIT_FAILURE); +} + +/** * get_options - process command line * @argc: program arg count * @argv: program arg array * * Process the arguments, fatally complaining on - * error. samplefile is guaranteed to have some - * non-NULL value after this function. + * error. */ static void get_options(int argc, char const *argv[]) { @@ -128,12 +135,11 @@ c=poptGetNextOpt(optcon); - if (c<-1) { + if (c < -1) { fprintf(stderr, "oprofpp: %s: %s\n", - poptBadOption(optcon, POPT_BADOPTION_NOALIAS), - poptStrerror(c)); - poptPrintHelp(optcon, stderr, 0); - exit(EXIT_FAILURE); + poptBadOption(optcon, POPT_BADOPTION_NOALIAS), + poptStrerror(c)); + quit_error(&optcon, NULL); } if (showvers) { @@ -142,24 +148,15 @@ } if (!list_all_symbols_details && !list_symbols && - !gproffile && !symbol) { - fprintf(stderr, "oprofpp: no mode specified. What do you want from me ?\n"); - poptPrintHelp(optcon, stderr, 0); - exit(EXIT_FAILURE); - } + !gproffile && !symbol) + quit_error(&optcon, "oprofpp: no mode specified. What do you want from me ?\n"); /* check only one major mode specified */ - if ((list_all_symbols_details + list_symbols + (gproffile != 0) + (symbol != 0)) > 1) { - fprintf(stderr, "oprofpp: must specify only one output type.\n"); - poptPrintHelp(optcon, stderr, 0); - exit(EXIT_FAILURE); - } + if ((list_all_symbols_details + list_symbols + (gproffile != 0) + (symbol != 0)) > 1) + quit_error(&optcon, "oprofpp: must specify only one output type.\n"); - if (output_linenr_info && !list_all_symbols_details && !symbol) { - fprintf(stderr, "oprofpp: cannot list debug info without -L or -s option.\n"); - poptPrintHelp(optcon, stderr, 0); - exit(EXIT_FAILURE); - } + if (output_linenr_info && !list_all_symbols_details && !symbol) + quit_error(&optcon, "oprofpp: cannot list debug info without -L or -s option.\n"); /* non-option file, either a sample or binary image file */ file = poptGetArg(optcon); @@ -171,10 +168,8 @@ if (samplefile) samplefile = opd_relative_to_absolute_path(samplefile, NULL); - if (file) - file = opd_relative_to_absolute_path(file, NULL); - if (file) { + file = opd_relative_to_absolute_path(file, NULL); if (strchr(file, OPD_MANGLE_CHAR)) samplefile = file; else @@ -192,24 +187,17 @@ } } - /* We must get account 2 var : ctr, mangled filename, if ctr is not - * provided it can be provided inside the filename itself by the #%d - * terminateur, if ctr is given we check an eventual conflict */ - /* PHE FIXME: can be simplified probably ? */ - file_ctr_str = strrchr(samplefile, '#'); + /* check for a valid counter suffix in a given sample file */ counter = -1; + file_ctr_str = strrchr(samplefile, '#'); if (file_ctr_str) { sscanf(file_ctr_str + 1, "%d", &counter); } if (ctr != counter) { /* a --counter=x have priority on the # suffixe of filename */ - if (ctr != -1 && counter != -1) { - /* conflict between #%d and --ctr option */ - fprintf(stderr, "oprofpp: conflict between given counter and counter of samples file.\n"); - poptPrintHelp(optcon, stderr, 0); - exit(EXIT_FAILURE); - } + if (ctr != -1 && counter != -1) + quit_error(&optcon, "oprofpp: conflict between given counter and counter of samples file.\n"); } if (ctr == -1) @@ -231,12 +219,11 @@ } } + /* chop suffixes */ if (file_ctr_str) file_ctr_str[0] = '\0'; - /* yes, OP_MAX_COUNTERS. We should initially allow for seeing if - * there are samples for any counter - */ + /* check we have a valid ctr */ if (ctr != -1 && (ctr < 0 || ctr >= OP_MAX_COUNTERS)) { fprintf(stderr, "oprofpp: invalid counter number %u\n", ctr); exit(EXIT_FAILURE); @@ -303,7 +290,7 @@ char **matching; time_t newmtime; bfd *ibfd; - uint i; + uint first; file = (char *)imagefile; @@ -327,10 +314,11 @@ c=file; - do { + while (*c) { if (*c == OPD_MANGLE_CHAR) *c='/'; - } while (*c++); + c++; + } free(mang); } @@ -357,20 +345,19 @@ if (!imagefile) free(file); - for (i = 0; i < op_nr_counters; ++i) { - if (footer[i]) + for (first = 0; first < op_nr_counters; ++first) { + if (footer[first]) break; } - /* should never happens */ - if (i == op_nr_counters) { + /* should never happen */ + if (first == op_nr_counters) { fprintf(stderr,"oprofpp: open_image_file() no samples file open for %s.\n", file); exit(EXIT_FAILURE); } - if (footer[i]->is_kernel) { + if (footer[first]->is_kernel) { asection *sect; - sect = bfd_get_section_by_name(ibfd, ".text"); sect_offset = OPD_KERNEL_OFFSET - sect->filepos; verbprintf("Adjusting kernel samples by 0x%x, .text filepos 0x%lx\n", sect_offset, sect->filepos); @@ -435,7 +422,7 @@ } /** - * translate_address - lookup and output linenr info from a vma address + * ouput_linenr - lookup and output linenr info from a vma address * in a given section to standard output. * @ibfd: the bfd * @syms: pointer to array of symbol pointers @@ -445,16 +432,17 @@ * Do not change output format without changing the corresponding tools * that work with output from oprofpp. */ -static void -translate_address (bfd* ibfd, asymbol **syms, asection *section, bfd_vma pc) +static void output_linenr(bfd* ibfd, asymbol **syms, asection *section, bfd_vma pc) { int found; bfd_vma vma; - const char *filename; const char *functionname; unsigned int line; + if (!output_linenr_info) + return; + if ((bfd_get_section_flags (ibfd, section) & SEC_ALLOC) == 0) return; @@ -462,15 +450,13 @@ if (pc < vma) return; - found = bfd_find_nearest_line (ibfd, section, syms, pc - vma, - &filename, &functionname, &line); + found = bfd_find_nearest_line(ibfd, section, syms, pc - vma, + &filename, &functionname, &line); - if (!found) { - printf ("??:0"); - } - else { - printf ("%s:%u", filename, line); - } + if (!found) + printf ("??:0 "); + else + printf ("%s:%u ", filename, line); } /** @@ -505,8 +491,8 @@ syms = opd_malloc(size); nr_all_syms = bfd_canonicalize_symtab(ibfd, syms); if (nr_all_syms < 1) { - opd_free(syms); - return 0; + opd_free(syms); + return 0; } for (i=0; i < nr_all_syms; i++) { @@ -612,13 +598,11 @@ exit(EXIT_FAILURE); } - for (j = start; j < end; j++) { + for (j = start; j < end; j++) accumulate_samples(scounts[i].count, j); - } - for (k = 0 ; k < op_nr_counters ; ++k) { + for (k = 0 ; k < op_nr_counters ; ++k) tot[k] += scounts[i].count[k]; - } } qsort(scounts, num, sizeof(struct opp_count), countcomp); @@ -655,6 +639,7 @@ u32 start, end; u32 i, j; uint k; + bfd_vma vma, base_vma; for (i=0; i < num; i++) { if (streq(syms[i]->name, symbol)) @@ -671,30 +656,26 @@ if (samples[k] && samples[k][j].count) break; } - - /* k != op_nr_counters <==> one of the counter is not empty */ - if (k != op_nr_counters) { - bfd_vma vma, base_vma; - base_vma = syms[i]->value + syms[i]->section->vma; - vma = sym_offset(syms[i], j) + base_vma; - if (output_linenr_info) { - translate_address(ibfd, syms, syms[i]->section, vma); - printf(" "); - } + /* all counters are empty at this address */ + if (k == op_nr_counters) + continue; + + base_vma = syms[i]->value + syms[i]->section->vma; + vma = sym_offset(syms[i], j) + base_vma; - printf("%s+%x/%x:", symbol, sym_offset(syms[i], j), end-start); + output_linenr(ibfd, syms, syms[i]->section, vma); + printf("%s+%x/%x:", symbol, sym_offset(syms[i], j), end-start); - for (k = 0 ; k < op_nr_counters ; ++k) { - if (samples[k]) - /* PHE: please keep this space a few - * time, I can't live without it ;) */ - printf("\t%u ", samples[k][j].count); - else - printf("\t%u", 0U); - } - printf("\n"); + for (k = 0 ; k < op_nr_counters ; ++k) { + if (samples[k]) + /* PHE: please keep this space a few + * time, I can't live without it ;) */ + printf("\t%u ", samples[k][j].count); + else + printf("\t%u", 0U); } + printf("\n"); } } @@ -715,7 +696,7 @@ * Dump gprof-format samples for the image specified by samplefile to * the file specified by gproffile. */ -/* PHE: this fun has not been tested */ +/* PHE: FIXME: this fun has not been tested */ void do_dump_gprof(asymbol **syms, uint num) { static struct gmon_hdr hdr = { "gmon", GMON_VERSION, {0,0,0,},}; @@ -814,90 +795,88 @@ } /** - * do_list_all_symbols_details - list all samples for all symbols. + * do_list_symbol_details - list all samples for a given symbol * @ibfd: the bfd - * - * Lists all the samples for all the symbols, from the image specified by - * @samplefile, in increasing order of vma, to standard out. - * - * Do not change output format without changing the corresponding tools - * that work with output from oprofpp + * @syms: all symbols + * @sym: the symbol + * @next: the next symbol */ -void do_list_all_symbols_details(bfd *ibfd, asymbol **syms, uint num) +static void do_list_symbol_details(bfd * ibfd, asymbol **syms, asymbol * sym, asymbol * next) { - uint i, j; + u32 counter[OP_MAX_COUNTERS]; + uint j, k; + int found_samples; + bfd_vma vma, base_vma; u32 start, end; - - for (i = 0 ; i < num ; ++i) { - u32 counter[OP_MAX_COUNTERS]; - uint k; - int found_samples; - - get_symbol_range(syms[i], (i == num-1) ? NULL : syms[i+1], - &start, &end); - - for (k = 0; k < op_nr_counters; ++k) { - counter[k] = 0; - } - - /* To avoid outputing 0 samples symbols */ - found_samples = 0; - for (j = start; j < end; ++j) { - found_samples |= accumulate_samples(counter, j); - } - - if (found_samples) { - bfd_vma vma, base_vma; - base_vma = syms[i]->value + syms[i]->section->vma; + get_symbol_range(sym, next, &start, &end); - vma = sym_offset(syms[i], start) + base_vma; + for (k = 0; k < op_nr_counters; ++k) + counter[k] = 0; - if (output_linenr_info) { - translate_address(ibfd, syms, syms[i]->section, - vma); + /* To avoid outputing 0 samples symbols */ + found_samples = 0; + for (j = start; j < end; ++j) + found_samples |= accumulate_samples(counter, j); - printf(" "); - } + if (!found_samples) + return; - printf("%.8lx ", base_vma); - for (k = 0 ; k < op_nr_counters ; ++k) { - printf("%u ", counter[k]); - } - printf_symbol(syms[i]->name); - printf("\n"); + base_vma = sym->value + sym->section->vma; - for (j = start; j < end; j++) { + vma = sym_offset(sym, start) + base_vma; - for (k = 0; k < op_nr_counters; ++k) { - counter[k] = 0; - } + output_linenr(ibfd, syms, sym->section, vma); + printf("%.8lx ", base_vma); + for (k = 0 ; k < op_nr_counters ; ++k) + printf("%u ", counter[k]); + printf_symbol(sym->name); + printf("\n"); - found_samples = accumulate_samples(counter, j); + for (j = start; j < end; j++) { + for (k = 0; k < op_nr_counters; ++k) + counter[k] = 0; - if (found_samples) { - vma = sym_offset(syms[i], j) + - base_vma; + found_samples = accumulate_samples(counter, j); + if (!found_samples) + continue; - if (output_linenr_info) { - printf(" "); + vma = sym_offset(sym, j) + base_vma; - translate_address(ibfd, syms, - syms[i]->section, - vma); - } + printf(" "); + output_linenr(ibfd, syms, sym->section, vma); + printf("%.8lx", vma); - printf(" %.8lx", vma); + for (k = 0; k < op_nr_counters; ++k) + printf(" %u", counter[k]); + printf("\n"); + } +} - for (k = 0; k < op_nr_counters; ++k) { - printf(" %u", counter[k]); - } +/** + * do_list_all_symbols_details - list all samples for all symbols. + * @ibfd: the bfd + * @syms: the symbols + * @num: total number of symbols + * + * Lists all the samples for all the symbols, from the image specified by + * @samplefile, in increasing order of vma, to standard out. + * + * Do not change output format without changing the corresponding tools + * that work with output from oprofpp + */ +static void do_list_all_symbols_details(bfd *ibfd, asymbol **syms, uint num) +{ + uint i; + asymbol * next; - printf("\n"); - } - } - } - } + for (i = 0 ; i < num ; ++i) { + if (i == num - 1) + next = NULL; + else + next = syms[i+1]; + do_list_symbol_details(ibfd, syms, syms[i], next); + } } /** @@ -941,73 +920,50 @@ fprintf(stderr, "oprofpp: Opening %s failed. %s\n", temp, strerror(errno)); exit(EXIT_FAILURE); } - - goto err1; + footer[counter] = NULL; + samples[counter] = NULL; + *size = 0; + return -1; } *size = opd_get_fsize(temp, 1) - sizeof(struct opd_footer); if (*size < sizeof(struct opd_footer)) { - if (!can_fail) { - fprintf(stderr, "oprofpp: sample file %s not enough big %d, expected %d\n", temp, *size, sizeof(struct opd_footer)); - exit(EXIT_FAILURE); - } - - goto err2; + fprintf(stderr, "oprofpp: sample file %s is not the right " + "size: got %d, expected %d\n", + temp, *size, sizeof(struct opd_footer)); + exit(EXIT_FAILURE); } footer[counter] = mmap(0, *size + sizeof(struct opd_footer), PROT_READ, MAP_PRIVATE, fd, 0); if (footer[counter] == (void *)-1) { - if (!can_fail) { - fprintf(stderr, "oprofpp: mmap of %s failed. %s\n", temp, strerror(errno)); - exit(EXIT_FAILURE); - } - goto err2; + fprintf(stderr, "oprofpp: mmap of %s failed. %s\n", temp, strerror(errno)); + exit(EXIT_FAILURE); } /* need a cast here :( */ samples[counter] = (struct opd_fentry *)(footer[counter] + 1); if (memcmp(footer[counter]->magic, OPD_MAGIC, sizeof(footer[0]->magic))) { - if (!can_fail) { - /* FIXME: is 4.4 ok : there is no zero terminator */ - fprintf(stderr, "oprofpp: wrong magic %4.4s, expected %s.\n", footer[counter]->magic, OPD_MAGIC); - exit(EXIT_FAILURE); - } - goto err3; + /* FIXME: is 4.4 ok : there is no zero terminator */ + fprintf(stderr, "oprofpp: wrong magic %4.4s, expected %s.\n", footer[counter]->magic, OPD_MAGIC); + exit(EXIT_FAILURE); } if (footer[counter]->version != OPD_VERSION) { - if (!can_fail) { - fprintf(stderr, "oprofpp: wrong version 0x%x, expected 0x%x.\n", footer[counter]->version, OPD_VERSION); - exit(EXIT_FAILURE); - } - goto err3; + fprintf(stderr, "oprofpp: wrong version 0x%x, expected 0x%x.\n", footer[counter]->version, OPD_VERSION); + exit(EXIT_FAILURE); } - /* This should be warrented by the daemon */ + /* This should be guaranteed by the daemon */ if (footer[counter]->ctr != counter) { - if (!can_fail) { - fprintf(stderr, "oprofpp: sanity check counter number fail %d, expect %d.\n", footer[counter]->ctr, counter); - exit(EXIT_FAILURE); - } - goto err3; + fprintf(stderr, "oprofpp: sanity check counter number fail %d, expect %d.\n", footer[counter]->ctr, counter); + exit(EXIT_FAILURE); } opd_free(temp); return fd; - -err3: - munmap(footer[counter], *size + sizeof(struct opd_footer)); -err2: - close(fd); -err1: - fd = -1; - footer[counter] = NULL; - samples[counter] = NULL; - *size = 0; - return fd; } /** @@ -1036,113 +992,119 @@ * @f1: first footer * @f2: second footer * - * verify than footer @f1 and @f2 are coherent. + * verify that footer @f1 and @f2 are coherent. * fatal error ocur if the footers are not coherent. */ static void check_footers(struct opd_footer* f1, struct opd_footer* f2) { if (f1->mtime != f2->mtime) { - fprintf(stderr, "oprofpp: footer time stamp are different (%ld, %ld)\n", f1->mtime, f2->mtime); + fprintf(stderr, "oprofpp: footer timestamps are different (%ld, %ld)\n", f1->mtime, f2->mtime); exit(EXIT_FAILURE); } if (f1->is_kernel != f2->is_kernel) { - fprintf(stderr, "oprofpp: footer is_kernel are different\n"); + fprintf(stderr, "oprofpp: footer is_kernel flags are different\n"); exit(EXIT_FAILURE); } if (f1->cpu_speed != f2->cpu_speed) { - fprintf(stderr, "oprofpp: footer cpu speed are different (%f, %f)", + fprintf(stderr, "oprofpp: footer cpu speeds are different (%f, %f)", f2->cpu_speed, f2->cpu_speed); exit(EXIT_FAILURE); } } -int main(int argc, char const *argv[]) +static bfd *ibfd; +static asymbol **syms; +static fd_t fd[OP_MAX_COUNTERS]; +static size_t size[OP_MAX_COUNTERS]; + +/** + * open_files - open all necessary files + */ +static void open_files(void) { - bfd *ibfd; - asymbol **syms; - uint i, j; - fd_t fd[OP_MAX_COUNTERS]; - size_t size[OP_MAX_COUNTERS]; - uint num; + uint i, j, first; time_t mtime = 0; - get_options(argc, argv); - - /* op_nr_counters is discovered from the samples itself, until we - * have opened the samples file(s) we must loop over all the possible - * available counters. This is a little what ugly but it allows - * to interpret samples files on a different hardware where the - * the profiler has run */ - for (i = 0; i < OP_MAX_COUNTERS; ++i) { + /* no samplefiles open initially */ + for (i = 0; i < OP_MAX_COUNTERS; ++i) fd[i] = -1; - size[i] = 0; - samples[i] = NULL; - footer[i] = NULL; - } for (i = 0; i < OP_MAX_COUNTERS ; ++i) { - if (ctr == -1 || ctr == (int)i) + if (ctr == -1 || ctr == (int)i) { /* if ctr == i, this means than we open only one * samples file so don't allow opening failure to get * a more precise error message */ fd[i] = open_samples_file(i, &size[i], ctr != (int)i); + } } - for (i = 0; i < OP_MAX_COUNTERS ; ++i) { - if (fd[i] != -1) + /* find first open file */ + for (first = 0; first < OP_MAX_COUNTERS ; ++first) { + if (fd[first] != -1) break; } - if (i == OP_MAX_COUNTERS) { + if (first == OP_MAX_COUNTERS) { fprintf(stderr, "Can not open any samples files for %s last error %s\n", samplefile, strerror(errno)); exit(EXIT_FAILURE); } - /* sanity check between the different samples files */ - for (i = 0 ; i < OP_MAX_COUNTERS; ++i) { - if (fd[i] != -1) - break; - } + /* determine how many counters are possible via the sample file. + * allows use on different platform */ + if (footer[first]->cpu_type == CPU_ATHLON) + op_nr_counters = 4; - for (j = i + 1; j < OP_MAX_COUNTERS; ++j) { - if (fd[j] != -1) { - if (size[i] != size[j]) { - fprintf(stderr, "oprofpp: mapping file size " - "for ctr (%d, %d) are different " - "(%d, %d)\n", i, j, size[i], size[j]); + if (list_all_symbols_details) + /* TODO: temporary hack to fix and easy life of opf_filter.cpp + * Will be cleanup when linking opf_filter with oprofpp. */ + printf("Cpu type: %d\n", footer[first]->cpu_type); + else + printf("Cpu type: %s\n", op_get_cpu_type_str(footer[first]->cpu_type)); - exit(EXIT_FAILURE); - } - - check_footers(footer[i], footer[j]); + printf("Cpu speed was (MHz estimation) : %f\n", footer[first]->cpu_speed); + + /* check sample files match */ + for (j = first + 1; j < OP_MAX_COUNTERS; ++j) { + if (fd[j] == -1) + continue; + if (size[first] != size[j]) { + fprintf(stderr, "oprofpp: mapping file size " + "for ctr (%d, %d) are different " + "(%d, %d)\n", first, j, size[first], size[j]); + + exit(EXIT_FAILURE); } + check_footers(footer[first], footer[j]); } /* output and sanity check on ctr_um, ctr_event and cpu_type */ for (i = 0 ; i < OP_MAX_COUNTERS; ++i) { - if (fd[i] != -1) { - check_and_output_event(i); + if (fd[i] == -1) + continue; - /* redundant set but correct and simplify the code */ - nr_samples = size[i] / sizeof(struct opd_fentry); - mtime = footer[i]->mtime; - } + check_and_output_event(i); + /* redundant set but correct and simplify the code */ + nr_samples = size[i] / sizeof(struct opd_fentry); + mtime = footer[i]->mtime; } verbprintf("nr_samples %d\n", nr_samples); - for (i = 0; i < OP_MAX_COUNTERS; ++i) { - if (fd[i] != -1) - break; - } - - if (footer[i]->cpu_type == CPU_ATHLON) - op_nr_counters = 4; - ibfd = open_image_file(samplefile, mtime); +} + + +int main(int argc, char const *argv[]) +{ + uint i; + uint num; + + get_options(argc, argv); + open_files(); + num = get_symbols(ibfd, &syms); verbprintf("nr symbols %u\n", num); @@ -1151,15 +1113,6 @@ fprintf(stderr, "oprofpp: couldn't get any symbols from image file.\n"); exit(EXIT_FAILURE); } - - if (list_all_symbols_details) - /* TODO: temporary hack to fix and easy life of opf_filter.cpp - * Will be cleanup when linking opf_filter with oprofpp. */ - printf("Cpu type: %d\n", footer[i]->cpu_type); - else - printf("Cpu type: %s\n", op_get_cpu_type_str(footer[i]->cpu_type)); - - printf("Cpu speed was (MHz estimation) : %f\n", footer[i]->cpu_speed); if (list_symbols) { do_list_symbols(syms, num); |
From: John L. <mov...@us...> - 2001-09-15 22:04:03
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv8147 Modified Files: ChangeLog Log Message: some pp cleanup Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.114 retrieving revision 1.115 diff -u -d -r1.114 -r1.115 --- ChangeLog 2001/09/15 21:05:58 1.114 +++ ChangeLog 2001/09/15 22:03:57 1.115 @@ -1,5 +1,9 @@ 2001-09-15 John Levon <mo...@co...> + * pp/oprofpp.c: some cleanup + +2001-09-15 John Levon <mo...@co...> + * pp/oprofpp.c: allow non-matching mtimes in order to allow pp on different machines. Make conflicting counter specifications a fatal error |
From: John L. <mov...@us...> - 2001-09-15 21:06:01
|
Update of /cvsroot/oprofile/oprofile In directory usw-pr-cvs1:/tmp/cvs-serv32175 Modified Files: ChangeLog Log Message: two small changes Index: ChangeLog =================================================================== RCS file: /cvsroot/oprofile/oprofile/ChangeLog,v retrieving revision 1.113 retrieving revision 1.114 diff -u -d -r1.113 -r1.114 --- ChangeLog 2001/09/15 20:55:45 1.113 +++ ChangeLog 2001/09/15 21:05:58 1.114 @@ -1,8 +1,14 @@ 2001-09-15 John Levon <mo...@co...> + * pp/oprofpp.c: allow non-matching mtimes in order + to allow pp on different machines. Make conflicting + counter specifications a fatal error + +2001-09-15 John Levon <mo...@co...> + * all Makefile.in: install should depend on all - * oprofpp.c: fixes for Athlon 4 counters. Enable debug info + * pp/oprofpp.c: fixes for Athlon 4 counters. Enable debug info for list-symbol. Some stricter checking 2001-09-15 Philippe Elie <ph...@cl...> |
From: John L. <mov...@us...> - 2001-09-15 21:06:01
|
Update of /cvsroot/oprofile/oprofile/pp In directory usw-pr-cvs1:/tmp/cvs-serv32175/pp Modified Files: oprofpp.c Log Message: two small changes Index: oprofpp.c =================================================================== RCS file: /cvsroot/oprofile/oprofile/pp/oprofpp.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- oprofpp.c 2001/09/15 20:55:45 1.43 +++ oprofpp.c 2001/09/15 21:05:59 1.44 @@ -206,8 +206,9 @@ /* a --counter=x have priority on the # suffixe of filename */ if (ctr != -1 && counter != -1) { /* conflict between #%d and --ctr option */ - fprintf(stderr, "oprofpp: conflict between %s filename counter nr and --ctr %d option, using --ctr option %d\n", file_ctr_str, ctr, ctr); - counter = ctr; + fprintf(stderr, "oprofpp: conflict between given counter and counter of samples file.\n"); + poptPrintHelp(optcon, stderr, 0); + exit(EXIT_FAILURE); } } @@ -336,10 +337,9 @@ newmtime = opd_get_mtime(file); if (newmtime != mtime) { - fprintf(stderr, "oprofpp: the last modified time of the binary file %s does not match " - "that of the sample file. Either this is the wrong binary or the binary " + fprintf(stderr, "oprofpp: WARNING: the last modified time of the binary file %s does not match\n" + "that of the sample file. Either this is the wrong binary or the binary\n" "has been modified since the sample file was created.\n", file); - exit(EXIT_FAILURE); } ibfd = bfd_openr(file, NULL); |
From: John L. <mov...@us...> - 2001-09-15 20:55:48
|
Update of /cvsroot/oprofile/oprofile/gui In directory usw-pr-cvs1:/tmp/cvs-serv30034/gui Modified Files: Makefile.in Log Message: post-prof fixes for 4 counters, and some other changes. Philippe, please check. Index: Makefile.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/gui/Makefile.in,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Makefile.in 2001/09/01 02:03:34 1.4 +++ Makefile.in 2001/09/15 20:55:45 1.5 @@ -9,7 +9,7 @@ BINDIR=@bindir@ MKDIR_P=mkdir -p -install: oprofile +install: all oprofile -$(MKDIR_P) $(BINDIR) cp oprofile $(BINDIR)/oprofile cd $(BINDIR) && chmod 755 oprofile |
From: John L. <mov...@us...> - 2001-09-15 20:55:48
|
Update of /cvsroot/oprofile/oprofile/dae In directory usw-pr-cvs1:/tmp/cvs-serv30034/dae Modified Files: Makefile.in Log Message: post-prof fixes for 4 counters, and some other changes. Philippe, please check. Index: Makefile.in =================================================================== RCS file: /cvsroot/oprofile/oprofile/dae/Makefile.in,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Makefile.in 2001/09/02 00:32:28 1.16 +++ Makefile.in 2001/09/15 20:55:45 1.17 @@ -12,7 +12,7 @@ MKDIR_P=mkdir -p INSTALL_LIST=oprofiled op_start op_dump op_stop op_help -install: $(INSTALL_LIST) +install: all $(INSTALL_LIST) -$(MKDIR_P) $(BINDIR) for f in $(INSTALL_LIST); do \ cp $$f $(BINDIR)/$$f && chmod 755 $(BINDIR)/$$f; \ |