📄 irlog2rlog.c
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* $Id: irlog2rlog.c,v 1.5 2002/11/11 13:50:50 gropp Exp $ * * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */#include "rlog.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#ifndef BOOL#define BOOL int#endif#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#define MAX_RANK 1024*1024typedef struct RLOG_State_list{ RLOG_STATE state; struct RLOG_State_list *next;} RLOG_State_list;typedef struct RecursionStruct{ char filename[1024]; int rank; int level; int num_events; FILE *fout; struct RecursionStruct *next;} RecursionStruct;typedef struct StartArrowStruct{ double start_time; int src, tag, length; struct StartArrowStruct *next;} StartArrowStruct;typedef struct EndArrowStruct{ int src, tag; double timestamp; struct EndArrowStruct *next;} EndArrowStruct;typedef struct ArrowNode{ int rank; StartArrowStruct *pStartList; EndArrowStruct *pEndList; struct ArrowNode *pNext;} ArrowNode;ArrowNode *g_pArrowList = NULL;RecursionStruct *g_pLevel = NULL;FILE *g_fArrow = NULL;char g_pszArrowFilename[1024];RLOG_State_list *g_pList = NULL;static int ReadFileData(char *pBuffer, int length, FILE *fin){ int num_read; while (length) { num_read = fread(pBuffer, 1, length, fin); if (num_read == -1) { printf("Error: fread failed - %s\n", strerror(errno)); return errno; } /*printf("fread(%d)", num_read);fflush(stdout);*/ length -= num_read; pBuffer += num_read; } return 0;}static int WriteFileData(const char *pBuffer, int length, FILE *fout){ int num_written; while (length) { num_written = fwrite(pBuffer, 1, length, fout); if (num_written == -1) { printf("Error: fwrite failed - %s\n", strerror(errno)); return errno; } /*printf("fwrite(%d)", num_written);fflush(stdout);*/ length -= num_written; pBuffer += num_written; } return 0;}ArrowNode *GetArrowNode(int rank){ ArrowNode *pNode = g_pArrowList; while (pNode) { if (pNode->rank == rank) return pNode; pNode = pNode->pNext; } pNode = (ArrowNode *)malloc(sizeof(ArrowNode)); pNode->pEndList = NULL; pNode->pStartList = NULL; pNode->rank = rank; pNode->pNext = g_pArrowList; g_pArrowList = pNode; return pNode;}EndArrowStruct *ExtractEndNode(ArrowNode *pNode, int src, int tag){ EndArrowStruct *pIter, *pRet; if (pNode->pEndList == NULL) return NULL; if ((pNode->pEndList->src == src) && (pNode->pEndList->tag == tag)) { pRet = pNode->pEndList; pNode->pEndList = pNode->pEndList->next; return pRet; } pIter = pNode->pEndList; while (pIter->next != NULL) { if ((pIter->next->src == src) && (pIter->next->tag == tag)) { pRet = pIter->next; pIter->next = pIter->next->next; return pRet; } pIter = pIter->next; } return NULL;}StartArrowStruct *ExtractStartNode(ArrowNode *pNode, int src, int tag){ StartArrowStruct *pIter, *pRet; if (pNode->pStartList == NULL) return NULL; if ((pNode->pStartList->src == src) && (pNode->pStartList->tag == tag)) { pRet = pNode->pStartList; pNode->pStartList = pNode->pStartList->next; return pRet; } pIter = pNode->pStartList; while (pIter->next != NULL) { if ((pIter->next->src == src) && (pIter->next->tag == tag)) { pRet = pIter->next; pIter->next = pIter->next->next; return pRet; } pIter = pIter->next; } return NULL;}void SaveArrow(RLOG_IARROW *pArrow){ ArrowNode *pNode; StartArrowStruct *pStart, *pStartIter; EndArrowStruct *pEnd, *pEndIter; RLOG_ARROW arrow; if (g_fArrow == NULL) { strcpy(g_pszArrowFilename, "ArrowFile.tmp"); g_fArrow = fopen(g_pszArrowFilename, "w+b"); if (g_fArrow == NULL) { printf("unable to open ArrowFile.tmp\n"); return; } } if (pArrow->sendrecv == RLOG_SENDER) { pNode = GetArrowNode(pArrow->remote); pEnd = ExtractEndNode(pNode, pArrow->rank, pArrow->tag); if (pEnd == NULL) { pStart = (StartArrowStruct *)malloc(sizeof(StartArrowStruct)); pStart->src = pArrow->rank; pStart->tag = pArrow->tag; pStart->length = pArrow->length; pStart->start_time = pArrow->timestamp; pStart->next = NULL; if (pNode->pStartList == NULL) { pNode->pStartList = pStart; } else { pStartIter = pNode->pStartList; while (pStartIter->next != NULL) pStartIter = pStartIter->next; pStartIter->next = pStart; } return; } arrow.src = pArrow->rank; arrow.dest = pArrow->remote; arrow.length = pArrow->length; arrow.start_time = pEnd->timestamp; arrow.end_time = pArrow->timestamp; arrow.tag = pArrow->tag; arrow.leftright = RLOG_ARROW_LEFT; fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow); free(pEnd); } else { arrow.dest = pArrow->rank; arrow.end_time = pArrow->timestamp; arrow.tag = pArrow->tag; arrow.length = pArrow->length; pNode = GetArrowNode(pArrow->rank); pStart = ExtractStartNode(pNode, pArrow->remote, pArrow->tag); if (pStart != NULL) { arrow.src = pStart->src; arrow.start_time = pStart->start_time; arrow.length = pStart->length; /* the sender length is more accurate than the receiver length */ arrow.leftright = RLOG_ARROW_RIGHT; free(pStart); fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow); } else { pEnd = (EndArrowStruct *)malloc(sizeof(EndArrowStruct)); pEnd->src = pArrow->remote; pEnd->tag = pArrow->tag; pEnd->timestamp = pArrow->timestamp; pEnd->next = NULL; if (pNode->pEndList == NULL) { pNode->pEndList = pEnd; } else { pEndIter = pNode->pEndList; while (pEndIter->next != NULL) pEndIter = pEndIter->next; pEndIter->next = pEnd; } } } /* fwrite(pArrow, sizeof(RLOG_IARROW), 1, g_fArrow); */}#ifdef FOOvoid SaveArrow(RLOG_IARROW *pArrow){ ArrowNode *pNode; StartArrowStruct *pStart, *pStartIter; EndArrowStruct *pEnd, *pEndIter; RLOG_ARROW arrow; long file_pos; if (g_fArrow == NULL) { strcpy(g_pszArrowFilename, "ArrowFile.tmp"); g_fArrow = fopen(g_pszArrowFilename, "w+b"); if (g_fArrow == NULL) { printf("unable to open ArrowFile.tmp\n"); return; } } if (pArrow->sendrecv == RLOG_SENDER) { pNode = GetArrowNode(pArrow->remote); pEnd = ExtractEndNode(pNode, pArrow->rank, pArrow->tag); if (pEnd == NULL) { pStart = (StartArrowStruct *)malloc(sizeof(StartArrowStruct)); pStart->src = pArrow->rank; pStart->tag = pArrow->tag; pStart->length = pArrow->length; pStart->start_time = pArrow->timestamp; pStart->next = NULL; if (pNode->pStartList == NULL) { pNode->pStartList = pStart; } else { pStartIter = pNode->pStartList; while (pStartIter->next != NULL) pStartIter = pStartIter->next; pStartIter->next = pStart; } return; } /* save the file position */ file_pos = ftell(g_fArrow); /* read the previously written arrow */ fseek(g_fArrow, pEnd->file_pos, SEEK_SET); fread(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow); arrow.src = pArrow->rank; arrow.length = pArrow->length; arrow.start_time = pArrow->timestamp; /* write the updated arrow back */ fseek(g_fArrow, pEnd->file_pos, SEEK_SET); fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow); /* return the the current position */ fseek(g_fArrow, file_pos, SEEK_SET); free(pEnd); } else { arrow.dest = pArrow->rank; arrow.end_time = pArrow->timestamp; arrow.tag = pArrow->tag; arrow.length = pArrow->length; pNode = GetArrowNode(pArrow->rank); pStart = ExtractStartNode(pNode, pArrow->remote, pArrow->tag); if (pStart != NULL) { arrow.src = pStart->src; arrow.start_time = pStart->start_time; arrow.length = pStart->length; /* the sender length is more accurate than the receiver length */ free(pStart); } else { arrow.src = -1; arrow.start_time = -1.0; pEnd = (EndArrowStruct *)malloc(sizeof(EndArrowStruct)); pEnd->src = pArrow->remote; pEnd->tag = pArrow->tag; pEnd->file_pos = ftell(g_fArrow); pEnd->next = NULL; if (pNode->pEndList == NULL) { pNode->pEndList = pEnd; } else { pEndIter = pNode->pEndList; while (pEndIter->next != NULL) pEndIter = pEndIter->next; pEndIter->next = pEnd; } } fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow); } /* fwrite(pArrow, sizeof(RLOG_IARROW), 1, g_fArrow); */}#endifRecursionStruct *GetLevel(int rank, int recursion){ RecursionStruct *pLevel; pLevel = g_pLevel; while (pLevel) { if (pLevel->level == recursion && pLevel->rank == rank) return pLevel; pLevel = pLevel->next; } pLevel = (RecursionStruct*)malloc(sizeof(RecursionStruct)); sprintf(pLevel->filename, "irlog.%d.%d.tmp", rank, recursion); pLevel->fout = fopen(pLevel->filename, "w+b"); pLevel->rank = rank; pLevel->level = recursion; pLevel->num_events = 0; pLevel->next = g_pLevel; g_pLevel = pLevel; return pLevel;}void SaveEvent(RLOG_EVENT *pEvent){ RecursionStruct *pLevel; pLevel = GetLevel(pEvent->rank, pEvent->recursion); pLevel->num_events++; fwrite(pEvent, sizeof(RLOG_EVENT), 1, pLevel->fout);}void SaveState(RLOG_STATE *pState){ RLOG_State_list *pIter; pIter = g_pList; while (pIter) { if (pIter->state.event == pState->event) { /* replace old with new */ memcpy(&pIter->state, pState, sizeof(RLOG_STATE)); return; } pIter = pIter->next; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -