97 lines
3.5 KiB
C++
97 lines
3.5 KiB
C++
// debug.h
|
|
// Data structures for debugging routines.
|
|
//
|
|
// The debugging routines allow the user to turn on selected
|
|
// debugging messages, controllable from the command line arguments
|
|
// passed to Nachos (-d). You are encouraged to add your own
|
|
// debugging flags. Please....
|
|
//
|
|
// Copyright (c) 1992-1996 The Regents of the University of California.
|
|
// All rights reserved. See copyright.h for copyright notice and limitation
|
|
// of liability and disclaimer of warranty provisions.
|
|
|
|
#ifndef DEBUG_H
|
|
#define DEBUG_H
|
|
|
|
#include "copyright.h"
|
|
#include "utility.h"
|
|
#include "sysdep.h"
|
|
|
|
// The pre-defined debugging flags are:
|
|
|
|
const char dbgAll = '+'; // turn on all debug messages
|
|
const char dbgThread = 't'; // threads
|
|
const char dbgSynch = 's'; // locks, semaphores, condition vars
|
|
const char dbgInt = 'i'; // interrupt emulation
|
|
const char dbgMach = 'm'; // machine emulation
|
|
const char dbgDisk = 'd'; // disk emulation
|
|
const char dbgFile = 'f'; // file system
|
|
const char dbgAddr = 'a'; // address spaces
|
|
const char dbgNet = 'n'; // network emulation
|
|
const char dbgSys = 'u'; // systemcall
|
|
|
|
class Debug {
|
|
public:
|
|
Debug(char *flagList);
|
|
|
|
bool IsEnabled(char flag);
|
|
|
|
private:
|
|
char *enableFlags; // controls which DEBUG messages are printed
|
|
};
|
|
|
|
extern Debug *debug;
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// DEBUG
|
|
// If flag is enabled, print a message.
|
|
//----------------------------------------------------------------------
|
|
#define DEBUG(flag,expr) \
|
|
if (!debug->IsEnabled(flag)) {} else { \
|
|
cerr << expr << "\n"; \
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
|
// ASSERT
|
|
// If condition is false, print a message and dump core.
|
|
// Useful for documenting assumptions in the code.
|
|
//
|
|
// NOTE: needs to be a #define, to be able to print the location
|
|
// where the error occurred.
|
|
//----------------------------------------------------------------------
|
|
#define ASSERT(condition) \
|
|
if (condition) {} else { \
|
|
cerr << "Assertion failed: line " << __LINE__ << " file " << __FILE__ << "\n"; \
|
|
Abort(); \
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// ASSERTNOTREACHED
|
|
// Print a message and dump core (equivalent to ASSERT(FALSE) without
|
|
// making the compiler whine). Useful for documenting when
|
|
// code should not be reached.
|
|
//
|
|
// NOTE: needs to be a #define, to be able to print the location
|
|
// where the error occurred.
|
|
//----------------------------------------------------------------------
|
|
|
|
#define ASSERTNOTREACHED() \
|
|
{ \
|
|
cerr << "Assertion failed: line " << __LINE__ << " file " << __FILE__ << "\n"; \
|
|
Abort(); \
|
|
}
|
|
|
|
//----------------------------------------------------------------------
|
|
// ASSERTUNIMPLEMENTED
|
|
// Print a message that unimplemented code is executed and dump core
|
|
//----------------------------------------------------------------------
|
|
#define UNIMPLEMENTED() \
|
|
{ \
|
|
cerr << "Reached UNIMPLEMENTED function " << __FUNCTION__ << " in file: " \
|
|
<< __FILE__ << " line: " << __LINE__ << ".\n"; \
|
|
}
|
|
|
|
#endif // DEBUG_H
|