blob: 8140a46026620bdfeacb15d8ad2e952bdcd8ce53 [file] [log] [blame]
/**
* @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 */