/** * @file opd_image.h * Management of binary images * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author John Levon * @author Philippe Elie */ #ifndef OPD_IMAGE_H #define OPD_IMAGE_H #include "op_list.h" #include "op_config_24.h" #include "op_types.h" #include <time.h> struct opd_24_sfile; /** * A binary (library, application, kernel or module) * is represented by a struct opd_image. */ struct opd_image { /** used by container of opd_images */ struct list_head hash_next; /** how many time this opd_image is referenced */ int ref_count; /** all samples files belonging to this image */ struct opd_24_sfile ** sfiles[NR_CPUS]; /** name of this image */ char * name; /** the application name where belongs this image, NULL if image has * no owner (such as vmlinux or module) */ char * app_name; /** thread id, on 2.2 kernel always == to tgid */ pid_t tid; /** thread group id */ pid_t tgid; /** time of last modification */ time_t mtime; /** kernel image or not */ int kernel; /** non zero if this image must be profiled */ int ignored; }; /** callback function passed to opd_for_each_image() */ typedef void (*opd_image_cb)(struct opd_image *); /** * @param imagecb callback to apply onto each existing image struct * * the callback receive a struct opd_image * (not a const struct) and is * allowed to freeze the image struct itself. */ void opd_for_each_image(opd_image_cb imagecb); /** * initialize opd_image container */ void opd_init_images(void); /** * @param image the image pointer * * Decrement reference count of image, if reference count is zero flush and * close the samples files then freeze all memory belonging to this image. */ void opd_delete_image(struct opd_image * image); /** * opd_get_kernel_image - get a kernel image * @param name of image * @param app_name application owner of this kernel image. non-null only * when separate_kernel_sample != 0 * @param tid thread id * @param tgid thread group id * * Create and initialise an image adding it to the image lists and to image * hash list. Note than at creation reference count is zero, it's caller * responsabilities to incr this count. */ struct opd_image * opd_get_kernel_image(char const * name, char const * app_name, pid_t tid, pid_t tgid); /** * opd_get_image - get an image from the image structure * @param name name of image * @param app_name the application name where belongs this image * @param kernel is the image a kernel/module image * @param tid thread id * @param tgid thread group id * * Get the image specified by the file name name from the * image structure. If it is not present, the image is * added to the structure. In either case, the image number * is returned. */ struct opd_image * opd_get_image(char const * name, char const * app_name, int kernel, pid_t tid, pid_t tgid); /** * opd_get_nr_images - return number of images */ int opd_get_nr_images(void); #endif /* OPD_IMAGE_H */