C++程序  |  152行  |  4.07 KB

/**
 * @file opd_proc.h
 * Management of processes
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#ifndef OPD_PROC_H
#define OPD_PROC_H

#include "op_types.h"
#include "op_list.h"

struct opd_map;
struct opd_image;
struct op_note;
struct op_sample;

/**
 * track process, created either by a fork or an exec notification.
 */
struct opd_proc {
	/** maps are always added to the end of head, so search will be done
	 * from the newest map to the oldest which mean we don't care about
	 * munmap. First added map must be the primary image */
	struct list_head maps;
	/** process name */
	char const * name;
	/** thread id for this process, always equal to tgid for 2.2 kernel */
	pid_t tid;
	/** thread group id for this process */
	pid_t tgid;
	/** non-zero if this process receive any samples, this field
	 * is used with dead field to defer opd_proc deletion */
	int accessed;
	/** Set to non-zero when an exit notification occur for this process */
	int dead;
	/** used by container of opd_proc */
	struct list_head next;
};

/**
 * initialize opd_proc container
 */
void opd_init_procs(void);

/**
 * opd_put_sample - process a sample
 * @param sample  sample to process
 *
 * Write out the sample to the appropriate sample file. This
 * routine handles kernel and module samples as well as ordinary ones.
 */
void opd_put_sample(struct op_sample const * sample);

/**
 * opd_put_image_sample - write sample to file
 * @param image  image for sample
 * @param offset  (file) offset to write to
 * @param counter  counter number
 *
 * Add to the count stored at position offset in the
 * image file. Overflow pins the count at the maximum
 * value.
 */
void opd_put_image_sample(struct opd_image * image, unsigned long offset, u32 counter);

/**
 * opd_handle_fork - deal with fork notification
 * @param note  note to handle
 *
 * Deal with a fork() notification by creating a new process
 * structure, and copying mapping information from the old process.
 *
 * sample->pid contains the process id of the old process.
 * sample->eip contains the process id of the new process.
 */
void opd_handle_fork(struct op_note const * note);

/**
 * opd_handle_exec - deal with notification of execve()
 * @param tid  tid for this process
 * @param tgid  tgid for this process
 *
 * Drop all mapping information for the process.
 */
void opd_handle_exec(pid_t tid, pid_t tgid);

/**
 * opd_handle_exit - deal with exit notification
 * @param note  note to handle
 *
 * Deal with an exit() notification by setting the flag "dead"
 * on a process. These will be later cleaned up by the %SIGALRM
 * handler.
 *
 * sample->pid contains the process id of the exited process.
 */
void opd_handle_exit(struct op_note const * note);

/**
 * opd_get_proc - get process from process list
 * @param tid  tid for this process
 * @param tgid  tgid for this process
 *
 * A process with pid tid is searched on the process list,
 * maintaining LRU order. If it is not found, %NULL is returned,
 * otherwise the process structure is returned.
 */
struct opd_proc * opd_get_proc(pid_t tid, pid_t tgid);

/**
 * opd_new_proc - create a new process structure
 * @param tid  tid for this process
 * @param tgid  tgid for this process
 *
 * Allocate and initialise a process structure and insert
 * it into the procs hash table.
 */
struct opd_proc * opd_new_proc(pid_t tid, pid_t tgid);

/**
 * opd_get_nr_procs - return number of processes tracked
 */
int opd_get_nr_procs(void);

/**
 * opd_age_procs - age all dead process preparing them for a deletion
 */
void opd_age_procs(void);

/**
 * freeze all resource used by opd_procs managment
 */
void opd_proc_cleanup(void);

/**
 * opd_clear_kernel_mapping - remove all kernel mapping for all opd_proc
 *
 * invalidate (by removing them) all kernel mapping. This function do nothing
 * when separate_kernel == 0 because we don't add mapping for kernel
 * sample in proc struct. As side effect decrease reference count of
 * associated with these mapping which eventually close this image
 */
void opd_clear_kernel_mapping(void);

#endif /* OPD_PROC_H */