grunwald@foobar.colorado.edu (Dirk Grunwald) (10/20/89)
this is on a decstation-3100 using g++ from 10/17. The file attached to the end of this mail contains an error mainfested when running a more elaborate program. I haven't been able to narrow it down yet. Class SingleSimMux is a subclass of SimulationMultiplexor and SingleCpuMux, which is a subclass of CpuMultiplexor. name() is a member function in CpuMultiplexor; it returns a pointer to the ``current name'' of the SingleSimMux. In SingleSimMux::SingleSimMux, I initialize the name (built using pNameTemplate, nameSpace finally pName), print it out as it gets assigned to different variables and then print it out as name(). name() should simply return pName, but as the following output shows, pName & name() return different values. [foobar-134] main foo Constructed name is [SingleSimMux-0] ** printed from nameSpace, the actual array after pName, it's [SingleSimMux-0] ** printed via nameSpace again and pname is [SingleSimMux-0] ** printed via pName and name() is imMux-0] ** printed via Name -- note that this is 8 characters == 2 words misaligned. imMux-0] enter allocateLocalEventStructures Create recv(0) add recv(0) to cpu imMux-0] enter SingleSimMux::add Create recv(1) add recv(1) to cpu imMux-0] enter SingleSimMux::add create and add send imMux-0] enter SingleSimMux::add call fireitup imMux-0] enter warmThePot imMux-0] enter SingleSimMux::stirItAround Segmentation fault # 1 "../Src/SingleSimMux.cc" # 1 "../Src/SingleSimMux.h" 1 #pragma once # 1 "../Src/SimulationMultiplexor.h" 1 #pragma once # 1 "../Src/CpuMultiplexor.h" 1 #pragma once # 1 "./AwesimeConfig.h" 1 #pragma once # 11 "../Src/CpuMultiplexor.h" 2 # 1 "./HardwareContext.h" 1 #pragma once # 1 "/usr/local/Gnu/lib/g++-include/stream.h" 1 #pragma once # 1 "/usr/local/Gnu/lib/g++-include/File.h" 1 #pragma once # 1 "/usr/local/Gnu/lib/g++-include/builtin.h" 1 #pragma once typedef void (*one_arg_error_handler_t)(const char*); typedef void (*two_arg_error_handler_t)(const char*, const char*); # 1 "/usr/local/Gnu/lib/g++-include/stddef.h" 1 #pragma once typedef unsigned char wchar_t; # 40 "/usr/local/Gnu/lib/g++-include/builtin.h" 2 # 1 "/usr/local/Gnu/lib/g++-include/std.h" 1 #pragma once extern "C" { void volatile _exit(int); void volatile abort(void); int access(const char*, int); int acct(const char*); unsigned alarm(unsigned); double atof(const char*); int atoi(const char*); long atol(const char*); int bcmp(const void*, const void*, int); void bcopy(const void*, void*, int); int bind(int, void*, int); int brk(void*); int bsearch (const void *, const void *, unsigned long, unsigned long, auto int (*ptf)(const void*, const void*)); void bzero(void*, int); void* calloc(unsigned, unsigned); void cfree(void*); int chdir(const char*); int chmod(const char*, int); int chown(const char*, int, int); long clock(void); int close(int); int creat(const char*, unsigned long int); char* crypt(const char*, const char*); char* ctermid(char*); char* cuserid(char*); double drand48(void); int dup(int); int dup2(int, int); int dysize(int); char* ecvt(double, int, int*, int*); char* encrypt(char*, int); double erand(short*); int execl(const char*, const char *, ...); int execle(const char*, const char *, ...); int execlp(const char*, const char*, ...); int exect(const char*, const char**, char**); int execv(const char*, const char**); int execve(const char*, const char**, char**); int execvp(const char*, const char**); void volatile exit(int); int fchmod(int, int); int fchown(int, int, int); int fcntl(int, int, ...); char* fcvt(double, int, int*, int*); int ffs(int); int flock(int, int); int fork(void); void free(void*); int fsync(int); long ftok(const char*, int); int ftruncate(int, unsigned long); char* gcvt(double, int, char*); char* getcwd(char*, int); int getdomainname(char*, int); int getdtablesize(void); int getegid(void); char* getenv(const char*); int geteuid(void); int getgid(void); int getgroups(int, int*); long gethostid(void); int gethostname(char*, int); char* getlogin(void); int getopt(int, char**, char*); int getpagesize(void); char* getpass(const char*); int getpgrp(void); int getpid(void); int getppid(void); int getpriority(int, int); int getpw(int, char*); unsigned getuid(void); char* getwd(char*); char* index(const char*, int); char* initstate(unsigned, char*, int); int ioctl(int, int, char*); int isatty(int); long jrand48(short*); int kill(int, int); int killpg(int, int); void lcong48(short*); int link(const char*, const char*); int listen(int, int); int lock(int, int, long); long lrand48(void); long lseek(int, long, int); void* malloc(unsigned); void* memalign(unsigned, unsigned); void* memccpy(void*, const void*, int, int); void* memchr(const void*, int, int); int memcmp(const void*, const void*, int); void* memcpy(void*, const void*, int); void* memset(void*, int, int); int mkdir(const char*, int); int mknod(const char*, int, int); int mkstemp(char*); char* mktemp(char*); long mrand48(void); int nice(int); long nrand48(short*); int open(const char*, int, ...); void pause(void); void perror(const char*); int pipe(int*); void profil(char*, int, int, int); int psignal(unsigned, char*); int ptrace(int, int, int, int); int putenv(const char*); int qsort(void*, int, unsigned, auto (*ptf)(void*,void*)); int rand(void); long random(void); int read(int, void*, unsigned); int readlink(const char*, char*, int); void* realloc(void*, unsigned); int rename(const char*, const char*); char* rindex(const char*, int); int rmdir(const char*); void* sbrk(int); short* seed48(short*); int send(int, char*, int, int); int setgid(int); int sethostname(char*, int); int setkey(const char*); int setpgrp(int, int); int setpriority(int, int, int); int setregid(int, int); int setreuid(int, int); char* setstate(char*); int setuid(int); int sigblock(int); int siginterrupt(int, int); int sigpause(int); int sigsetmask(int); unsigned sleep(unsigned); int socket(int, int, int); int srand(int); void srand48(long); void srandom(int); int stime(long*); char* strcat(char*, const char*); char* strchr(const char*, int); int strcmp(const char*, const char*); char* strcpy(char*, const char*); int strcspn(const char*, const char*); char* strdup(const char*); int strlen(const char*); char* strncat(char*, const char*, int); int strncmp(const char*, const char*, int); char* strncpy(char*, const char*, int); char* strpbrk(const char*, const char*); char* strrchr(const char*, int); int strspn(const char*, const char*); double strtod(const char*, char**); char* strtok(char*, const char*); long strtol(const char*, char**, int); void swab(void*, void*, int); int symlink(const char*, const char*); int syscall(int, ...); int system(const char*); char* tempnam(char*, char*); int tgetent(char*, char*); int tgetnum(char*); int tgetflag(char*); char* tgetstr(char *, char **); char* tgoto(char*, int, int); long time(long*); char* tmpnam(char*); int tputs(char *, int, auto int (*)()); int truncate(const char*, unsigned long); char* ttyname(int); int ttyslot(void); unsigned ualarm(unsigned, unsigned); long ulimit(int, long); int umask(int); int unlink(const char*); unsigned usleep(unsigned); int vadvise(int); void* valloc(unsigned); int vfork(void); int vhangup(void); int wait(int*); int write(int, const void*, unsigned); } extern char** environ; extern volatile int errno; extern char* sys_errlist[]; extern int sys_nerr; extern char* optarg; extern int opterr; extern int optind; extern "C" void* alloca(unsigned long); # 41 "/usr/local/Gnu/lib/g++-include/builtin.h" 2 # 1 "/usr/local/Gnu/lib/g++-include/math.h" 1 #pragma once # 57 "/usr/local/Gnu/lib/g++-include/math.h" extern "C" { double acos(double); double acosh(double); double asin(double); double asinh(double); double atan(double); double atan2(double, double); double atanh(double); double cbrt(double); double ceil(double); double copysign(double,double); double cos(double); double cosh(double); double drem(double,double); double erf(double); double erfc(double); double exp(double); double expm1(double); double fabs(double); double finite(double); double floor(double); double frexp(double, int*); double gamma(double); double hypot(double,double); double infnan(int); int isinf(double); int isnan(double); double j0(double); double j1(double); double jn(int, double); double ldexp(double, int); double lgamma(double); double log(double); double log10(double); double log1p(double); double logb(double); double modf(double, double*); double pow(double, double); double rint(double); double scalb(double, int); double sin(double); double sinh(double); double sqrt(double); double tan(double); double tanh(double); double y0(double); double y1(double); double yn(int, double); } struct libm_exception { int type; char* name; double arg1, arg2, retval; }; extern "C" int matherr(libm_exception*); # 1 "/usr/local/Gnu/lib/g++-include/values.h" 1 #pragma once # 126 "/usr/local/Gnu/lib/g++-include/values.h" # 134 "/usr/local/Gnu/lib/g++-include/math.h" 2 # 42 "/usr/local/Gnu/lib/g++-include/builtin.h" 2 long abs(long); double abs(double); void clearbit(long&, long); void setbit(long&, long); int testbit(long, long); int even(long); long gcd(long, long); long lg(long); long lcm(long, long); int odd(long); double pow(double, long); long pow(long, long); int sign(long); int sign(double); long sqr(long); double sqr(double); long sqrt(long); double start_timer(); double return_elapsed_time(double); char* itoa(long x, int base = 10, int width = 0); char* itoa(unsigned long x, int base = 10, int width = 0); char* hex(long x, int width = 0); char* hex(unsigned long x, int width = 0); char* oct(long x, int width = 0); char* oct(unsigned long x, int width = 0); char* dec(long x, int width = 0); char* dec(unsigned long x, int width = 0); char* form(const char* fmt ...); char* chr(char ch); char* str(const char* s, int width = 0); unsigned int hashpjw(const char*); unsigned int multiplicativehash(int); unsigned int foldhash(double); extern void default_one_arg_error_handler(const char*); extern void default_two_arg_error_handler(const char*, const char*); extern two_arg_error_handler_t lib_error_handler; extern two_arg_error_handler_t set_lib_error_handler(two_arg_error_handler_t f); inline double abs(double _arg) { return (_arg < 0.0)? -_arg : _arg; } inline long abs(long _arg) { return (_arg < 0)? -_arg : _arg; } inline int sign(long _arg) { return (_arg == 0) ? 0 : ( (_arg > 0) ? 1 : -1 ); } inline int sign(double _arg) { return (_arg == 0.0) ? 0 : ( (_arg > 0.0) ? 1 : -1 ); } inline long sqr(long _arg) { return _arg * _arg; } inline double sqr(double _arg) { return _arg * _arg; } inline int even(long _arg) { return !(_arg & 1); } inline int odd(long _arg) { return (_arg & 1); } inline long lcm(long _x, long _y) { return _x / gcd(_x, _y) * _y; } inline void setbit(long& _x, long _b) { _x |= (1 << _b); } inline void clearbit(long& _x, long _b) { _x &= ~(1 << _b); } inline int testbit(long _x, long _b) { return ((_x & (1 << _b)) != 0); } # 28 "/usr/local/Gnu/lib/g++-include/File.h" 2 # 1 "/usr/local/Gnu/lib/g++-include/stdio.h" 1 #pragma once # 74 "/usr/local/Gnu/lib/g++-include/stdio.h" # 96 "/usr/local/Gnu/lib/g++-include/stdio.h" extern struct _iobuf { int _cnt; char* _ptr; char* _base; int _bufsiz; short _flag; char _file; } _iob[]; extern "C" { int _doprnt(const char*, void*, struct _iobuf *); int _doscan( struct _iobuf *, const char*, ...); int _filbuf( struct _iobuf *); int _flsbuf(unsigned, struct _iobuf *); int fclose( struct _iobuf *); struct _iobuf * fdopen(int, const char*); int fflush( struct _iobuf *); int fgetc( struct _iobuf *); char* fgets(char*, int, struct _iobuf *); struct _iobuf * fopen(const char*, const char*); int fprintf( struct _iobuf *, const char* ...); int fputc(int, struct _iobuf *); int fputs(const char*, struct _iobuf *); int fread(void*, int, int, struct _iobuf *); struct _iobuf * freopen(const char*, const char*, struct _iobuf *); int fscanf( struct _iobuf *, const char* ...); int fseek( struct _iobuf *, long, int); long ftell( struct _iobuf *); int fwrite(const void*, int, int, struct _iobuf *); char* gets(char*); int getw( struct _iobuf *); int pclose( struct _iobuf *); struct _iobuf * popen(const char*, const char*); int printf(const char* ...); void puts(const char*); int putw(int, struct _iobuf *); int rewind( struct _iobuf *); int scanf(const char* ...); void setbuf( struct _iobuf *, char*); void setbuffer( struct _iobuf *, char*, int); void setlinebuf( struct _iobuf *); void setvbuf( struct _iobuf *, char*, int, int); int sscanf(char*, const char* ...); struct _iobuf * tmpfile(); int ungetc(int, struct _iobuf *); int vfprintf( struct _iobuf *, const char*, ...); int vprintf(const char*, ... ); char* sprintf(char*, const char* ...); char* vsprintf(char*, const char*, ...); } # 29 "/usr/local/Gnu/lib/g++-include/File.h" 2 enum io_mode { io_readonly = 0, io_writeonly = 1, io_readwrite = 2, io_appendonly = 3, io_append = 4, }; enum access_mode { a_createonly = 0, a_create = 1, a_useonly = 2, a_use = 3, }; enum state_value { _good = 0, _eof = 1, _fail = 2, _bad = 4 }; class Filebuf; class File { friend class Filebuf; protected: struct _iobuf * fp; char* nm; char rw; state_value state; long stat; void initialize(); void reinitialize(const char*); char *readline (int chunk_number, char terminator); public: File(); File(const char* filename, io_mode m, access_mode a); File(const char* filename, const char* m); File(int filedesc, io_mode m); File( struct _iobuf * fileptr); File(int sz, char* buf, io_mode m); ~File(); File& open(const char* filename, io_mode m, access_mode a); File& open(const char* filename, const char* m); File& open(int filedesc, io_mode m); File& open( struct _iobuf * fileptr); File& close(); File& remove(); int filedesc(); const char* name(); void setname(const char* newname); int iocount(); operator struct _iobuf *(); int rdstate(); int eof(); int fail(); int bad(); int good(); int readable(); int writable(); int is_open(); operator void*(); void error(); void clear(state_value f = 0); File& failif(int cond); void check_state(); File& get(char& c); File& put(char c); File& unget(char c); File& putback(char c); File& put(const char* s); File& get (char* s, int n, char terminator = '\n'); File& getline(char* s, int n, char terminator = '\n'); File& gets (char **s, char terminator = '\n'); File& read(void* x, int sz, int n); File& write(void* x, int sz, int n); File& form(const char* ...); File& scan(const char* ...); File& flush(); File& flush(char ch); int fill(); File& seek(long pos, int seek_mode=0); long tell(); File& setbuf(int buffer_kind); File& setbuf(int size, char* buf); File& raw(); }; extern void verbose_File_error_handler(char*); extern void quiet_File_error_handler(char*); extern void fatal_File_error_handler(char*); extern one_arg_error_handler_t File_error_handler; extern one_arg_error_handler_t set_File_error_handler(one_arg_error_handler_t); inline int File::filedesc() { return ((fp)->_file) ; } inline const char* File::name() { return nm; } inline int File::iocount() { return stat; } inline File::operator struct _iobuf *() { return fp; } inline int File::readable() { if (fp != 0) { if ( (((fp)->_flag& 00020 )!=0) ) state |= _eof; if ( (((fp)->_flag& 00040 )!=0) ) state |= _bad;} return (state == _good && (rw & 01)); } inline int File::writable() { if (fp != 0 && (((fp)->_flag& 00040 )!=0) ) state |= _bad; return ((state & (_fail|_bad)) == 0 && (rw & 02)); } inline int File::is_open() { return (fp != 0); } inline void File::clear(state_value flag = 0) { state = flag; } inline File& File::raw() { return this->File::setbuf( 00004 ); } inline void File::check_state() { if (fp != 0) { if ( (((fp)->_flag& 00020 )!=0) ) state |= _eof; else state &= ~_eof; if ( (((fp)->_flag& 00040 )!=0) ) state |= _bad; } } inline File& File::failif(int cond) { if (cond) state |= _fail; return *this; } inline File& File::get(char& c) { if (readable()) { int ch = (--(fp)->_cnt>=0?(int)(*(unsigned char*)(fp)->_ptr++):_filbuf(fp)) ; c = ch; failif (ch == (-1) ); } return *this; } inline File& File::put(char c) { return failif (!writable() || (--( fp)->_cnt>=0? ((int)((unsigned char)((*( fp)->_ptr++=(unsigned)(c))))):_flsbuf((unsigned)(c), fp)) == (-1) ); } inline File& File::unget(char c) { return failif(!is_open() || !(rw & 01) || ungetc(c, fp) == (-1) ); } inline File& File::putback(char c) { return failif (!is_open() || !(rw & 01) || ungetc(c, fp) == (-1) ); } inline File& File::read(void* x, int sz, int n) { return failif (!readable() || (stat = fread(x, sz, n, fp)) != n); } inline File& File::write(void* x, int sz, int n) { return failif (!writable() || (stat = fwrite(x, sz, n, fp)) != n); } inline File& File::flush() { return failif(!is_open() || fflush(fp) == (-1) ); } inline File& File::flush(char ch) { return failif(!is_open() || _flsbuf(ch, fp) == (-1) ); } inline int File::fill() { failif(!is_open() || (stat = _filbuf(fp)) == (-1) ); return stat; } inline File& File::seek(long pos, int seek_mode = 0) { return failif (!is_open() || fseek(fp, pos, seek_mode) < 0); } inline long File::tell() { failif (!is_open() || ((stat = ftell(fp)) < 0)); return stat; } inline int File::rdstate() { check_state(); return state; } inline File::operator void*() { check_state(); return (state & (_bad|_fail))? 0 : this ; } inline int File::eof() { check_state(); return state & _eof; } inline int File::fail() { check_state(); return state & _fail; } inline int File::bad() { check_state(); return state & _bad; } inline int File::good() { check_state(); return rdstate() == _good; } # 34 "/usr/local/Gnu/lib/g++-include/stream.h" 2 # 1 "/usr/local/Gnu/lib/g++-include/streambuf.h" 1 #pragma once enum open_mode { input=0, output=1, append=2 }; class streambuf { public: char* base; char* pptr; char* gptr; char* eptr; char alloc; streambuf(); streambuf(char* buf, int buflen); virtual ~streambuf(); int doallocate(); int allocate(); virtual int overflow(int c = (-1) ); virtual int underflow(); int sgetc(); int snextc(); void stossc(); void sputback(char); int sputc(int c = (-1) ); virtual streambuf* setbuf(char* buf, int buflen, int preloaded_count = 0); int sputs(const char* s); int sputsn(const char* s, int len); virtual const char* name(); virtual streambuf* open(const char* name, open_mode m); virtual streambuf* open(const char* filename, io_mode m, access_mode a); virtual streambuf* open(const char* filename, const char* m); virtual streambuf* open(int filedesc, io_mode m); virtual streambuf* open( struct _iobuf * fileptr); virtual int is_open(); virtual int close(); virtual void error(); }; class filebuf: public streambuf { public: int fd; char opened; int overflow(int c = (-1) ); int underflow(); filebuf(); filebuf(int newfd); filebuf(int newfd, char* buf, int buflen); ~filebuf(); streambuf* open(const char* name, open_mode m); int is_open(); int close(); }; class Filebuf: public streambuf { public: File* Fp; void init_streambuf_ptrs(); int overflow(int c = (-1) ); int underflow(); Filebuf(); Filebuf(const char* filename, io_mode m, access_mode a); Filebuf(const char* filename, const char* m); Filebuf(int filedesc, io_mode m); Filebuf( struct _iobuf * fileptr); ~Filebuf(); const char* name(); streambuf* setbuf(char* buf, int buflen, int preloaded_count = 0); streambuf* open(const char* filename, io_mode m, access_mode a); streambuf* open(const char* filename, const char* m); streambuf* open(int filedesc, io_mode m); streambuf* open( struct _iobuf * fileptr); int is_open(); int close(); void error(); }; inline int streambuf::allocate() { return (base == 0)? doallocate() : 0; } inline int streambuf::sgetc() { return (gptr >= pptr)? underflow() : int(*gptr); } inline int streambuf::snextc() { ++gptr; return (gptr >= pptr)? underflow() : int(*gptr); } inline void streambuf::stossc() { if (gptr >= pptr) underflow(); else gptr++; } inline void streambuf::sputback(char ch) { if (gptr > base) *--gptr = ch; } inline int streambuf::sputc(int ch = (-1) ) { return (pptr < eptr)? (*pptr++ = (char)(ch)) : overflow(ch); } # 35 "/usr/local/Gnu/lib/g++-include/stream.h" 2 class whitespace { char filler; }; class istream; class ostream { friend class istream; protected: streambuf* bp; state_value state; char ownbuf; public: ostream(const char* filename, io_mode m, access_mode a); ostream(const char* filename, const char* m); ostream(int filedesc, io_mode m); ostream( struct _iobuf * fileptr); ostream(int sz, char* buf); ostream(int filedesc, char* buf, int buflen); ostream(int filedesc); ostream(streambuf* s); ~ostream(); ostream& open(const char* filename, io_mode m, access_mode a); ostream& open(const char* filename, const char* m); ostream& open(int filedesc, io_mode m); ostream& open( struct _iobuf * fileptr); ostream& open(const char* filenam, open_mode m); ostream& close(); ostream& flush(); int rdstate(); int eof(); int fail(); int bad(); int good(); int readable(); int writable(); int is_open(); operator void*(); int operator !(); const char* name(); char* bufptr(); void error(); void clear(state_value f = 0); ostream& failif(int cond); ostream& put(char c); ostream& put(const char* s); ostream& put(const char* s, int slen); ostream& form(const char* fmt,...); ostream& operator << (short n); ostream& operator << (unsigned short n); ostream& operator << (int n); ostream& operator << (unsigned int n); ostream& operator << (long n); ostream& operator << (unsigned long n); ostream& operator << (float n); ostream& operator << (double n); ostream& operator << (const char* s); ostream& operator << (char c); }; class istream { friend void eatwhite(istream& s); protected: streambuf* bp; state_value state; ostream* tied_to; char skipws; char ownbuf; void _flush(); char* readline (int chunk_number, char terminator); public: istream(const char* filename, io_mode m, access_mode a, int sk=1, ostream* t = 0); istream(const char* filename, const char* m, int sk=1, ostream* t = 0); istream(int filedesc, io_mode m, int sk=1, ostream* t = 0); istream( struct _iobuf * fileptr, int sk=1, ostream* t = 0); istream(int sz, char* buf, int sk=1, ostream* t = 0); istream(int filedesc, int sk=1, ostream* t = 0); istream(int filedesc, char* buf, int buflen, int sk=1, ostream* t = 0); istream(streambuf* s, int sk=1, ostream* t = 0); ~istream(); istream& open(const char* filename, io_mode m, access_mode a); istream& open(const char* filename, const char* m); istream& open(int filedesc, io_mode m); istream& open( struct _iobuf * fileptr); istream& open(const char* filenam, open_mode m); istream& close(); ostream* tie(ostream* s); int skip(int); int rdstate(); int eof(); int fail(); int bad(); int good(); int readable(); int writable(); int is_open(); operator void*(); int operator !(); const char* name(); char* bufptr(); void error(); void clear(state_value f = 0); istream& failif(int cond); istream& get(char& c); istream& unget(char c); istream& putback(char c); istream& get (char* s, int n, char terminator = '\n'); istream& getline(char* s, int n, char terminator = '\n'); istream& gets (char **s, char terminator = '\n'); istream& operator >> (char& c); istream& operator >> (short& n); istream& operator >> (unsigned short& n); istream& operator >> (int& n); istream& operator >> (unsigned int& n); istream& operator >> (long& n); istream& operator >> (unsigned long& n); istream& operator >> (float& n); istream& operator >> (double& n); istream& operator >> (char* s); istream& operator >> (whitespace& w); }; extern istream cin; extern ostream cout; extern ostream cerr; extern whitespace WS; inline void ostream::clear(state_value flag = _good) { state = flag; } inline int ostream::rdstate() { return int(state); } inline int ostream::good() { return state == _good; } inline int ostream::eof() { return int(state) & int(_eof); } inline int ostream::fail() { return int(state) & int(_fail); } inline int ostream::bad() { return int(state) & int(_bad); } inline ostream::operator void*() { return (state == _good)? this : 0; } inline int ostream::operator !() { return (state != _good); } inline ostream& ostream::failif(int cond) { if (cond) state |= _fail; return *this; } inline int ostream::is_open() { return bp->is_open(); } inline int ostream::readable() { return 0; } inline int ostream::writable() { return (bp != 0) && (state == _good); } inline char* ostream::bufptr() { return bp->base; } inline ostream& ostream::flush() { bp->overflow(); return *this; } inline ostream& ostream::close() { bp->overflow(); bp->close(); return *this; } inline ostream& ostream::put(char ch) { return failif((state != _good) || bp->sputc(ch) == (-1) ); } inline ostream& ostream::operator << (char ch) { return failif((state != _good) || bp->sputc(ch) == (-1) ); } inline ostream& ostream::put(const char* s) { return failif((state != _good) || bp->sputs(s) == (-1) ); } inline ostream& ostream::put(const char* s, int len) { return failif((state != _good) || bp->sputsn(s, len) == (-1) ); } inline ostream& ostream::operator << (const char* s) { return failif((state != _good) || bp->sputs(s) == (-1) ); } inline void istream::clear(state_value flag = _good) { state = flag; } inline int istream::rdstate() { return int(state); } inline int istream::good() { return state == _good; } inline int istream::eof() { return int(state) & int(_eof); } inline int istream::fail() { return int(state) & int(_fail); } inline int istream::bad() { return int(state) & int(_bad); } inline istream::operator void*() { return (state == _good)? this : 0; } inline int istream::operator !() { return (state != _good); } inline istream& istream::failif(int cond) { if (cond) state |= _fail; return *this; } inline int istream::is_open() { return bp->is_open(); } inline int istream::readable() { return (bp != 0) && (bp->is_open()) && (state == _good); } inline int istream::writable() { return 0; } inline void istream::_flush() { if(tied_to != 0) tied_to->flush(); } inline char* istream::bufptr() { return bp->base; } inline istream& istream::close() { bp->close(); return *this; } inline int istream::skip(int sk) { int was = skipws; skipws = sk; return was; } inline ostream* istream::tie(ostream* s) { ostream* was = tied_to; tied_to = s; return was; } inline istream& istream::unget(char c) { bp->sputback(c); return *this; } inline istream& istream::putback(char c) { bp->sputback(c); return *this; } inline void eatwhite(istream& s) { s >> WS; } # 11 "./HardwareContext.h" 2 # 1 "../Src/assert.h" 1 #pragma once # 1 "../Src/Generic.h" 1 #pragma once # 55 "../Src/Generic.h" # 29 "../Src/assert.h" 2 # 1 "../Src/Pragma.h" 1 #pragma once # 30 "../Src/assert.h" 2 extern const int SubClassResponsibility; void _assert(const char *, const char *, const int); void _assert2(const char *, const char *, const int, const char *); # 12 "./HardwareContext.h" 2 extern const long MagicStackMarker; typedef void (*voidFuncP)(); class CpuMultiplexor; class SingleCpuMux; class MultiCpuMux; class SimulationMultiplexor; class SingleSimMux; typedef long HardwareContextQuad; class HardwareContext { HardwareContextQuad sp; HardwareContextQuad fp; void** stackBase; void** stackEnd; unsigned stackMax; unsigned stackSize; void **stackMallocAt; long *stackCheck; unsigned checkStackLimits; friend class Thread; friend class CpuMultiplexor; friend class SingleCpuMux; friend class MultiCpuMux; friend class SimulationMultiplexor; friend class SingleSimMux; void switchContext(HardwareContext *to); void magicSwitchTo(HardwareContext *to); void **getSp(); void **mallocAt(); void buildReturnFrame(void * returnThis, voidFuncP returnAddress); void stackOverflow(); HardwareContext(int checked, unsigned stackSize); public: HardwareContext(); long maxStackDepth(); void checkStack(int overage = 0); void classPrintOn(ostream& strm); }; inline HardwareContext::HardwareContext() { int NotReached = 0; { if (( NotReached )) ; else _assert( "NotReached", "./HardwareContext.h",80); } ; } inline ostream& operator<<(ostream& strm, HardwareContext& ob) { ob.classPrintOn(strm); return strm; } inline void ** HardwareContext::getSp() { register int theStackPointer asm("sp"); return( (void **) theStackPointer ); } inline void HardwareContext::checkStack(int overage) { unsigned depth = stackBase - getSp() + overage; if (stackMax < depth) { stackMax = depth; } if ( stackMax >= stackSize || *stackCheck != MagicStackMarker ) { stackOverflow(); } } # 12 "../Src/CpuMultiplexor.h" 2 # 1 "../Src/CpuMuxExceptions.h" 1 #pragma once # 1 "../Src/ExceptionClass.h" 1 #pragma once class ExceptionClass { public: ExceptionClass(); virtual void handleException(); }; inline ExceptionClass::ExceptionClass() { } # 11 "../Src/CpuMuxExceptions.h" 2 class ReserveByException; class ExceptionReserve : public ExceptionClass { ReserveByException *toReserve; public: ExceptionReserve(); ReserveByException *reserve(); void reserve(ReserveByException *); virtual void handleException(); }; inline ExceptionReserve::ExceptionReserve() { } inline ReserveByException * ExceptionReserve::reserve() { return(toReserve); } inline void ExceptionReserve::reserve(ReserveByException *r) { toReserve = r; } class Thread; class ExceptionTerminate : public ExceptionClass { void **stackOfDeadThread; public: ExceptionTerminate(); void terminate(void **); virtual void handleException(); }; inline ExceptionTerminate::ExceptionTerminate() { } inline void ExceptionTerminate::terminate(void **r) { stackOfDeadThread = r; } class ExceptionReschedule : public ExceptionClass { public: ExceptionReschedule(); virtual void handleException(); }; inline ExceptionReschedule::ExceptionReschedule() { } class ExceptionIveSuspended : public ExceptionClass { public: ExceptionIveSuspended(); virtual void handleException(); }; inline ExceptionIveSuspended::ExceptionIveSuspended() { } # 13 "../Src/CpuMultiplexor.h" 2 # 1 "../Src/SpinLock.h" 1 #pragma once static const unsigned char SpinLockFree = '\x00'; class SpinLock { unsigned char state; public: inline SpinLock(); inline ~SpinLock(); void reserve(); int reserveNoBlock(); void release(); }; static inline SpinLock::SpinLock() { state = SpinLockFree; } static inline SpinLock::~SpinLock() { { if ((state == SpinLockFree)) ; else _assert( "state == SpinLockFree", "../Src/SpinLock.h",42); } ; } # 74 "../Src/SpinLock.h" static inline void SpinLock::reserve() { { if ((state == SpinLockFree)) ; else _assert( "state == SpinLockFree", "../Src/SpinLock.h",81); } ; state = ~SpinLockFree; } static inline int SpinLock::reserveNoBlock() { { if ((state == SpinLockFree)) ; else _assert( "state == SpinLockFree", "../Src/SpinLock.h",91); } ; state = ~SpinLockFree; return( 1 ); } inline void SpinLock::release() { { if ((state != SpinLockFree)) ; else _assert( "state != SpinLockFree", "../Src/SpinLock.h",101); } ; state = SpinLockFree; } # 14 "../Src/CpuMultiplexor.h" 2 # 1 "../Src/ThreadContainer.h" 1 #pragma once # 1 "../Src/Awesime.h" 1 #pragma once # 1 "/usr/local/Gnu/lib/g++-include/bool.h" 1 #pragma once enum bool { FALSE = 0, TRUE = 1 }; # 27 "../Src/Awesime.h" 2 class Awesime; typedef Awesime *AwesimePtr; typedef void *VoidPtr; class Awesime { protected: int debugFlag; public : Awesime(bool xdebug = 0); virtual bool debug(); virtual bool debug(bool x); virtual void classPrintOn(ostream& s); virtual void subClassResponsibility(char *name = ""); }; static inline Awesime::Awesime(bool xdebug) { debugFlag = xdebug; } inline ostream& operator<<(ostream& strm, Awesime& ob) { ob.classPrintOn(strm); return strm; } # 11 "../Src/ThreadContainer.h" 2 class Thread; class ThreadContainer : public Awesime { public : inline ThreadContainer(bool xdebug = 0) : (xdebug) {} virtual void add( Thread* ); virtual void add( double when, Thread* ); virtual void add( int when, Thread* ); virtual Thread* remove(); virtual Thread* remove(Thread* toRemove); virtual bool isEmpty(); virtual unsigned size(); }; # 20 "../Src/CpuMultiplexor.h" 2 class Thread; class ReserveByException; class AwesimeHeap; class SpinLock; class SpinFetchAndOp; class CpuMultiplexor; extern int CpuMultiplexors; extern CpuMultiplexor *ThisCpu; extern int CpuMuxDebugFlag; extern SpinLock CpuCerrLock; class CpuMultiplexor { protected: friend class SimulationMultiplexor; friend class SingleSimMux; friend class MultiSimMux; friend class MonitorSimMux; Thread *currentThread; HardwareContext systemContext; ThreadContainer *myCurrentEvents; SpinLock *myCurrentEventsLock; int *myCurrentEventsCounter; int iYam; int pid; char nameSpace[128]; char *pNameTemplate; char *pName; int *terminated; int enabled; virtual Thread *remove(); virtual void allocateEventStructures(int,int); virtual void deallocateEventStructures(); void addUnlocked(Thread *); friend class ExceptionReserve; friend class ExceptionTerminate; friend class ExceptionReschedule; friend class ExceptionIveSuspended; friend class ExceptionRelocate; friend class ExceptionEnrollDismissCpu; ExceptionClass *raisedBy; ExceptionReserve reserveException; ExceptionTerminate terminateException; ExceptionReschedule rescheduleException; ExceptionIveSuspended iveSuspendedException; public: void raise(ExceptionClass *); void reserveByException( ReserveByException * ); void threadTerminateException( void ** ); void flick(); public: CpuMultiplexor(int debug = 0); virtual ~CpuMultiplexor(); virtual void fireItUp(int Cpus = 1, unsigned shared = (4196 * 500)); virtual void warmThePot(int); virtual void stirItAround(); virtual void coolItDown(); virtual void terminateAll(); virtual void add(Thread *); Thread * CurrentThread(); void debug(int newdebug); int debug(); const char *name(); int cpuId(); }; static inline int CpuMultiplexor::cpuId() { return( iYam ); } static inline const char * CpuMultiplexor::name() { return(pName); } static inline Thread * CpuMultiplexor::CurrentThread() { return( currentThread ); } # 1 "../Src/Thread.h" 1 #pragma once enum ThreadState { SUSPENDED, RUNNING, RUNNABLE, ZOMBIED, TERMINATED }; static const double NullTime = -1; typedef int ThreadPriority; class CpuMultiplexor; class SingleCpuMux; class SingleSimMux; class MultiCpuMux; class MultiSimMux; class SimulationMultiplexor; class Thread : public Awesime { friend class CpuMultiplexor; friend class SingleCpuMux; friend class MultiCpuMux; friend class SimulationMultiplexor; friend class SingleSimMux; friend class MultiSimMux; HardwareContext pContext; ThreadState threadState; ThreadPriority threadPriority; short cpuAffinity; ThreadContainer suspendedOn; void startOff(); void makeTerminated(); char* threadName; protected: void name(char *); void state(ThreadState s); void makeRunnable(); virtual void main(); public: Thread(char* name ="", unsigned stacksize = 1010, ThreadPriority priority = 0, bool debug = 0, int checkStack = 1); virtual ~Thread(); const HardwareContext * context(); char* name(); ThreadState state(); long maxStackDepth(); void checkStack(); void priority(ThreadPriority newPriority); ThreadPriority priority(); virtual void classPrintOn(ostream& strm); }; inline char* Thread::name() { return threadName; } inline void Thread::name(char *name) { threadName = name; } inline void Thread::state(ThreadState s) { threadState = s; } inline ThreadState Thread::state() { return threadState; } inline long Thread::maxStackDepth() { return( pContext.maxStackDepth() ); } inline void Thread::checkStack() { pContext.checkStack(); } inline ThreadPriority Thread::priority() { return(threadPriority); }; inline void Thread::priority(ThreadPriority newPriority) { threadPriority = newPriority; } # 157 "../Src/CpuMultiplexor.h" 2 static inline void CpuMultiplexor::flick() { currentThread -> cpuAffinity = -1; raise( &rescheduleException ); } static inline Thread * CurrentThread() { return( ThisCpu -> CurrentThread() ); } static inline void CheckCurrentStack() { CurrentThread() -> checkStack(); } extern ThreadContainer *AllocateHardwareCurrentEventsStructure(); # 11 "../Src/SimulationMultiplexor.h" 2 extern double CurrentSimulatedTime; extern const double NullTime; class TimeSchedulerPQ; class SimulationMultiplexor { protected: TimeSchedulerPQ *myPendingEvents; virtual int advanceTime(); virtual void allocateEventStructures(int,int); virtual void deallocateEventStructures(); public: SimulationMultiplexor(int debug = 0); ~SimulationMultiplexor(); virtual void addAt(Thread *, double); virtual void addWithDelay(Thread *, double); virtual void hold( double time ); virtual void await( double time ); }; extern SimulationMultiplexor *ThisSimulationMultiplexor; static inline double simulatedClock() { return( CurrentSimulatedTime ); } static inline void await(double till) { if ( till > CurrentSimulatedTime ) { ThisSimulationMultiplexor -> await(till); } } static inline void hold(double holdFor) { ThisSimulationMultiplexor -> await( CurrentSimulatedTime + holdFor ); } # 11 "../Src/SingleSimMux.h" 2 # 1 "../Src/SingleCpuMux.h" 1 #pragma once class SingleCpuMux : public CpuMultiplexor { friend class SingleSimMux; protected: virtual Thread *remove(); void allocateLocalEventStructures(int,int); virtual void allocateEventStructures(int,int); virtual void deallocateEventStructures(); public: SingleCpuMux(int debug = 0); virtual ~SingleCpuMux(); virtual void fireItUp(int Cpus = 1, unsigned shared = (4196 * 500)); virtual void warmThePot(int); virtual void stirItAround(); virtual void coolItDown(); virtual void add(Thread *); }; extern ThreadContainer *AllocateHardwareCurrentEventsStructure(); # 12 "../Src/SingleSimMux.h" 2 class SpinBarrier; class TimeSchedulerPQ; class SingleSimMux : public SimulationMultiplexor, public SingleCpuMux { protected: virtual int advanceTime(); virtual void allocateLocalEventStructures(int,int); virtual void allocateEventStructures(int,int); virtual void deallocateEventStructures(); virtual Thread *remove(); public: SingleSimMux( int debug = 0 ); virtual void warmThePot(int); virtual void stirItAround(); virtual void coolItDown(); virtual void add(Thread *); }; # 7 "../Src/SingleSimMux.cc" 2 # 1 "../Src/AwesimeHeap.h" 1 #pragma once class AwesimeHeapItem { Awesime *pPtr; double pKey; public: AwesimeHeapItem(); AwesimeHeapItem(double key, Awesime *p); operator<=(AwesimeHeapItem &p); Awesime *ptr(); double key(); }; inline Awesime* AwesimeHeapItem::ptr() { return(pPtr); } inline double AwesimeHeapItem::key() { return(pKey); } inline AwesimeHeapItem::AwesimeHeapItem() { pPtr = 0; pKey = 0; } inline AwesimeHeapItem::AwesimeHeapItem(double k, Awesime *p) { pPtr = p; pKey = k; } inline int AwesimeHeapItem::operator<=(AwesimeHeapItem &p) { return ( pKey <= (p.key()) ); } # 1 "../Src/GenericHeap.h" 1 typedef unsigned short AwesimeHeapIndex ; extern const AwesimeHeapIndex AwesimeHeapNull ; typedef struct { AwesimeHeapItem item; AwesimeHeapIndex sibling; AwesimeHeapIndex children; } AwesimeHeapRecord ; class AwesimeHeap : public Awesime { AwesimeHeapRecord *storage; char *pValid; int elements; AwesimeHeapIndex allocatedSize; AwesimeHeapIndex freelist; AwesimeHeapIndex root; void makeRoom(int atLeast); AwesimeHeapIndex getCell(); void returnCell(AwesimeHeapIndex cell); AwesimeHeapIndex makeChild(AwesimeHeapIndex a, AwesimeHeapIndex b); public: AwesimeHeap (int length = 0, bool xdebug = 0); virtual void add(AwesimeHeapItem &item); virtual bool remove(AwesimeHeapItem &removed); virtual bool doStart( AwesimeHeapIndex &index); virtual bool doDelete(AwesimeHeapIndex &index); virtual bool doNext( AwesimeHeapIndex &index); virtual void doDone(); AwesimeHeapIndex minItem(); bool valid(AwesimeHeapIndex index); AwesimeHeapItem & item(AwesimeHeapIndex i); AwesimeHeapIndex maxIndex(); bool isEmpty(); unsigned int size(); virtual void classPrintOn(ostream& s); }; static inline AwesimeHeapIndex AwesimeHeap ::minItem() { return(root); }; static inline bool AwesimeHeap ::valid(AwesimeHeapIndex index) { return ( pValid[index] ); } static inline AwesimeHeapItem & AwesimeHeap ::item(AwesimeHeapIndex i) { return( storage[i].item ); } static inline AwesimeHeapIndex AwesimeHeap ::maxIndex() { return(allocatedSize); } static inline bool AwesimeHeap ::isEmpty() { return(elements <= 0); } static inline unsigned int AwesimeHeap ::size() { return(elements); } # 54 "../Src/AwesimeHeap.h" 2 # 8 "../Src/SingleSimMux.cc" 2 # 1 "./HardwareContextP.h" 1 #pragma once inline void ** HardwareContext::mallocAt() { return( stackMallocAt ); } static inline long HardwareContext::maxStackDepth() { return( long(stackMax) ); } static inline void HardwareContext::switchContext(HardwareContext *to) { if ( checkStackLimits ) { checkStack(); } magicSwitchTo(to); if ( checkStackLimits ) { checkStack(); } } # 10 "../Src/SingleSimMux.cc" 2 # 1 "../Src/TimeSchedulerSplayPQ.h" 1 #pragma once # 1 "../Src/TimeSchedulerPQ.h" 1 #pragma once # 1 "../Src/Pix.h" 1 typedef void* Pix; # 29 "../Src/TimeSchedulerPQ.h" 2 # 1 "../Src/TimeSchedulerdefs.h" 1 #pragma once class TimeScheduler { Thread *pThread; double pTime; public: TimeScheduler(); TimeScheduler(Thread *p); TimeScheduler(Thread *p, double when); operator==(TimeScheduler &p); operator<=(TimeScheduler &p); Thread *thread(); double time(); }; inline Thread* TimeScheduler::thread() { return(pThread); } inline double TimeScheduler::time() { return(pTime); } inline TimeScheduler::TimeScheduler() { pThread = 0; pTime = 0; } inline TimeScheduler::TimeScheduler(Thread *p) { pThread = p; pTime = 0; } inline TimeScheduler::TimeScheduler(Thread *p, double w) { pThread = p; pTime = w; } inline int TimeScheduler::operator==(TimeScheduler &p) { return( (pTime == p.pTime) && (pThread -> priority() == (p.thread() -> priority()))); } inline int TimeScheduler::operator<=(TimeScheduler &p) { return( (pTime < p.pTime) || ( (pTime == p.pTime) && (pThread -> priority() <= (p.thread() -> priority()))) ); } extern unsigned int hash(TimeScheduler&); # 30 "../Src/TimeSchedulerPQ.h" 2 class TimeSchedulerPQ { protected: int count; public: int length(); int empty(); virtual Pix enq(TimeScheduler& item); virtual TimeScheduler deq(); virtual TimeScheduler& front(); virtual void del_front(); virtual int contains(TimeScheduler& item); virtual void clear(); virtual Pix first(); virtual void next(Pix& i); virtual TimeScheduler& operator () (Pix i); virtual void del(Pix i); virtual int owns(Pix i); virtual Pix seek(TimeScheduler& item); void error(char* msg); virtual int OK(); }; inline int TimeSchedulerPQ::length() { return count; } inline int TimeSchedulerPQ::empty() { return count == 0; } # 29 "../Src/TimeSchedulerSplayPQ.h" 2 struct TimeSchedulerSplayNode { TimeSchedulerSplayNode* lt; TimeSchedulerSplayNode* rt; TimeSchedulerSplayNode* par; TimeScheduler item; TimeSchedulerSplayNode(TimeScheduler& h, TimeSchedulerSplayNode* l=0, TimeSchedulerSplayNode* r=0); ~TimeSchedulerSplayNode(); }; inline TimeSchedulerSplayNode::TimeSchedulerSplayNode(TimeScheduler& h, TimeSchedulerSplayNode* l=0, TimeSchedulerSplayNode* r=0) { item = h; lt = l; rt = r; par = 0; } inline TimeSchedulerSplayNode::~TimeSchedulerSplayNode() {} typedef TimeSchedulerSplayNode* TimeSchedulerSplayNodePtr; class TimeSchedulerSplayPQ : public TimeSchedulerPQ { protected: TimeSchedulerSplayNode* root; TimeSchedulerSplayNode* leftmost(); TimeSchedulerSplayNode* rightmost(); TimeSchedulerSplayNode* pred(TimeSchedulerSplayNode* t); TimeSchedulerSplayNode* succ(TimeSchedulerSplayNode* t); void _kill(TimeSchedulerSplayNode* t); TimeSchedulerSplayNode* _copy(TimeSchedulerSplayNode* t); public: TimeSchedulerSplayPQ(); TimeSchedulerSplayPQ(TimeSchedulerSplayPQ& a); ~TimeSchedulerSplayPQ(); Pix enq(TimeScheduler& item); TimeScheduler deq(); TimeScheduler& front(); void del_front(); int contains(TimeScheduler& item); void clear(); Pix first(); Pix last(); void next(Pix& i); void prev(Pix& i); TimeScheduler& operator () (Pix i); void del(Pix i); Pix seek(TimeScheduler& item); int OK(); }; inline TimeSchedulerSplayPQ::~TimeSchedulerSplayPQ() { _kill(root); } inline TimeSchedulerSplayPQ::TimeSchedulerSplayPQ() { root = 0; count = 0; } inline TimeSchedulerSplayPQ::TimeSchedulerSplayPQ(TimeSchedulerSplayPQ& b) { count = b.count; root = _copy(b.root); } inline Pix TimeSchedulerSplayPQ::first() { return Pix(leftmost()); } inline Pix TimeSchedulerSplayPQ::last() { return Pix(rightmost()); } inline void TimeSchedulerSplayPQ::next(Pix& i) { if (i != 0) i = Pix(succ((TimeSchedulerSplayNode*)i)); } inline void TimeSchedulerSplayPQ::prev(Pix& i) { if (i != 0) i = Pix(pred((TimeSchedulerSplayNode*)i)); } inline TimeScheduler& TimeSchedulerSplayPQ::operator () (Pix i) { if (i == 0) error("null Pix"); return ((TimeSchedulerSplayNode*)i)->item; } inline void TimeSchedulerSplayPQ::clear() { _kill(root); count = 0; root = 0; } inline int TimeSchedulerSplayPQ::contains(TimeScheduler& key) { return seek(key) != 0; } # 11 "../Src/SingleSimMux.cc" 2 # 1 "../Src/ReserveByException.h" 1 #pragma once class ExceptionReserve; class Thread; class ReserveByException { friend class ExceptionReserve; private: virtual int reserveByException(Thread *byWho); public: ReserveByException(); }; inline ReserveByException::ReserveByException() { } # 12 "../Src/SingleSimMux.cc" 2 extern int CpuMuxDebugFlag; SingleSimMux::SingleSimMux(int debug ) : SimulationMultiplexor(debug), SingleCpuMux(debug) { ThisSimulationMultiplexor = this; SingleCpuMux::allocateLocalEventStructures(0,1); pNameTemplate = "SingleSimMux"; sprintf(nameSpace, "[%s-%d] ", pNameTemplate, SingleCpuMux::iYam); cerr << "Constructed name is " << nameSpace << "\n"; pName = nameSpace; cerr << "after pName, it's " << nameSpace << "\n"; cerr << " and pname is " << pName << "\n"; cerr << " and name() is " << name() << "\n"; SingleSimMux::allocateLocalEventStructures(0,1); } void SingleSimMux::allocateLocalEventStructures(int, int) { if ( CpuMuxDebugFlag ) { cerr << name() << " enter allocateLocalEventStructures\n"; } myPendingEvents = new TimeSchedulerSplayPQ; } void SingleSimMux::allocateEventStructures(int newIYam, int outOf) { if ( CpuMuxDebugFlag ) { cerr << name() << " enter allocateEventStructures\n"; } allocateLocalEventStructures(newIYam, outOf); } void SingleSimMux::deallocateEventStructures() { if ( CpuMuxDebugFlag ) { cerr << name() << " enter deallocateEventStructures\n"; } delete myPendingEvents; myPendingEvents = 0; } void SingleSimMux::warmThePot(int) { if ( CpuMuxDebugFlag ) { cerr << name() << " enter warmThePot\n"; } SingleCpuMux::warmThePot(1); } void SingleSimMux::coolItDown() { if ( CpuMuxDebugFlag ) { cerr << name() << " enter coolItDown\n"; } SingleCpuMux::coolItDown(); } void SingleSimMux::add( Thread * t ) { if ( CpuMuxDebugFlag ) { cerr << name() << " enter SingleSimMux::add\n"; } myPendingEvents->enq( TimeScheduler(t, CurrentSimulatedTime) ); } Thread * SingleSimMux::remove() { if ( CpuMuxDebugFlag ) { cerr << name() << " enter SingleSimMux::remove\n"; } if ( *terminated || myPendingEvents -> empty() ) { return(0); } TimeScheduler item = myPendingEvents -> deq(); return( item.thread() ); } int SingleSimMux::advanceTime() { { if ((0)) ; else _assert( "0", "../Src/SingleSimMux.cc",139); } ; } void SingleSimMux::stirItAround() { if ( CpuMuxDebugFlag ) { cerr << name() << " enter SingleSimMux::stirItAround\n"; } for (;;) { { if (( myCurrentEvents -> isEmpty() )) ; else _assert( "myCurrentEvents -> isEmpty()", "../Src/SingleSimMux.cc",152); } ; if ( CpuMuxDebugFlag ) { cerr << name() << " Prepare to dispatch task\n"; } if ( myPendingEvents -> empty() ) { if ( CpuMuxDebugFlag ) { cerr << name() << " myPendingEvents is empty\n"; } return; } TimeScheduler &item = myPendingEvents -> front(); CurrentSimulatedTime = item.time(); currentThread = item.thread(); if ( CpuMuxDebugFlag ) { cerr << name() << " switch to " << hex(long(currentThread)) << "\n"; cerr.flush(); } systemContext.switchContext(&(currentThread -> pContext)); raisedBy -> handleException(); raisedBy = 0; } }