/**
* @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 */