[gnu.g++.bug] bug in latest

grunwald@FOOBAR.COLORADO.EDU (Dirk Grunwald) (10/19/89)

configuration: g++.xtar.Z of evening 10/17 compiled by gcc.c with several
	destation patches

symptoms: following file causes compiler to drop core with message...

	g++ -I. -I../Src -O -c ../Src/MonitorSimMux.cc
	In file included from ../Src/MonitorSimMux.cc:7:
	../Src/MonitorSimMux.h:23: Segmentation violation
	g++: Program cc1plus got fatal signal 11.

--------------------expanded file MonitorSimMux.cc--------------------

# 1 "../Src/MonitorSimMux.cc"
# 1 "../Src/MonitorSimMux.h" 1
#pragma once
# 1 "../Src/MultiSimMux.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;
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;
    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",76); } ;
}
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();
    char *name();
    int cpuId();
};
static inline int
CpuMultiplexor::cpuId()
{
    return( iYam );
}
static inline char *
CpuMultiplexor::name()
{
    return(pName);
}
static inline Thread *
CpuMultiplexor::CurrentThread()
{
    return( currentThread );
}
static inline void
CpuMultiplexor::addUnlocked(Thread *who)
{
    myCurrentEvents -> add( who );
}
# 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 MultiCpuMux;
class SimulationMultiplexor;
class Thread : public Awesime {
    friend class CpuMultiplexor;
    friend class SingleCpuMux;
    friend class MultiCpuMux;
    friend class SimulationMultiplexor;
    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;
}
# 166 "../Src/CpuMultiplexor.h" 2
static inline void
CpuMultiplexor::raise(ExceptionClass *by)
{
    raisedBy = by;
    currentThread -> pContext.switchContext( &systemContext );
}
static inline void
CpuMultiplexor::reserveByException( ReserveByException *sem )
{
    reserveException.reserve(sem);
    raise( &reserveException );
}
static inline void
CpuMultiplexor::threadTerminateException( void **killMe )
{
    terminateException.terminate( killMe );
    raise( &terminateException );
}
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/MultiSimMux.h" 2
# 1 "../Src/MultiCpuMux.h" 1
#pragma once
# 1 "../Src/MultiCpuMuxExceptions.h" 1
#pragma once
class ExceptionRelocate : public ExceptionClass {
    int newCpu;
public:
    ExceptionRelocate();
    void cpu(int = -1);
    virtual void handleException();
};
inline
ExceptionRelocate::ExceptionRelocate()
{
}
inline void
ExceptionRelocate::cpu(int c)
{
    newCpu = c;
}
class ExceptionEnrollDismissCpu : public ExceptionClass {
    int enrollOrDismiss;
public:
    void enroll();
    void dismiss();
    virtual void handleException();
};
inline void
ExceptionEnrollDismissCpu::enroll()
{
    enrollOrDismiss = 1;
}
inline void
ExceptionEnrollDismissCpu::dismiss()
{
    enrollOrDismiss = 0;
}
# 12 "../Src/MultiCpuMux.h" 2
extern int CpuMultiplexors;
extern CpuMultiplexor *ThisCpu;
extern int CpuMuxDebugFlag;
extern SpinLock CpuCerrLock;
class MultiCpuMux : public CpuMultiplexor {
    friend class MultiSimMux;
protected:
    SpinFetchAndOp *globalCurrentEventsCounter;
    int oldGeneration;  
    void allocateLocalEventStructures(int,int);
    virtual void allocateEventStructures(int,int);
    virtual void deallocateEventStructures();
    virtual void addToAnother(int, Thread *);
    virtual Thread *remove();
    friend class ExceptionRelocate;
    ExceptionRelocate relocateException;
    friend class ExceptionEnrollDismissCpu;
    ExceptionEnrollDismissCpu enrollDismissCpuException;
public:
    MultiCpuMux(int debug = 0);
    virtual ~MultiCpuMux();
    virtual void fireItUp(int Cpus = 1, unsigned shared = (4196 * 500));
    virtual void warmThePot(int);
    virtual void stirItAround();
    virtual void coolItDown();
    virtual void enrollCpu();
    virtual void dismissCpu();
    virtual void add(Thread *);
};
# 12 "../Src/MultiSimMux.h" 2
extern double CurrentSimulatedTime;
extern const double NullTime;
class SpinBarrier;
class TimeSchedulerPQ;
class MultiSimMux : public SimulationMultiplexor, public MultiCpuMux {
protected:
    SpinLock *myPendingEventsLock;
    SpinBarrier *cpuBarrier;
    virtual int advanceTime();
    void allocateLocalEventStructures(int,int);
    virtual void allocateEventStructures(int,int);
    virtual void deallocateEventStructures();
public:
    MultiSimMux(int debug = 0, int barrierMaxLoops = 0);
    virtual void fireItUp(int Cpus = 1, unsigned shared = (4196 * 500));
    virtual void warmThePot(int);
    virtual void stirItAround();
    virtual void coolItDown();
};
# 11 "../Src/MonitorSimMux.h" 2
class Statistic;
class MonitorSimMux : public MultiSimMux {
public:
    MonitorSimMux(int debug = 0, int maxloops = 0);
    virtual void stirItAround();
    virtual void coolItDown();
    Statistic *threadsPerTick();
};
extern MonitorSimMux *ThisMonitorSimMux;
# 7 "../Src/MonitorSimMux.cc" 2
# 1 "../Src/SpinBarrier.h" 1
#pragma once
class SpinBarrier : SpinLock {
    short pHeight;
    volatile  short pCount;
    volatile  short generation;
    short pLoops;
    int pMaxLoops;
public:
    SpinBarrier( int h, int loops = 0 , int max = 0 );
    ~SpinBarrier();
    int rendezvous();
    void lowerBarrier();
    int height();
    void height(int h);
    int loops();
    void loops(int h);
    int maxLoops();
    void maxLoops(int h);
    int count();
};
inline
SpinBarrier::SpinBarrier( int h, int l, int m )
{
    pHeight = h;
    pLoops = l;
    pMaxLoops = m;
    pCount = 0;
}
inline int
SpinBarrier::height()
{
    return(pHeight);
}
inline int
SpinBarrier::loops()
{
    return(pLoops);
}
inline void
SpinBarrier::loops(int h)
{
    pLoops = h;
}
inline int
SpinBarrier::maxLoops()
{
    return(pMaxLoops);
}
inline void
SpinBarrier::maxLoops(int h)
{
    pMaxLoops = h;
}
inline int
SpinBarrier::count()
{
    return(pCount);
}
inline
SpinBarrier::~SpinBarrier()
{
    { if (( pCount == 0 )) ; else _assert( "pCount == 0", "../Src/SpinBarrier.h",108); } ;
}
inline int
SpinBarrier::rendezvous()
{
    { if (( (pCount+1) == pHeight )) ; else _assert( "(pCount+1) == pHeight", "../Src/SpinBarrier.h",115); } ;
    generation++;
    pCount = 0;
    return(1);
}
inline void
SpinBarrier::lowerBarrier()
{
    generation++;
    pCount = 0;
}
# 8 "../Src/MonitorSimMux.cc" 2
# 1 "../Src/Statistic.h" 1
#pragma once
# 1 "../Src/SampleStatistic.h" 1
#pragma once
class SampleStatistic {
protected:
    int	n;
    double x;
    double x2;
    double minValue, maxValue;
    double tval(double, int);
public :
    SampleStatistic();
    virtual void reset(); 
    virtual void operator+=(double);
    virtual int samples();
    virtual double mean();
    virtual double stdDev();
    virtual double var();
    virtual double min();
    virtual double max();
    virtual double sum();
    virtual double confidence(int p_percentage);
    virtual double confidence(double p_value);
    void            error(char* msg);
};
static inline
SampleStatistic::SampleStatistic()
{
    reset();
}
# 72 "../Src/SampleStatistic.h"
# 11 "../Src/Statistic.h" 2
class Statistic : public SampleStatistic {
public:
    virtual void classPrintOn(ostream&);
};
inline ostream&
operator<<(ostream& strm, Statistic& ob)
{
    ob.classPrintOn(strm);
    return strm;
}
# 9 "../Src/MonitorSimMux.cc" 2
# 1 "../Src/SpinFetchAndOp.h" 1
#pragma once
class SpinFetchAndOp : public SpinLock {
    int	data;
public:
    SpinFetchAndOp(int);
    void set(int);
    int add(int);
    int unlockedAdd(int);
    int value();
};
inline
SpinFetchAndOp::SpinFetchAndOp(int d)
{
    data = d;
}
inline void
SpinFetchAndOp::set(int d)
{
    data = d ;
}
static inline int SpinFetchAndOp::add(int d)
{
    int was = data;
    data += d;
    return(was);
}
inline int
SpinFetchAndOp::unlockedAdd(int d)
{
    int was = data;
    data += d;
    return(was);
}
inline int
SpinFetchAndOp::value()
{
    return(data);
}
# 10 "../Src/MonitorSimMux.cc" 2
static SpinLock statsLock;
static Statistic ThreadsPerTick;
static int threadsThisTick[1 ];
extern int CpuMuxDebugFlag;
MonitorSimMux *ThisMonitorSimMux;
MonitorSimMux::MonitorSimMux(int debug, int maxloops) : (debug, maxloops)
{
    CpuMultiplexor::pNameTemplate = "MonitorSimMux";
    ThisMonitorSimMux = this;
    sprintf(CpuMultiplexor::nameSpace, "[%s-%d] ",
	    CpuMultiplexor::pNameTemplate, CpuMultiplexor::iYam);
    CpuMultiplexor::pName = CpuMultiplexor::nameSpace;
}
void
MonitorSimMux::stirItAround()
{
    while( ! *MultiSimMux::terminated )
    {
	MultiSimMux::stirItAround();
	if (CpuMuxDebugFlag) {
	    CpuCerrLock.reserve();
	    cerr << name() << "Finished with current batch, advance time\n";
	    CpuCerrLock.release();
	}
	int added = advanceTime();
	threadsThisTick[MultiSimMux::iYam] += added;
	cpuBarrier -> rendezvous();
	if (MultiSimMux::iYam == 0) {
	    int total = 0;
	    for (int i = 0 ; i < CpuMultiplexors; i++ ) {
		total += threadsThisTick[i];
		threadsThisTick[i] = 0;
	    }
	    double dtotal = double(total);
	    ThreadsPerTick += dtotal;
	}
    }
}
void
MonitorSimMux::coolItDown()
{
    MultiSimMux::coolItDown();
    CpuCerrLock.reserve();
    cerr << name() << "Statistics for threads per tick\n";
    cerr << name() << ThreadsPerTick << "\n";
    cerr << name() << "Min = " << ThreadsPerTick.min() << "\n";
    cerr << name() << "Max = " << ThreadsPerTick.max() << "\n";
    CpuCerrLock.release();
}
Statistic *
MonitorSimMux::threadsPerTick()
{
    return (&ThreadsPerTick);
}