Mike Dodd | 8cfa702 | 2010-11-17 11:12:26 -0800 | [diff] [blame] | 1 | /** |
| 2 | * @file opd_image.h |
| 3 | * Management of binary images |
| 4 | * |
| 5 | * @remark Copyright 2002 OProfile authors |
| 6 | * @remark Read the file COPYING |
| 7 | * |
| 8 | * @author John Levon |
| 9 | * @author Philippe Elie |
| 10 | */ |
| 11 | |
| 12 | #ifndef OPD_IMAGE_H |
| 13 | #define OPD_IMAGE_H |
| 14 | |
| 15 | #include "op_list.h" |
| 16 | #include "op_config_24.h" |
| 17 | #include "op_types.h" |
| 18 | |
| 19 | #include <time.h> |
| 20 | |
| 21 | struct opd_24_sfile; |
| 22 | |
| 23 | /** |
| 24 | * A binary (library, application, kernel or module) |
| 25 | * is represented by a struct opd_image. |
| 26 | */ |
| 27 | struct opd_image { |
| 28 | /** used by container of opd_images */ |
| 29 | struct list_head hash_next; |
| 30 | /** how many time this opd_image is referenced */ |
| 31 | int ref_count; |
| 32 | /** all samples files belonging to this image */ |
| 33 | struct opd_24_sfile ** sfiles[NR_CPUS]; |
| 34 | /** name of this image */ |
| 35 | char * name; |
| 36 | /** the application name where belongs this image, NULL if image has |
| 37 | * no owner (such as vmlinux or module) */ |
| 38 | char * app_name; |
| 39 | /** thread id, on 2.2 kernel always == to tgid */ |
| 40 | pid_t tid; |
| 41 | /** thread group id */ |
| 42 | pid_t tgid; |
| 43 | /** time of last modification */ |
| 44 | time_t mtime; |
| 45 | /** kernel image or not */ |
| 46 | int kernel; |
| 47 | /** non zero if this image must be profiled */ |
| 48 | int ignored; |
| 49 | }; |
| 50 | |
| 51 | /** callback function passed to opd_for_each_image() */ |
| 52 | typedef void (*opd_image_cb)(struct opd_image *); |
| 53 | |
| 54 | /** |
| 55 | * @param imagecb callback to apply onto each existing image struct |
| 56 | * |
| 57 | * the callback receive a struct opd_image * (not a const struct) and is |
| 58 | * allowed to freeze the image struct itself. |
| 59 | */ |
| 60 | void opd_for_each_image(opd_image_cb imagecb); |
| 61 | |
| 62 | /** |
| 63 | * initialize opd_image container |
| 64 | */ |
| 65 | void opd_init_images(void); |
| 66 | |
| 67 | /** |
| 68 | * @param image the image pointer |
| 69 | * |
| 70 | * Decrement reference count of image, if reference count is zero flush and |
| 71 | * close the samples files then freeze all memory belonging to this image. |
| 72 | */ |
| 73 | void opd_delete_image(struct opd_image * image); |
| 74 | |
| 75 | /** |
| 76 | * opd_get_kernel_image - get a kernel image |
| 77 | * @param name of image |
| 78 | * @param app_name application owner of this kernel image. non-null only |
| 79 | * when separate_kernel_sample != 0 |
| 80 | * @param tid thread id |
| 81 | * @param tgid thread group id |
| 82 | * |
| 83 | * Create and initialise an image adding it to the image lists and to image |
| 84 | * hash list. Note than at creation reference count is zero, it's caller |
| 85 | * responsabilities to incr this count. |
| 86 | */ |
| 87 | struct opd_image * opd_get_kernel_image(char const * name, |
| 88 | char const * app_name, pid_t tid, pid_t tgid); |
| 89 | |
| 90 | /** |
| 91 | * opd_get_image - get an image from the image structure |
| 92 | * @param name name of image |
| 93 | * @param app_name the application name where belongs this image |
| 94 | * @param kernel is the image a kernel/module image |
| 95 | * @param tid thread id |
| 96 | * @param tgid thread group id |
| 97 | * |
| 98 | * Get the image specified by the file name name from the |
| 99 | * image structure. If it is not present, the image is |
| 100 | * added to the structure. In either case, the image number |
| 101 | * is returned. |
| 102 | */ |
| 103 | struct opd_image * opd_get_image(char const * name, char const * app_name, |
| 104 | int kernel, pid_t tid, pid_t tgid); |
| 105 | |
| 106 | /** |
| 107 | * opd_get_nr_images - return number of images |
| 108 | */ |
| 109 | int opd_get_nr_images(void); |
| 110 | |
| 111 | #endif /* OPD_IMAGE_H */ |