18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file opd_image.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Management of binary images
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2002 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef OPD_IMAGE_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define OPD_IMAGE_H
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_list.h"
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_config_24.h"
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_types.h"
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <time.h>
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct opd_24_sfile;
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * A binary (library, application, kernel or module)
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * is represented by a struct opd_image.
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct opd_image {
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** used by container of opd_images */
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct list_head hash_next;
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** how many time this opd_image is referenced */
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int ref_count;
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** all samples files belonging to this image */
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	struct opd_24_sfile ** sfiles[NR_CPUS];
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** name of this image */
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char * name;
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** the application name where belongs this image, NULL if image has
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	 * no owner (such as vmlinux or module) */
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	char * app_name;
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** thread id, on 2.2 kernel always == to tgid */
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pid_t tid;
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** thread group id  */
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	pid_t tgid;
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** time of last modification */
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	time_t mtime;
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** kernel image or not */
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int kernel;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/** non zero if this image must be profiled */
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	int ignored;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/** callback function passed to opd_for_each_image() */
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtypedef void (*opd_image_cb)(struct opd_image *);
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param imagecb callback to apply onto each existing image struct
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * the callback receive a struct opd_image * (not a const struct) and is
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * allowed to freeze the image struct itself.
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid opd_for_each_image(opd_image_cb imagecb);
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * initialize opd_image container
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid opd_init_images(void);
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param image  the image pointer
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Decrement reference count of image, if reference count is zero flush and
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * close the samples files then freeze all memory belonging to this image.
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddvoid opd_delete_image(struct opd_image * image);
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * opd_get_kernel_image - get a kernel image
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param name of image
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param app_name application owner of this kernel image. non-null only
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *  when separate_kernel_sample != 0
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param tid  thread id
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param tgid  thread group id
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Create and initialise an image adding it to the image lists and to image
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * hash list. Note than at creation reference count is zero, it's caller
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * responsabilities to incr this count.
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct opd_image * opd_get_kernel_image(char const * name,
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd     char const * app_name, pid_t tid, pid_t tgid);
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * opd_get_image - get an image from the image structure
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param name  name of image
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param app_name  the application name where belongs this image
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param kernel  is the image a kernel/module image
958cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param tid  thread id
968cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @param tgid  thread group id
978cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
988cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Get the image specified by the file name name from the
998cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * image structure. If it is not present, the image is
1008cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * added to the structure. In either case, the image number
1018cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * is returned.
1028cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1038cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstruct opd_image * opd_get_image(char const * name, char const * app_name,
1048cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd                                 int kernel, pid_t tid, pid_t tgid);
1058cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1068cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
1078cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * opd_get_nr_images - return number of images
1088cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
1098cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint opd_get_nr_images(void);
1108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
1118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* OPD_IMAGE_H */
112