Blame src/include/rlog.h

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *  (C) 2001 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#ifndef RLOG_H_INCLUDED
Packit 0848f5
#define RLOG_H_INCLUDED
Packit 0848f5
Packit 0848f5
#include <stdio.h>
Packit 0848f5
Packit 0848f5
#if defined(__cplusplus)
Packit 0848f5
extern "C" {
Packit 0848f5
#endif
Packit 0848f5
Packit 0848f5
/* definitions */
Packit 0848f5
#ifndef RLOG_BOOL
Packit 0848f5
#define RLOG_BOOL int
Packit 0848f5
#endif
Packit 0848f5
Packit 0848f5
#define RLOG_BUFFSIZE           (8*1024*1024)
Packit 0848f5
#define RLOG_MAX_RECORD_SIZE     1024
Packit 0848f5
#define RLOG_COLOR_LENGTH       (3 * sizeof(double))
Packit 0848f5
#define RLOG_DESCRIPTION_LENGTH (5 * sizeof(double))
Packit 0848f5
#define RLOG_MAX_DOUBLE         (1e100)
Packit 0848f5
#define RLOG_MIN_DOUBLE         (-1e100)
Packit 0848f5
Packit 0848f5
#define RLOG_SENDER   1
Packit 0848f5
#define RLOG_RECEIVER 0
Packit 0848f5
Packit 0848f5
#define RLOG_FIRST_EVENT_ID 1500
Packit 0848f5
#define RLOG_ARROW_EVENT_ID 1499
Packit 0848f5
Packit 0848f5
/* structures */
Packit 0848f5
Packit 0848f5
typedef enum RLOG_RECORD_TYPE
Packit 0848f5
{
Packit 0848f5
    RLOG_INVALID_TYPE = 0,
Packit 0848f5
    RLOG_ENDLOG_TYPE,
Packit 0848f5
    RLOG_EVENT_TYPE,
Packit 0848f5
    RLOG_ARROW_TYPE,
Packit 0848f5
    RLOG_IARROW_TYPE,
Packit 0848f5
    RLOG_STATE_TYPE,
Packit 0848f5
    RLOG_COMM_TYPE
Packit 0848f5
} RLOG_RECORD_TYPE;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_HEADER 
Packit 0848f5
{
Packit 0848f5
    RLOG_RECORD_TYPE type;
Packit 0848f5
    int length;
Packit 0848f5
} RLOG_HEADER;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_STATE
Packit 0848f5
{
Packit 0848f5
    int event;
Packit 0848f5
    int pad;
Packit 0848f5
    char color[RLOG_COLOR_LENGTH];
Packit 0848f5
    char description[RLOG_DESCRIPTION_LENGTH];
Packit 0848f5
} RLOG_STATE;
Packit 0848f5
Packit 0848f5
/* FIXME: RLOG should use the generic (and lighter weight) timestamp type,
Packit 0848f5
   not a double, for recording the timestamp bits.  This is an unnecessary
Packit 0848f5
   extra overhead that makes RLOG less appropriate for fine-grain logging */
Packit 0848f5
   
Packit 0848f5
typedef struct RLOG_EVENT
Packit 0848f5
{
Packit 0848f5
    int rank;
Packit 0848f5
    int event;
Packit 0848f5
    int pad;
Packit 0848f5
    int recursion;
Packit 0848f5
    double start_time;
Packit 0848f5
    double end_time;
Packit 0848f5
} RLOG_EVENT;
Packit 0848f5
Packit 0848f5
#define RLOG_ARROW_LEFT  1
Packit 0848f5
#define RLOG_ARROW_RIGHT 0
Packit 0848f5
Packit 0848f5
typedef struct RLOG_ARROW
Packit 0848f5
{
Packit 0848f5
    int src;
Packit 0848f5
    int dest;
Packit 0848f5
    int tag;
Packit 0848f5
    int length;
Packit 0848f5
    int leftright;
Packit 0848f5
    int pad;
Packit 0848f5
    double start_time;
Packit 0848f5
    double end_time;
Packit 0848f5
} RLOG_ARROW;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_IARROW
Packit 0848f5
{
Packit 0848f5
    int sendrecv;
Packit 0848f5
    int rank;
Packit 0848f5
    int remote;
Packit 0848f5
    int tag;
Packit 0848f5
    int length;
Packit 0848f5
    int pad;
Packit 0848f5
    double timestamp;
Packit 0848f5
} RLOG_IARROW;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_COMM
Packit 0848f5
{
Packit 0848f5
    int newcomm;
Packit 0848f5
    int rank;
Packit 0848f5
} RLOG_COMM;
Packit 0848f5
Packit 0848f5
#define RLOG_HEADER_SECTION         0
Packit 0848f5
#define RLOG_STATE_SECTION          1
Packit 0848f5
#define RLOG_ARROW_SECTION          2
Packit 0848f5
#define RLOG_EVENT_SECTION          3
Packit 0848f5
Packit 0848f5
typedef struct RLOG_FILE_HEADER
Packit 0848f5
{
Packit 0848f5
    int nMinRank, nMaxRank;
Packit 0848f5
} RLOG_FILE_HEADER;
Packit 0848f5
Packit 0848f5
typedef struct IRLOG_IOStruct
Packit 0848f5
{
Packit 0848f5
    FILE *f;
Packit 0848f5
    RLOG_HEADER header;
Packit 0848f5
    union RLOG_DATA
Packit 0848f5
    {
Packit 0848f5
	RLOG_STATE state;
Packit 0848f5
	RLOG_EVENT event;
Packit 0848f5
	RLOG_IARROW iarrow;
Packit 0848f5
	RLOG_COMM comm;
Packit 0848f5
    } record;
Packit 0848f5
    char *pCurHeader;
Packit 0848f5
    char *pNextHeader;
Packit 0848f5
    char *pEnd;
Packit 0848f5
    char buffer[RLOG_BUFFSIZE];
Packit 0848f5
} IRLOG_IOStruct;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_IOStruct
Packit 0848f5
{
Packit 0848f5
    FILE *f;
Packit 0848f5
    RLOG_FILE_HEADER header;
Packit 0848f5
    int nNumStates, nCurState;
Packit 0848f5
    long nStateOffset;
Packit 0848f5
    int nNumArrows, nCurArrow;
Packit 0848f5
    long nArrowOffset;
Packit 0848f5
    int nNumRanks;
Packit 0848f5
    int *pRank;
Packit 0848f5
    int *pNumEventRecursions;
Packit 0848f5
    int **ppNumEvents, **ppCurEvent;
Packit 0848f5
    int **ppCurGlobalEvent;
Packit 0848f5
    RLOG_EVENT **gppCurEvent, **gppPrevEvent, gCurEvent;
Packit 0848f5
    int gnCurRank, gnCurLevel, gnCurEvent;
Packit 0848f5
    long **ppEventOffset;
Packit 0848f5
} RLOG_IOStruct;
Packit 0848f5
Packit 0848f5
typedef struct RLOG_Struct
Packit 0848f5
{
Packit 0848f5
    int bLogging;
Packit 0848f5
    int nCurEventId;
Packit 0848f5
    char pszFileName[256];
Packit 0848f5
    int nRank;
Packit 0848f5
    int nSize;
Packit 0848f5
    int nRecursion;
Packit 0848f5
    double dFirstTimestamp;
Packit 0848f5
    RLOG_HEADER DiskHeader;
Packit 0848f5
    RLOG_EVENT DiskEvent;
Packit 0848f5
Packit 0848f5
    IRLOG_IOStruct *pOutput;
Packit 0848f5
} RLOG_Struct;
Packit 0848f5
Packit 0848f5
/* function prototypes */
Packit 0848f5
Packit 0848f5
/* logging functions */
Packit 0848f5
RLOG_Struct* RLOG_InitLog(int rank, int size);
Packit 0848f5
int RLOG_FinishLog(RLOG_Struct* pRLOG);
Packit 0848f5
/*void RLOG_LogEvent(RLOG_Struct *pRLOG, int event, double starttime, double endtime, int recursion);*/
Packit 0848f5
void RLOG_LogSend(RLOG_Struct* pRLOG, int dest, int tag, int size);
Packit 0848f5
void RLOG_LogRecv(RLOG_Struct* pRLOG, int src, int tag, int size);
Packit 0848f5
void RLOG_LogCommID(RLOG_Struct* pRLOG, int id);
Packit 0848f5
void RLOG_DescribeState(RLOG_Struct* pRLOG, int state, char *name, char *color);
Packit 0848f5
void RLOG_EnableLogging(RLOG_Struct* pRLOG);
Packit 0848f5
void RLOG_DisableLogging(RLOG_Struct* pRLOG);
Packit 0848f5
int RLOG_GetNextEventID(RLOG_Struct* pRLOG);
Packit 0848f5
void RLOG_SaveFirstTimestamp(RLOG_Struct* pRLOG);
Packit 0848f5
Packit 0848f5
/* irlog utility functions */
Packit 0848f5
IRLOG_IOStruct *IRLOG_CreateInputStruct(const char *filename);
Packit 0848f5
IRLOG_IOStruct *IRLOG_CreateOutputStruct(const char *filename);
Packit 0848f5
int IRLOG_GetNextRecord(IRLOG_IOStruct *pInput);
Packit 0848f5
int IRLOG_WriteRecord(RLOG_HEADER *pRecord, IRLOG_IOStruct *pOutput);
Packit 0848f5
int IRLOG_CloseInputStruct(IRLOG_IOStruct **ppInput);
Packit 0848f5
int IRLOG_CloseOutputStruct(IRLOG_IOStruct **ppOutput);
Packit 0848f5
Packit 0848f5
/* rlog utility functions */
Packit 0848f5
RLOG_IOStruct *RLOG_CreateInputStruct(const char *filename);
Packit 0848f5
int RLOG_CloseInputStruct(RLOG_IOStruct **ppInput);
Packit 0848f5
int RLOG_GetFileHeader(RLOG_IOStruct *pInput, RLOG_FILE_HEADER *pHeader);
Packit 0848f5
int RLOG_GetNumStates(RLOG_IOStruct *pInput);
Packit 0848f5
int RLOG_GetState(RLOG_IOStruct *pInput, int i, RLOG_STATE *pState);
Packit 0848f5
int RLOG_ResetStateIter(RLOG_IOStruct *pInput);
Packit 0848f5
int RLOG_GetNextState(RLOG_IOStruct *pInput, RLOG_STATE *pState);
Packit 0848f5
int RLOG_GetNumArrows(RLOG_IOStruct *pInput);
Packit 0848f5
int RLOG_GetArrow(RLOG_IOStruct *pInput, int i, RLOG_ARROW *pArrow);
Packit 0848f5
int RLOG_ResetArrowIter(RLOG_IOStruct *pInput);
Packit 0848f5
int RLOG_GetNextArrow(RLOG_IOStruct *pInput, RLOG_ARROW *pArrow);
Packit 0848f5
int RLOG_GetRankRange(RLOG_IOStruct *pInput, int *pMin, int *pMax);
Packit 0848f5
int RLOG_GetNumEventRecursions(RLOG_IOStruct *pInput, int rank);
Packit 0848f5
int RLOG_GetNumEvents(RLOG_IOStruct *pInput, int rank, int recursion_level);
Packit 0848f5
int RLOG_GetEvent(RLOG_IOStruct *pInput, int rank, int recursion_level, int index, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_ResetEventIter(RLOG_IOStruct *pInput, int rank, int recursion_level);
Packit 0848f5
int RLOG_GetNextEvent(RLOG_IOStruct *pInput, int rank, int recursion_level, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_FindEventBeforeTimestamp(RLOG_IOStruct *pInput, int rank, int recursion_level, double timestamp, RLOG_EVENT *pEvent, int *pIndex);
Packit 0848f5
int RLOG_FindAnyEventBeforeTimestamp(RLOG_IOStruct *pInput, int rank, double timestamp, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_ResetGlobalIter(RLOG_IOStruct *pInput);
Packit 0848f5
int RLOG_GetNextGlobalEvent(RLOG_IOStruct *pInput, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_GetPreviousGlobalEvent(RLOG_IOStruct *pInput, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_GetCurrentGlobalEvent(RLOG_IOStruct *pInput, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_FindGlobalEventBeforeTimestamp(RLOG_IOStruct *pInput, double timestamp, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_FindArrowBeforeTimestamp(RLOG_IOStruct *pInput, double timestamp, RLOG_ARROW *pArrow, int *pIndex);
Packit 0848f5
int RLOG_HitTest(RLOG_IOStruct *pInput, int rank, int level, double timestamp, RLOG_EVENT *pEvent);
Packit 0848f5
int RLOG_ModifyEvents(const char *log_filename, double *pOffsets, int num_offsets);
Packit 0848f5
Packit 0848f5
/* debugging functions */
Packit 0848f5
int RLOG_PrintGlobalState(RLOG_IOStruct *pInput);
Packit 0848f5
Packit 0848f5
/* macros */
Packit 0848f5
Packit 0848f5
#define RLOG_HEADER_CAST() ((RLOG_HEADER*)pRLOG->pOutput->pCurHeader)
Packit 0848f5
#define RLOG_EVENT_CAST()  ((RLOG_EVENT*)((char*)pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER)))
Packit 0848f5
Packit 0848f5
#define RLOG_LogEvent(pRLOG, event_param, starttime, endtime, recursion_param) \
Packit 0848f5
if (pRLOG->bLogging) \
Packit 0848f5
{ \
Packit 0848f5
    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT) > pRLOG->pOutput->pEnd) \
Packit 0848f5
    { \
Packit 0848f5
	WriteCurrentDataAndLogEvent(pRLOG, event_param, starttime, endtime, recursion_param); \
Packit 0848f5
    } \
Packit 0848f5
    else \
Packit 0848f5
    { \
Packit 0848f5
	RLOG_HEADER_CAST()->type = RLOG_EVENT_TYPE; \
Packit 0848f5
	RLOG_HEADER_CAST()->length = sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT); \
Packit 0848f5
	RLOG_EVENT_CAST()->rank = pRLOG->nRank; \
Packit 0848f5
	RLOG_EVENT_CAST()->end_time = endtime - pRLOG->dFirstTimestamp; \
Packit 0848f5
	RLOG_EVENT_CAST()->start_time = starttime - pRLOG->dFirstTimestamp; \
Packit 0848f5
	RLOG_EVENT_CAST()->event = event_param; \
Packit 0848f5
	RLOG_EVENT_CAST()->recursion = recursion_param; \
Packit 0848f5
	/* advance the current position pointer */ \
Packit 0848f5
	pRLOG->pOutput->pCurHeader += sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT); \
Packit 0848f5
    } \
Packit 0848f5
}
Packit 0848f5
Packit 0848f5
void WriteCurrentDataAndLogEvent(RLOG_Struct *pRLOG, int event, double starttime, double endtime, int recursion);
Packit 0848f5
Packit 0848f5
#if defined(__cplusplus)
Packit 0848f5
}
Packit 0848f5
#endif
Packit 0848f5
Packit 0848f5
#endif