C++程序  |  120行  |  2.9 KB

/**
 * @file daemon/opd_sfile.h
 * Management of sample files
 *
 * @remark Copyright 2002 OProfile authors
 * @remark Read the file COPYING
 *
 * @author John Levon
 * @author Philippe Elie
 */

#ifndef OPD_SFILE_H
#define OPD_SFILE_H

#include "opd_cookie.h"

#include "odb.h"
#include "op_hw_config.h"
#include "op_types.h"
#include "op_list.h"

#include <sys/types.h>

struct kernel_image;
struct transient;

#define CG_HASH_SIZE 16
#define UNUSED_EMBEDDED_OFFSET ~0LLU

/**
 * Each set of sample files (where a set is over the physical counter
 * types) will have one of these for it. We match against the
 * descriptions here to find which sample DB file we need to modify.
 *
 * cg files are stored in the hash.
 */
struct sfile {
	/** hash value for this sfile */
	unsigned long hashval;
	/** cookie value for the binary profiled */
	cookie_t cookie;
	/** cookie value for the application owner, INVALID_COOKIE if not set */
	cookie_t app_cookie;
	/** thread ID, -1 if not set */
	pid_t tid;
	/** thread group ID, -1 if not set */
	pid_t tgid;
	/** CPU number */
	unsigned int cpu;
	/** kernel image if applicable */
	struct kernel_image * kernel;
	/** anonymous mapping */
	struct anon_mapping * anon;
	/** embedded offset for Cell BE SPU */
	uint64_t embedded_offset;

	/** hash table link */
	struct list_head hash;
	/** lru list */
	struct list_head lru;
	/** true if this file should be ignored in profiles */
	int ignored;
	/** opened sample files */
	odb_t files[OP_MAX_COUNTERS];
	/** extended sample files */
	odb_t * ext_files;
	/** hash table of opened cg sample files */
	struct list_head cg_hash[CG_HASH_SIZE];
};

/** a call-graph entry */
struct cg_entry {
	/** where arc is to */
	struct sfile to;
	/** next in the hash slot */
	struct list_head hash;
};

/** clear any sfiles that are for the kernel */
void sfile_clear_kernel(void);

struct anon_mapping;

/** clear any sfiles for the given anon mapping */
void sfile_clear_anon(struct anon_mapping *);

/** sync sample files */
void sfile_sync_files(void);

/** close sample files */
void sfile_close_files(void);

/** clear out a certain amount of LRU entries
 * return non-zero if the lru is already empty */
int sfile_lru_clear(void);

/** remove a sfile from the lru list, protecting it from sfile_lru_clear() */
void sfile_get(struct sfile * sf);

/** add this sfile to lru list */
void sfile_put(struct sfile * sf);

/**
 * Find the sfile for the current parameters. Note that is required
 * that the PC value be set appropriately (needed for kernel images)
 */
struct sfile * sfile_find(struct transient const * trans);

/** Log the sample in a previously located sfile. */
void sfile_log_sample(struct transient const * trans);

/** Log the event/cycle count in a previously located sfile */
void sfile_log_sample_count(struct transient const * trans,
                            unsigned long int count);

/** initialise hashes */
void sfile_init(void);

#endif /* OPD_SFILE_H */