⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sim_error.c

📁 一个用在mips体系结构中的操作系统
💻 C
字号:
/* * Copyright (C) 1996-1998 by the Board of Trustees *    of Leland Stanford Junior University. *  * This file is part of the SimOS distribution.  * See LICENSE file for terms of the license.  * *//***************************************************************** * error.c * * Error handling routines * * Author: $Author: bosch $ * Date:   $Date: 1998/02/10 00:28:38 $ *****************************************************************/#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#include <unistd.h>#include "sim_error.h"#include "cpu_interface.h"#include "tcl_init.h"FILE *cpulogF = 0;int loopOnError = 1;int CPUErrorLoop = 1;int SimErrorKeepLogs = 0; /* PZ */void SimErrorInit(char *log_file){  char filename[256];  ASSERT( !cpulogF );  if( SimErrorKeepLogs && (access(log_file,F_OK)==0) ) {    int CPnum;    for (CPnum = 1; ; CPnum++) {       sprintf(filename, "%s.%03i", log_file, CPnum);      if (access(filename, F_OK) == 0) {	if (CPnum > 999) { CPUError("Too many opened log files"); }	continue;      }      if( rename(log_file, filename) ) {         perror("Rename log file error");      } else {	/* renamed file */      }      break;    }  }  cpulogF = fopen(log_file,"w");  if (cpulogF == NULL) {    sprintf(filename, "fopen of %s", log_file);    perror(filename);    exit(1);  }}void CPUError(char* string, ...){  va_list ap;  char llstring[1024];  SubstituteLLx(llstring, string, 1024);  va_start(ap, string);  fprintf(stderr, "\nERROR, pid=%i :",(int)getpid());  vfprintf(stderr, llstring, ap);  va_end(ap);  fprintf(stderr, "\n");  fprintf(stderr, "\r");  if (!CPUVec.CycleCount || CPUVec.CycleCount(0)==0) {     loopOnError = 0;  }  if (loopOnError) {     while (CPUErrorLoop) {#ifdef sgi        sginap(20);#else        sleep(1);#endif       }  } else {     exit(-1);  }}void Sim_Error(char* string, ...){   fprintf(stderr,"Sim_Error called. Please replace with CPUError!!! \n");   fprintf(stderr, "\nERROR, pid=%i :",(int)getpid());  if (loopOnError) {     while (CPUErrorLoop) {#ifdef sgi        sginap(20);#else        sleep(1);#endif       }  } else {     exit(-1);  }}   void CPUWarning( char *text,...){  va_list ap;  char lltext[1024];  va_start(ap,text);  SubstituteLLx(lltext, text, 1024);  vfprintf(stderr, lltext, ap);  vCPUPrint(lltext, ap);  fprintf(stderr, "\r");  fflush(stderr);  va_end(ap);}void Sim_Warning( char *text,...){  va_list ap;  char lltext[1024];  va_start(ap,text);  SubstituteLLx(lltext, text, 1024);  vfprintf(stderr, lltext, ap);  vCPUPrint(lltext, ap);  fprintf(stderr, "\r");  fflush(stderr);  va_end(ap);}/***************************************************************** * Don't print anything using CPUPrint or CPUWarning here or you can * end up stepping on yourself by opening the cpu log twice.  *****************************************************************/void vCPUPrint(char *text, va_list ap){#ifdef __alpha   char out[1024];   SubstituteLLx(out,text,1024);   ASSERT(cpulogF);   vfprintf(cpulogF,out,ap);   fflush(cpulogF);#else   ASSERT(cpulogF);   vfprintf(cpulogF,text,ap);   fflush(cpulogF);#endif}void CPUPrint( char *text,...){  va_list ap;  va_start(ap,text);  vCPUPrint(text,ap);  va_end(ap);}void CPUPrintFlush(void){   if( cpulogF ) {      fflush(cpulogF);   }}void CPUPut(char* string, ...){  va_list ap;  char llstring[1024];    va_start(ap, string);  SubstituteLLx(llstring, string, 1024);  vfprintf(stderr, llstring, ap);  va_end(ap);  fprintf(stderr, "\r");  fflush(stderr);}void lCPUPut(char* string, ...){  va_list ap;    va_start(ap, string);  vCPUPrint(string, ap);  va_end(ap);}/* * Debugging help */void CPU_nop(void){   /* nop */}void CPURestartLog(void){   cpulogF = NULL;   CPUPrint(" Restarting Log  PID=%i \n", getpid());}/***************************************************************** * DEBUGGING SUPPORT * Taken from Nachos' utility.cc *****************************************************************//***************************************************************** * Use Tcl to print more detail to the log... including process ID  ****************************************************************/void LogEntry(char *symbol, int cpuNum, char *text,...){    va_list ap;    SimTime x=0;    char cpuName[32];    char *pid, *proc;    sprintf(cpuName,"%d",cpuNum);        pid = Tcl_GetVar2(TCLInterp,"PID",cpuName,0);    proc = Tcl_GetVar2(TCLInterp,"PROCESS",cpuName,0);    if (!pid)  { pid = "-1";}    if (!proc) { proc = "NONAME";}    if (CPUVec.CycleCount) {        x = CPUVec.CycleCount(cpuNum);    }    CPUPrint("LOG %lld\t%-12s\tcpu=%i\t%s-%s\t ",             (uint64)x,             symbol,             cpuNum,             pid, proc);    va_start(ap,text);    vCPUPrint(text,ap);    va_end(ap);}     /**************************************************************** * DebugInit * Initialize so that only DEBUG messages with a flag in flagList  * will be printed. If the flag is "+", we enable all DEBUG messages. *****************************************************************/static char *enableFlags = NULL; voidDebugInit(char *flagList){    enableFlags = flagList;}/***************************************************************** * DebugIsEnabled * Return TRUE if DEBUG messages with "flag" are to be printed. ****************************************************************/static boolDebugIsEnabled(char flag){   if (enableFlags != NULL) {      return (strchr(enableFlags, flag) != 0) || (strchr(enableFlags, '+') != 0);   } else {      return FALSE;   }}/***************************************************************** * Debug * Print a debug message, if flag is enabled.  Like printf, * only with an extra argument on the front. ****************************************************************/void Debug(char flag, char *format, ...){   if (DebugIsEnabled(flag)) {      char llformat[1024];      va_list ap;      va_start(ap, format);      SubstituteLLx(llformat,format,1024);      /* Make this go to stderr also...  */      vfprintf(stderr, llformat, ap);      vCPUPrint(llformat, ap);      fprintf(stderr, "\r");      fflush(stderr);      va_end(ap);   }}/***************************************************************** * DebugDetail * Print a detailed debug message, if flag is enabled.  Like printf, * only with an extra argument on the front. ****************************************************************/voidDebugDetail(char flag, char *symbol, int cpuNum, char *text,...){   if (DebugIsEnabled(flag)) {      va_list ap;      SimTime x=0;      char cpuName[32];      char *pid, *proc;          sprintf(cpuName,"%d",cpuNum);          pid = Tcl_GetVar2(TCLInterp,"PID",cpuName,0);      proc = Tcl_GetVar2(TCLInterp,"PROCESS",cpuName,0);      if (!pid)  { pid = "-1";}      if (!proc) { proc = "NONAME";}            if (CPUVec.CycleCount) {          x = CPUVec.CycleCount(cpuNum);      }      CPUPrint("LOG %lld\t%-12s\tcpu=%i\t%s-%s\t ",               (uint64)x,               symbol,               cpuNum,               pid, proc);            va_start(ap,text);      vCPUPrint(text,ap);      va_end(ap);   } }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -