mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
9.7 KiB
259 lines
9.7 KiB
/*[
|
|
*************************************************************************
|
|
|
|
Name: profile.h
|
|
Author: Simon Frost
|
|
Created: September 1993
|
|
Derived from: Original
|
|
Sccs ID: @(#)profile.h 1.9 01/31/95
|
|
Purpose: Include file for the Profiling system & Interfaces
|
|
|
|
(c)Copyright Insignia Solutions Ltd., 1993. All rights reserved.
|
|
|
|
*************************************************************************
|
|
]*/
|
|
|
|
/* ------------------- Data Structures & Types -------------------- */
|
|
typedef ISM32 EOIHANDLE;
|
|
typedef ISM32 SOIHANDLE;
|
|
|
|
/*
|
|
* Two IUHs to allow for variety of host timestamp data. May be secs/usecs
|
|
* or large integer or whatever is appropriate.
|
|
*/
|
|
typedef struct {
|
|
IUH data[2];
|
|
} PROF_TIMESTAMP, *PROF_TIMEPTR;
|
|
|
|
typedef struct {
|
|
IUH eoiHandle;
|
|
PROF_TIMESTAMP timestamp;
|
|
IUH arg;
|
|
} EOI_BUFFER_FORMAT;
|
|
|
|
typedef struct eoinode EOINODE, *EOINODE_PTR; /* forward decln */
|
|
typedef struct eoiarg EOIARG, *EOIARG_PTR; /* ditto */
|
|
typedef struct graphlist GRAPHLIST, *GRAPHLIST_PTR; /* ditto */
|
|
|
|
/* Active SOIs (Sequences Of Interest) stored in list of these nodes */
|
|
typedef struct soinode {
|
|
|
|
SOIHANDLE handle; /* SOI identifier */
|
|
EOIHANDLE startEOI; /* EOI of start event */
|
|
EOIHANDLE endEOI; /* EOI of end event */
|
|
EOIARG_PTR startArg; /* extra level graphing - start arg */
|
|
EOIARG_PTR endArg; /* extra level graphing - end arg */
|
|
IUM32 startCount; /* # of times start EOI occured */
|
|
IUM32 endCount; /* # of times end EOI occured */
|
|
PROF_TIMESTAMP soistart; /* timestamp of SOI start */
|
|
struct soinode *next; /* pointer to next SOI */
|
|
IU8 flags; /* flags for this SOI */
|
|
DOUBLE time; /* usecs spent in SOI - daft times ignored */
|
|
DOUBLE maxtime; /* longest valid elapsed time */
|
|
DOUBLE mintime; /* shortest elapsed time */
|
|
DOUBLE bigmax; /* longest invalid time */
|
|
DOUBLE bigtime; /* total contributed by daft times */
|
|
IUM32 discardCount; /* # of discarded times */
|
|
|
|
} SOINODE, *SOINODE_PTR;
|
|
|
|
#define SOIPTRNULL (SOINODE_PTR)0
|
|
|
|
/* Active Events linked to Active SOIs by pointers to SOI structures */
|
|
typedef struct soilist {
|
|
|
|
SOINODE_PTR soiLink; /* SOI that this event starts/ends */
|
|
struct soilist *next; /* next active SOI */
|
|
|
|
} SOILIST, *SOILIST_PTR;
|
|
|
|
#define SLISTNULL (SOILIST_PTR)0
|
|
|
|
/* Events which contain arguments hold them in sorted list of these nodes */
|
|
struct eoiarg {
|
|
|
|
struct eoiarg *next; /* pointer to next argument value */
|
|
struct eoiarg *back; /* previous argument node */
|
|
IUM32 count; /* how many events have had this value */
|
|
IUM32 value; /* event argument this node represents */
|
|
SOILIST_PTR startsoi; /* SOIs which this arg starts if auto SOI */
|
|
SOILIST_PTR endsoi; /* SOIs which this arg ends if auto SOI */
|
|
GRAPHLIST_PTR graph; /* pointer into graph list for this node */
|
|
|
|
};
|
|
|
|
#define ARGPTRNULL (EOIARG_PTR)0
|
|
|
|
/*
|
|
* This structure is used to form the list used in EOI graphing.
|
|
* It gives two links for 'free' and then goes off down a chain of more
|
|
* succession links. (This gives loops & if's in one struct).
|
|
* Pointers to these nodes can be found in EOI nodes and EOI argument nodes.
|
|
*/
|
|
struct graphlist {
|
|
struct graphlist *next; /* list connecting pointer -not graph related */
|
|
EOINODE_PTR graphEOI; /* EOI for graph node */
|
|
EOIARG_PTR graphArg; /* EOI argument if relevant */
|
|
IUM32 numpred; /* how many predecessors */
|
|
IUM32 numsucc; /* how many succecessors */
|
|
struct graphlist *succ1; /* pointer to first successor */
|
|
IUM32 succ1Count; /* # of times first successor found */
|
|
struct graphlist *succ2; /* pointer to second successor */
|
|
IUM32 succ2Count; /* # of times second successor found */
|
|
struct graphlist *extra; /* if two successors not enuf look here */
|
|
ISM32 indent; /* for report printing */
|
|
IU8 state; /* flags for node state */
|
|
};
|
|
|
|
/* defines for graph state (bits) on reporting */
|
|
#define GR_SUCC1_TROD 1
|
|
#define GR_SUCC2_TROD 2
|
|
#define GR_TRAMPLED (GR_SUCC1_TROD|GR_SUCC2_TROD)
|
|
#define GR_PRINTED 4
|
|
|
|
#define GRAPHPTRNULL (GRAPHLIST_PTR)0
|
|
|
|
/*
|
|
* If a SOI is registered at the arg level & collects sequences between 'same valued'
|
|
* args, the endEOI of the pair must be available from the start EOI. The start EOI
|
|
* contains a pointer to a list in the following format.
|
|
*/
|
|
struct soiargends {
|
|
EOIHANDLE endEOI;
|
|
struct soiargends *next;
|
|
};
|
|
|
|
typedef struct soiargends SOIARGENDS, *SOIARGENDS_PTR;
|
|
|
|
#define SOIARGENDNULL (SOIARGENDS_PTR)0
|
|
|
|
/*
|
|
* Active Events registered for profiling run are stored in list(s) of these
|
|
* nodes.
|
|
*/
|
|
struct eoinode {
|
|
|
|
struct eoinode *next; /* pointer to next event */
|
|
struct eoinode *back; /* pointer to previous event */
|
|
IUM32 count; /* # of times EOI occured */
|
|
EOIHANDLE handle; /* EOI identifier */
|
|
CHAR *tag; /* 'real world' identifier */
|
|
EOIARG_PTR args; /* list of arguments to event (may be null) */
|
|
EOIARG_PTR lastArg; /* last argument node accessed */
|
|
PROF_TIMESTAMP timestamp; /* time of last EOI (usec) */
|
|
SOILIST_PTR startsoi; /* SOI pointers which this event starts */
|
|
SOILIST_PTR endsoi; /* SOI pointers which this event ends */
|
|
GRAPHLIST_PTR graph; /* pointer to graph list for this node */
|
|
SOIARGENDS_PTR argsoiends; /* arg level 'same value' end list */
|
|
IU16 flags; /* characteristics of this EOI */
|
|
|
|
};
|
|
|
|
#define EOIPTRNULL (EOINODE_PTR)0
|
|
|
|
/*
|
|
* This structure mirrors the initial elements of those lists we may
|
|
* want to sort into 'popularity' order (based on the 'count' element).
|
|
* This is intended to reduce search times for common elements
|
|
*/
|
|
typedef struct sortlist {
|
|
struct sortlist *next; /* pointer to next element */
|
|
struct sortlist *back; /* pointer to previous element */
|
|
IUM32 count; /* # of times element occured */
|
|
} *SORTSTRUCT, **SORTSTRUCT_PTR;
|
|
|
|
/* New SOI flags */
|
|
#define SOI_DEFAULTS 0 /* No flags - default settings */
|
|
#define SOI_AUTOSOI 0x20 /* SOI generated by AUTOSOI */
|
|
#define SOI_FROMARG 0x40 /* SOI generated by arg level connection */
|
|
|
|
/* New EOI 'capability' flags */
|
|
#define EOI_DEFAULTS 0 /* No flags - default settings */
|
|
#define EOI_DISABLED 1 /* Delay EIO until enable call. */
|
|
#define EOI_KEEP_GRAPH 2 /* Track Predecessors for graphing */
|
|
#define EOI_KEEP_ARGS 4 /* Keep & count arguments passed */
|
|
#define EOI_ENABLE_ALL 8 /* Trigger enable of all EOIs */
|
|
#define EOI_DISABLE_ALL 0x10 /* Trigger disable of all EOIs */
|
|
#define EOI_AUTOSOI 0x20 /* Make SOIs automatically out of like EOIs */
|
|
#define EOI_HOSTHOOK 0x40 /* Hook out to host profiling system */
|
|
#define EOI_NOTIME 0x80 /* No timestamps needed (not in SOI) */
|
|
|
|
/* The above get used in the EOI node flag element. This also contains
|
|
* extra info as specified below.
|
|
*/
|
|
#define EOI_HAS_SOI 0x100 /* some SOI associated with this EOI */
|
|
#define EOI_NEW_ARGS_START_SOI 0x200 /* arg level soi with 'same value' ends */
|
|
|
|
/* Mask used to clear new eoi flags for enable table */
|
|
#define ENABLE_MASK (EOI_DISABLED|EOI_ENABLE_ALL|EOI_DISABLE_ALL|EOI_HOSTHOOK)
|
|
|
|
/* ---------------------- Interfaces -------------------------- */
|
|
extern IBOOL Profiling_enabled; /* conventional profiling Disabled? */
|
|
|
|
extern EOIHANDLE NewEOI IPT2(CHAR *, tag, IU8, flags);
|
|
|
|
extern void SetEOIAsHostTrigger IPT1(EOIHANDLE, handle);
|
|
extern void ClearEOIAsHostTrigger IPT1(EOIHANDLE, handle);
|
|
extern void SetEOIAutoSOI IPT1(EOIHANDLE, handle);
|
|
extern void ClearEOIAutoSOI IPT1(EOIHANDLE, handle);
|
|
extern void EnableEOI IPT1(EOIHANDLE, handle);
|
|
extern void EnableAllEOIs IPT0();
|
|
extern void DisableEOI IPT1(EOIHANDLE, handle);
|
|
extern void DisableAllEOIs IPT0();
|
|
extern void ResetEOI IPT1(EOIHANDLE, handle);
|
|
extern void ResetAllEOIs IPT0();
|
|
extern void ResetAllSOIs IPT0();
|
|
|
|
extern void AtEOIPoint IPT1(EOIHANDLE, handle);
|
|
extern void AtEOIPointArg IPT2(EOIHANDLE, handle, IUH, arg);
|
|
|
|
extern CHAR *GetEOIName IPT1(EOIHANDLE, handle);
|
|
|
|
extern SOIHANDLE AssociateAsSOI IPT2(EOIHANDLE, start, EOIHANDLE, end);
|
|
extern SOIHANDLE AssociateAsArgSOI IPT5(EOIHANDLE, start, EOIHANDLE, end,
|
|
IUM32, startArg, IUM32, endArg, IBOOL, sameArgs);
|
|
|
|
extern void GenerateAllProfileInfo IPT1(FILE *, stream);
|
|
extern void CollateFrequencyList IPT2(FILE *, stream, IBOOL, reportstyle);
|
|
extern void CollateSequenceGraph IPT1(FILE *, stream);
|
|
extern void SummariseEvent IPT2(FILE *, stream, EOIHANDLE, handle);
|
|
extern void SummariseSequence IPT2(FILE *, stream, SOIHANDLE, handle);
|
|
extern void SummariseAllSequences IPT1(FILE *, stream);
|
|
extern void OrderedSequencePrint IPT3(SOIHANDLE, startEOI, SOIHANDLE, endEOI, FILE *, stream);
|
|
extern void dump_profile IPT0();
|
|
extern void reset_profile IPT0();
|
|
|
|
/* support fns for Frag Profiling */
|
|
extern void EnableFragProf IPT0();
|
|
extern void DisableFragProf IPT0();
|
|
extern void DumpFragProfData IPT0();
|
|
|
|
|
|
extern void ProcessProfBuffer IFN0();
|
|
extern void ProfileInit IFN0();
|
|
|
|
extern EOI_BUFFER_FORMAT **GdpProfileInit IPT3 (EOI_BUFFER_FORMAT, *rawDataBuf,
|
|
EOI_BUFFER_FORMAT, *endRawData,
|
|
IU8, *enable);
|
|
extern EOI_BUFFER_FORMAT **GdpProfileUpdate IPT2 (EOI_BUFFER_FORMAT, *rawDataBuf, IU8, *enable);
|
|
|
|
|
|
/* Declns for host i/f */
|
|
#ifdef NTVDM
|
|
extern void HostEnterProfCritSec IPT0();
|
|
extern void HostLeaveProfCritSec IPT0();
|
|
#else
|
|
#define HostEnterProfCritSec() /* Nothing */
|
|
#define HostLeaveProfCritSec() /* Nothing */
|
|
#endif
|
|
extern PROF_TIMEPTR HostTimestampDiff IPT2(PROF_TIMEPTR, tbegin, PROF_TIMEPTR, tend);
|
|
extern void HostAddTimestamps IPT2(PROF_TIMEPTR, tbase, PROF_TIMEPTR, taddn);
|
|
extern void HostSlipTimestamp IPT2(PROF_TIMEPTR, tbase, PROF_TIMEPTR, tdelta);
|
|
extern void HostWriteTimestamp IPT1(PROF_TIMEPTR, addr);
|
|
extern void HostPrintTimestamp IPT2(FILE *, stream, PROF_TIMEPTR, stamp);
|
|
extern char *HostProfInitName IPT0();
|
|
extern void HostProfHook IPT0();
|
|
extern void HostProfArgHook IPT1(IUH, arg);
|
|
extern double HostProfUSecs IPT1(PROF_TIMEPTR, stamp);
|
|
extern IU32 HostGetClocksPerSec IPT0();
|
|
extern IU32 HostGetProfsPerSec IPT0();
|