Article View: gnu.g++.bug
Article #163fatal signal for g++ 2.2.2.
From: Douglas C. Schmidt
Date: Mon, 03 Aug 1992 17:17
Date: Mon, 03 Aug 1992 17:17
1435 lines
41430 bytes
41430 bytes
The following program kills g++ 2.2.2:
% ~/bin/g++ -v x.c
Reading specs from /usr/gnu/version/gcc/2.2.2/lib/gcc-lib/sparc-sun-sunos4.1/2.2.2/specs
gcc version 2.2.2
/usr/gnu/version/gcc/2.2.2/lib/gcc-lib/sparc-sun-sunos4.1/2.2.2/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ -D__sparc -D__sun -D__unix x.c /i0/da/ub/schmidt/.trash/cca05133.i
GNU CPP version 2.2.2 (sparc)
/usr/gnu/version/gcc/2.2.2/lib/gcc-lib/sparc-sun-sunos4.1/2.2.2/cc1plus /i0/da/ub/schmidt/.trash/cca05133.i -quiet -dumpbase x.cc -version -o /i0/da/ub/schmidt/.trash/cca05133.s
GNU C++ version 2.2.2 (sparc) compiled by GNU C version 2.2.2.
cp-decl.c:2678: failed assertion `*ptr == NULL_TREE || *ptr == newval'
gcc-2.2.2: Internal compiler error: program cc1plus got fatal signal 6
----------------------------------------
extern "C" {
typedef int ptrdiff_t;
typedef int size_t;
typedef short unsigned int wchar_t;
}
extern "C" {
int abs(int);
void volatile abort(void);
double atof(const char*);
int atoi(const char*);
long atol(const char*);
int atexit(auto void (*p) (void));
int bsearch (const void *, const void *, size_t,
size_t, auto int (*ptf)(const void*, const void*));
void* calloc(size_t, size_t);
void cfree(void*);
void volatile exit(int);
char* fcvt(double, int, int*, int*);
void free(void*);
char* getenv(const char*);
int getopt(int, char * const *, const char*);
int getpw(int, char*);
char* gcvt(double, int, char*);
char* ecvt(double, int, int*, int*);
extern char** environ;
long labs(long);
void* malloc(size_t);
size_t malloc_usable_size(void*);
int putenv(const char*);
extern char* optarg;
extern int opterr;
extern int optind;
void qsort(void*, size_t, size_t, auto int (*ptf)(void*,void*));
int rand(void);
void* realloc(void*, size_t);
int setkey(const char*);
int srand(unsigned int);
double strtod(const char*, char**);
long strtol(const char*, char**, int);
unsigned long stroul(const char**, int);
int system(const char*);
long random(void);
void srandom(int);
char* setstate(char*);
char* initstate(unsigned, char*, int);
double drand48(void);
void lcong48(short*);
long jrand48(short*);
long lrand48(void);
long mrand48(void);
long nrand48(short*);
short* seed48(short*);
void srand48(long);
char* ctermid(char*);
char* cuserid(char*);
char* tempnam(const char*, const char*);
char* tmpnam(char*);
}
extern "C" {
char* strcat(char*, const char*);
char* strchr(const char*, int);
int strcmp(const char*, const char*);
int strcoll(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*);
char* strstr(const char*, const char *);
char* strtok(char*, const char*);
int strxfrm(char*, const char*, int );
char* index(const char*, int);
char* rindex(const char*, int);
}
extern "C" {
void* memalign (...) ;
void* memccpy (...) ;
void* memchr (...) ;
int memcmp (...) ;
void* memcpy (...) ;
void* memmove (...) ;
void* memset (...) ;
int ffs (...) ;
int getpagesize (...) ;
void* valloc (...) ;
void bcopy (...) ;
int bcmp (...) ;
void bzero (...) ;
}
extern "C" {
extern "C"
{
typedef int sigset_t;
typedef unsigned int speed_t;
typedef unsigned long tcflag_t;
typedef unsigned char cc_t;
typedef int pid_t;
typedef unsigned short mode_t;
typedef short nlink_t;
typedef long clock_t;
typedef long time_t;
typedef int int ;
typedef int ptrdiff_t;
typedef unsigned short wchar_t;
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef struct _physadr_t { int r[1]; } *physadr_t;
typedef struct label_t {
int val[2];
} label_t;
typedef struct _quad_t { long val[2]; } quad_t;
typedef long daddr_t;
typedef char * caddr_t;
typedef unsigned long ino_t;
typedef short dev_t;
typedef long off_t;
typedef unsigned short uid_t;
typedef unsigned short gid_t;
typedef long key_t;
typedef char * addr_t;
typedef long fd_mask;
typedef struct fd_set {
fd_mask fds_bits[(((256 )+(( (sizeof (fd_mask) * 8 ) )-1))/( (sizeof (fd_mask) * 8 ) )) ];
} fd_set;
}
extern void _exit( );
extern int access( );
extern unsigned alarm( );
extern int chdir( );
extern int __hide_chmod ( );
extern int __hide_chown ( );
extern int close( );
extern char *ctermid( );
extern char *cuserid( );
extern int dup( );
extern int dup2( );
extern int __hide_execl ( );
extern int __hide_execle ( );
extern int __hide_execlp ( );
extern int execv( );
extern int execve( );
extern int execvp( );
extern pid_t fork( );
extern long fpathconf( );
extern char *getcwd( );
extern gid_t getegid( );
extern uid_t geteuid( );
extern gid_t getgid( );
extern int getgroups( );
extern char *getlogin( );
extern pid_t getpgrp( );
extern pid_t getpid( );
extern pid_t getppid( );
extern uid_t getuid( );
extern int isatty( );
extern int link( );
extern off_t lseek( );
extern long pathconf( );
extern int pause( );
extern int pipe( );
extern int read( );
extern int rmdir( );
extern int __hide_setgid ( );
extern int setpgid( );
extern pid_t setsid( );
extern int __hide_setuid ( );
extern unsigned sleep( );
extern long sysconf( );
extern pid_t tcgetpgrp( );
extern int tcsetpgrp( );
extern char *ttyname( );
extern int unlink( );
extern int write( );
extern void volatile _exit(int);
extern unsigned alarm (...) ;
extern int brk (...) ;
extern int chdir (...) ;
extern int chmod (...) ;
extern int chown (const char*, unsigned short , unsigned short );
extern int close (...) ;
extern char* crypt (...) ;
extern int dup (...) ;
extern int dup2 (...) ;
extern void encrypt (...) ;
extern int execl (const char*, const char *, ...);
extern int execle (const char*, const char *, ...);
extern int execlp (const char*, const char*, ...);
extern int exect (...) ;
extern int execv (...) ;
extern int execve (...) ;
extern int execvp (...) ;
extern int fchown (int, unsigned short , unsigned short );
extern int fork (...) ;
extern int fsync (...) ;
extern int ftruncate (...) ;
extern char* getcwd (...) ;
extern int getdomainname (...) ;
extern int getdtablesize (...) ;
extern int getgroups (...) ;
extern unsigned short geteuid (...) ;
extern unsigned short getegid (...) ;
extern unsigned short getgid (...) ;
extern long gethostid (...) ;
extern int gethostname (...) ;
extern int getpgrp (...) ;
extern int getpid (...) ;
extern int getppid (...) ;
extern char* getlogin (...) ;
extern char* getpass (...) ;
extern unsigned short getuid (...) ;
extern int ioctl (int, int, ... );
extern int isatty (...) ;
extern int link (...) ;
extern int mkstemp (...) ;
extern char* mktemp (...) ;
extern int nice (...) ;
extern int pause (...) ;
extern int pipe (...) ;
extern int readlink (...) ;
extern int rename (...) ;
extern int rmdir (...) ;
extern void* sbrk (...) ;
extern int syscall (...) ;
extern int setgid (unsigned short );
extern int sethostname (...) ;
extern int setpgrp (...) ;
extern int setregid (...) ;
extern int setreuid (...) ;
extern int setuid (unsigned short );
extern unsigned sleep (...) ;
extern void swab (...) ;
extern int symlink (...) ;
extern long sysconf (...) ;
extern int truncate (...) ;
extern char* ttyname (...) ;
extern int ttyslot (...) ;
extern int unlink (...) ;
extern int vfork (...) ;
extern int vadvise (...) ;
extern int vhangup (...) ;
extern long lseek (...) ;
extern int read (...) ;
extern int write (...) ;
extern int access (...) ;
extern int flock (...) ;
}
extern "C" {
extern struct _iobuf {
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
int _bufsiz;
short _flag;
char _file;
} _iob[];
extern struct _iobuf *__hide_fopen ();
extern struct _iobuf *__hide_fdopen ();
extern struct _iobuf *__hide_freopen ();
extern struct _iobuf *__hide_popen ();
extern struct _iobuf *tmpfile();
extern long __hide_ftell ();
extern char *fgets();
extern char *gets();
extern char *__hide_sprintf ();
extern char *ctermid();
extern char *cuserid();
extern char *__hide_tempnam ();
extern char *tmpnam();
}
extern "C" {
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 *);
void perror(const char*);
struct _iobuf * popen(const char*, const char*);
int printf(const char* ...);
int 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);
int setlinebuf(struct _iobuf *);
int setvbuf(struct _iobuf *, char*, int, int );
int sscanf(char*, const char* ...);
struct _iobuf * tmpfile();
int ungetc(int, struct _iobuf *);
int vfprintf (...) ;
int vprintf (...) ;
char* sprintf (...) ;
char* vsprintf (...) ;
extern int _filbuf (...) ;
extern int _flsbuf (...) ;
}
extern "C" {
extern int errno;
extern char* sys_errlist[];
extern int sys_nerr;
extern int errno;
void perror(const char*);
char* strerr(int);
}
extern "C" {
struct flock {
short l_type;
short l_whence;
long l_start;
long l_len;
short l_pid;
short l_xxx;
};
struct eflock {
short l_type;
short l_whence;
long l_start;
long l_len;
short l_pid;
short l_xxx;
long l_rpid;
long l_rsys;
};
extern "C"
{
struct stat {
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
short st_nlink;
uid_t st_uid;
gid_t st_gid;
dev_t st_rdev;
off_t st_size;
time_t st_atime;
int st_spare1;
time_t st_mtime;
int st_spare2;
time_t st_ctime;
int st_spare3;
long st_blksize;
long st_blocks;
long st_spare4[2];
};
int __hide_chmod ( );
int fstat( );
int mkdir( );
int mkfifo( );
int stat( );
mode_t umask( );
extern int chmod (...) ;
extern int stat (...) ;
extern int lstat (...) ;
extern int fstat (...) ;
}
int __hide_open ( );
int __hide_creat ( );
int __hide_fcntl ( );
int fcntl(int, int, ...);
int creat (...) ;
int open (...) ;
}
extern "C" {
int strcasecmp (...) ;
}
extern "C" {
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
char *tm_zone;
long tm_gmtoff;
};
extern struct tm *__hide_gmtime (), *__hide_localtime ();
extern char *__hide_asctime (), *__hide_ctime ();
extern void __hide_tzset (), __hide_tzsetwall ();
extern int dysize();
extern time_t timelocal(), timegm();
extern char* asctime (...) ;
extern char* ctime (...) ;
double difftime (...) ;
extern struct tm* gmtime (...) ;
extern struct tm* localtime (...) ;
extern long mktime(struct tm*);
extern int strftime (...) ;
extern void tzset();
extern void tzsetwall();
extern int getitimer(int, struct itimerval*);
extern int setitimer (...) ;
extern int gettimeofday(struct timeval*, struct timezone*);
extern int settimeofday (...) ;
extern int stime (...) ;
extern int dysize(int);
long clock(void);
long time(long *);
unsigned ualarm(unsigned, unsigned);
unsigned usleep(unsigned);
void profil (...) ;
}
extern "C"
{
struct linger {
int l_onoff;
int l_linger;
};
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
struct sockproto {
u_short sp_family;
u_short sp_protocol;
};
struct msghdr {
caddr_t msg_name;
int msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
caddr_t msg_accrights;
int msg_accrightslen;
};
int select (...) ;
int accept (...) ;
int bind (...) ;
int connect (...) ;
int getsockname (...) ;
int getpeername (...) ;
int getsockopt(int, int, int, void*, int*);
int listen(int, int);
int rcmd (...) ;
int recv(int, void*, int, int);
int recvfrom (...) ;
int recvmsg(int, struct msghdr*, int);
int rexec(char**, int, const char*, const char*, const char*, int*);
int rresvport(int*);
int send (...) ;
int sendto (...) ;
int sendmsg (...) ;
int setsockopt (...) ;
int shutdown(int, int);
int socket(int, int, int);
int socketpair(int, int, int, int sv[2]);
}
extern "C"
{
struct timeval {
long tv_sec;
long tv_usec;
};
struct timezone {
int tz_minuteswest;
int tz_dsttime;
};
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
};
}
extern "C"
{
struct rusage {
struct timeval ru_utime;
struct timeval ru_stime;
long ru_maxrss;
long ru_ixrss;
long ru_idrss;
long ru_isrss;
long ru_minflt;
long ru_majflt;
long ru_nswap;
long ru_inblock;
long ru_oublock;
long ru_msgsnd;
long ru_msgrcv;
long ru_nsignals;
long ru_nvcsw;
long ru_nivcsw;
};
struct rlimit {
int rlim_cur;
int rlim_max;
};
int getrusage(int, struct rusage*);
int getrlimit (int resource, struct rlimit *rlp);
int setrlimit (...) ;
long ulimit(int, long);
int getpriority(int, int);
int setpriority(int, int, int);
}
struct iovec {
caddr_t iov_base;
int iov_len;
};
struct uio {
struct iovec *uio_iov;
int uio_iovcnt;
off_t uio_offset;
short uio_segflg;
short uio_fmode;
int uio_resid;
};
enum uio_rw { UIO_READ, UIO_WRITE };
extern "C" {
extern caddr_t mmap();
}
struct sockaddr_un {
short sun_family;
char sun_path[108];
};
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
extern "C" {
extern "C" {
extern void __eprintf (const char *, const char *, int, const char *);
}
}
extern "C"
{
extern "C" {
typedef int faultcode_t;
void (*__hide_signal ())();
void (*sigset())();
int sighold();
int sigrelse();
int sigignore();
struct sigvec {
void (*sv_handler)();
int sv_mask;
int sv_flags;
};
struct sigstack {
char *ss_sp;
int ss_onstack;
};
struct sigcontext {
int sc_onstack;
int sc_mask;
int sc_sp;
int sc_pc;
int sc_npc;
int sc_psr;
int sc_g1;
int sc_o0;
int sc_wbcnt;
char *sc_spbuf[31 ];
int sc_wbuf[31 ][16];
};
struct sigaction {
void (*sa_handler)();
sigset_t sa_mask;
int sa_flags;
};
void (*__hide_signal ())();
int kill( );
int sigaction(
);
int sigaddset( );
int sigdelset( );
int sigemptyset( );
int sigfillset( );
int sigismember( );
int sigpending( );
int sigprocmask( );
int sigsuspend( );
}
}
extern "C"
{
pid_t wait (int *);
unsigned long inet_addr();
char *inet_ntoa();
struct in_addr inet_makeaddr();
unsigned long inet_network();
extern "C"
{
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
struct netent {
char *n_name;
char **n_aliases;
int n_addrtype;
unsigned long n_net;
};
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
struct protoent {
char *p_name;
char **p_aliases;
int p_proto;
};
struct rpcent {
char *r_name;
char **r_aliases;
int r_number;
};
struct hostent *gethostbyname(), *gethostbyaddr(), *gethostent();
struct netent *getnetbyname(), *getnetbyaddr(), *getnetent();
struct servent *getservbyname(), *getservbyport(), *getservent();
struct protoent *getprotobyname(), *getprotobynumber(), *getprotoent();
struct rpcent *getrpcbyname(), *getrpcbynumber(), *getrpcent();
extern int h_errno;
}
extern "C" {
struct direct {
off_t d_off;
u_long d_fileno;
u_short d_reclen;
u_short d_namlen;
char d_name[255 + 1];
};
typedef struct _dirdesc {
int dd_fd;
long dd_loc;
long dd_size;
long dd_bsize;
long dd_off;
char *dd_buf;
} DIR;
extern DIR *__hide_opendir ();
extern struct direct *__hide_readdir ();
extern long __hide_telldir ();
extern void __hide_seekdir ();
extern int __hide_closedir ();
DIR *opendir(const char *);
int closedir(DIR *);
struct direct *readdir(DIR *);
long telldir(DIR *);
void seekdir(DIR *, long);
}
}
struct mallinfo {
int arena;
int ordblks;
int smblks;
int hblks;
int hblkhd;
int usmblks;
int fsmblks;
int uordblks;
int fordblks;
int keepcost;
int mxfast;
int nlblks;
int grain;
int uordbytes;
int allocated;
int treeoverhead;
};
typedef char * malloc_t;
extern malloc_t calloc( );
extern int free( );
extern malloc_t malloc( );
extern malloc_t realloc( );
extern int mallopt();
extern struct mallinfo mallinfo();
extern "C" {
extern char _ctype_[];
extern int toupper (...) ;
extern int tolower (...) ;
}
extern "C" {
typedef void (*SignalHandler) (...);
typedef int (*SSignalHandler) (...);
extern SignalHandler signal (...) ;
extern SSignalHandler ssignal (...) ;
extern int gsignal (...) ;
extern int kill (...) ;
extern int killpg (...) ;
extern int siginterrupt (...) ;
extern void psignal (...) ;
extern int sigsetmask (...) ;
extern int sigblock (...) ;
extern int sigpause (...) ;
extern int sigvec (...) ;
}
extern "C"
{
}
struct ttychars {
char tc_erase;
char tc_kill;
char tc_intrc;
char tc_quitc;
char tc_startc;
char tc_stopc;
char tc_eofc;
char tc_brkc;
char tc_suspc;
char tc_dsuspc;
char tc_rprntc;
char tc_flushc;
char tc_werasc;
char tc_lnextc;
};
struct tchars {
char t_intrc;
char t_quitc;
char t_startc;
char t_stopc;
char t_eofc;
char t_brkc;
};
struct ltchars {
char t_suspc;
char t_dsuspc;
char t_rprntc;
char t_flushc;
char t_werasc;
char t_lnextc;
};
struct sgttyb {
char sg_ispeed;
char sg_ospeed;
char sg_erase;
char sg_kill;
short sg_flags;
};
struct winsize {
unsigned short ws_row;
unsigned short ws_col;
unsigned short ws_xpixel;
unsigned short ws_ypixel;
};
struct ttysize {
int ts_lines;
int ts_cols;
};
extern "C" {
struct passwd {
char *pw_name;
char *pw_passwd;
int pw_uid;
int pw_gid;
char *pw_age;
char *pw_comment;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
extern struct passwd *c_proto_getpwent ();
struct comment {
char *c_dept;
char *c_name;
char *c_acct;
char *c_bin;
};
struct passwd *c_proto_getpwuid ( );
struct passwd *c_proto_getpwnam ( );
extern struct passwd* getpwent();
extern struct passwd* getpwuid(int);
extern struct passwd* getpwnam(const char*);
extern int setpwent();
extern int endpwent();
}
class Trace
{
private:
static int nesting_depth;
static int nesting_indent;
static int enable_tracing;
char *name;
public:
Trace (char *n, int line = 0, char *file = "");
~Trace (void);
static void start_tracing (void);
static void stop_tracing (void);
static void set_nesting_indent (int indent);
};
class Time_Value
{
public:
Time_Value (long sec = 0, long usec = 0);
Time_Value (timeval t);
long get_sec (void);
void set_sec (long sec);
long get_usec (void);
void set_usec (long usec);
operator timeval ();
friend Time_Value operator + (Time_Value tv1, Time_Value tv2);
friend Time_Value operator - (Time_Value tv1, Time_Value tv2);
friend int operator < (Time_Value tv1, Time_Value tv2);
friend int operator > (Time_Value tv1, Time_Value tv2);
friend int operator == (Time_Value tv1, Time_Value tv2);
friend int operator != (Time_Value tv1, Time_Value tv2);
private:
long tv_sec;
long tv_usec;
enum { ONE_SECOND = 1000000L };
};
class IPC_SAP
{
protected:
int sok_fd;
IPC_SAP (void);
IPC_SAP (int type, int protocol_family, int async = 0, int protocol = 0);
virtual ~IPC_SAP (void);
public:
int OK (void);
int open (int type, int protocol_family, int async = 0, int protocol = 0);
int close (void);
int set_option (int level, int option, void *optval, int optlen);
int get_option (int level, int option, void *optval, int &optlen);
int make_async (void);
int make_sync (void);
int get_fd (void);
};
class IO_Handler
{
protected:
IO_Handler (void);
public:
virtual ~IO_Handler (void);
virtual int input_ready (IPC_SAP *);
virtual int output_ready (IPC_SAP *);
virtual int exception_raised (IPC_SAP *);
virtual void timer_expired (Time_Value tv);
};
class FD_Set : public fd_set
{
public:
FD_Set (void);
void zero (void);
void set_bit (int);
void clr_bit (int);
int is_set (int) const;
int any_set (void) const;
int num_set (void) const;
private:
enum
{
MAX_SIZE = 256 ,
WORD_SIZE = (sizeof (fd_mask) * 8 ) ,
};
int count_bits (unsigned long n) const;
static const char nbits[];
};
class Timer_Queue
{
public:
Timer_Queue (void);
virtual ~Timer_Queue (void);
int is_empty (void) const;
static Time_Value zero_time (void);
Time_Value earliest_time (void) const;
static Time_Value current_time (void);
void insert (Time_Value, IO_Handler *);
void remove (IO_Handler *);
void expire (Time_Value);
private:
struct Timer
{
Timer (Time_Value t, IO_Handler *h, Timer *n);
Time_Value timer_value;
IO_Handler *handler;
Timer *next;
};
Timer *_first;
static Time_Value _zero_time;
};
class Dispatcher
{
public:
enum Dispatcher_Mask
{
READ_MASK,
WRITE_MASK,
EXCEPT_MASK
};
Dispatcher (void);
virtual ~Dispatcher (void);
virtual int link (IPC_SAP *, Dispatcher_Mask, IO_Handler *);
virtual IO_Handler *handler (IPC_SAP *, Dispatcher_Mask) const;
virtual int unlink (IPC_SAP *);
virtual void start_timer (Time_Value tv, IO_Handler *);
virtual void stop_timer (IO_Handler *);
virtual int set_ready (IPC_SAP *sp, Dispatcher_Mask);
virtual void dispatch (void);
virtual int dispatch (Time_Value &tv);
static Dispatcher &instance (void);
static void instance (Dispatcher *);
protected:
virtual int attach (IPC_SAP *, Dispatcher_Mask, IO_Handler *);
virtual int detach (int fd);
virtual int dispatch (Time_Value *);
virtual int any_ready (void) const;
virtual int fill_in_ready (FD_Set &, FD_Set &, FD_Set &);
virtual int wait_for (FD_Set &, FD_Set &, FD_Set &, Time_Value *);
virtual Time_Value *calculate_timeout (Time_Value *) const;
virtual void notify (int, FD_Set &, FD_Set &, FD_Set &);
virtual void handle_error (void);
virtual void check_connections (void);
protected:
struct Table_Tuple;
Table_Tuple *_rtable;
Table_Tuple *_wtable;
Table_Tuple *_etable;
Timer_Queue *_queue;
int _nfds;
FD_Set *_rmask;
FD_Set *_wmask;
FD_Set *_emask;
FD_Set *_rmaskready;
FD_Set *_wmaskready;
FD_Set *_emaskready;
private:
struct Table_Tuple
{
IO_Handler *iop;
IPC_SAP *sp;
};
private:
static Dispatcher *_instance;
private:
Dispatcher (const Dispatcher &);
Dispatcher &operator = (const Dispatcher &);
};
class SAP_Addr
{
public:
SAP_Addr (void);
SAP_Addr (int type, int size);
int get_size (void) const;
void set_size (int size);
int get_type (void) const;
void set_type (int type);
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &sap) const;
virtual int operator != (const SAP_Addr &sap) const;
protected:
int addr_type;
int addr_size;
};
extern const SAP_Addr sap_any;
class IPC_SAP_Connect : virtual public IPC_SAP
{
protected:
IPC_SAP_Connect (void);
public:
int get_peer_info (SAP_Addr &);
int get_host_info (SAP_Addr &);
int send (const char buf[], int n, int flags = 0);
int recv (char buf[], int n, int flags = 0);
int send (const iovec iov[], int n);
int recv (iovec iov[], int n);
};
class IPC_SAP_Stream : public IPC_SAP_Connect
{
friend class IPC_SAP_Listener;
private:
typedef IPC_SAP PARENT;
typedef IPC_SAP BASE;
IPC_SAP_Stream (const IPC_SAP_Stream &);
public:
IPC_SAP_Stream (void);
IPC_SAP_Stream (const SAP_Addr &remote_sap, int protcol_family = 2 , int async = 0, int protocol = 0);
int open (const SAP_Addr &remote_sap, int protcol_family = 2 , int async = 0, int protocol = 0);
IPC_SAP_Stream &operator= (const IPC_SAP_Stream &);
int close_reader (void);
int close_writer (void);
int send_n (const char buf[], int n, int flags = 0);
int recv_n (char buf[], int n, int flags = 0);
};
class IPC_SAP_Listener : public IPC_SAP
{
protected:
int micro_second_delay;
IPC_SAP_Listener (const IPC_SAP_Listener &);
protected:
int shared_open (const SAP_Addr &remote_sap, int backlog);
int shared_accept (int restart);
public:
IPC_SAP_Listener (void);
IPC_SAP_Listener (const SAP_Addr &remote_sap, int micro_sec_delay = -1, int async = 0, int protocol_family = 2 , int backlog = 5, int protocol = 0);
int open (const SAP_Addr &remote_sap, int micro_sec_delay = -1, int async = 0, int protocol_family = 2 , int backlog = 5, int protocol = 0);
int accept (IPC_SAP_Stream &new_ipc_sap, int restart = 1);
int operator () (IPC_SAP_Stream &new_ipc_sap, int restart = 1);
};
class Local_IPC_SAP : virtual public IPC_SAP
{
protected:
Local_IPC_SAP (void);
public:
int send_fd (const int fds);
int recv_fd (int &fds);
};
class Local_IPC_SAP_Stream : public IPC_SAP_Stream, public Local_IPC_SAP
{
friend class Local_IPC_SAP_Listener;
private:
Local_IPC_SAP_Stream (const Local_IPC_SAP_Stream &lss);
int get_peer_info (SAP_Addr &);
int get_host_info (SAP_Addr &);
public:
Local_IPC_SAP_Stream (void);
Local_IPC_SAP_Stream (const SAP_Addr &remote_sap, int protocol_family = 1 , int async = 0, int protocol = 0);
int open (const SAP_Addr &remote_sap, int protcol_family = 1 , int async = 0, int protocol = 0);
Local_IPC_SAP_Stream &operator= (const Local_IPC_SAP_Stream &);
};
class Local_IPC_SAP_Listener : public IPC_SAP_Listener
{
private:
Local_IPC_SAP_Listener (const Local_IPC_SAP_Listener &);
public:
Local_IPC_SAP_Listener (void);
Local_IPC_SAP_Listener (const SAP_Addr &remote_sap, int micro_sec_delay = -1, int async = 0, int protocol_family = 1 , int backlog = 5, int protocol = 0);
int open (const SAP_Addr &remote_sap, int micro_sec_delay= -1, int async = 0, int protocol_family = 1 , int backlog = 5, int protocol = 0);
int accept (Local_IPC_SAP_Stream &new_ipc_sap, int restart = 1);
int operator () (Local_IPC_SAP_Stream &new_ipc_sap, int restart = 1);
};
class IPC_SAP_Dgram : virtual public IPC_SAP
{
private:
IPC_SAP_Dgram (const IPC_SAP_Dgram &);
int shared_open (const SAP_Addr &local);
public:
IPC_SAP_Dgram (void);
IPC_SAP_Dgram (const SAP_Addr &local, int protocol_family = 2 , int async = 0, int protocol = 0);
int open (const SAP_Addr &local, int protocol_family = 2 , int async = 0, int protocol = 0);
IPC_SAP_Dgram &operator= (const IPC_SAP_Dgram &);
int send (const char buf[], int n, SAP_Addr &addr, int flags = 0);
int recv (char buf[], int n, SAP_Addr &addr, int flags = 0);
};
class IPC_SAP_CODgram : virtual public IPC_SAP_Connect
{
private:
IPC_SAP_CODgram (const IPC_SAP_CODgram &);
int shared_open (const SAP_Addr &local_sap, const SAP_Addr &remote_sap);
public:
IPC_SAP_CODgram (void);
IPC_SAP_CODgram (const SAP_Addr &local_sap, const SAP_Addr &remote_sap = sap_any, int protocol_family = 2 , int async = 0, int protocol = 0);
int open (const SAP_Addr &local_sap, const SAP_Addr &remote_sap = sap_any, int protocol_family = 2 , int async = 0, int protocol = 0);
IPC_SAP_CODgram &operator = (const IPC_SAP_CODgram &);
};
class Local_IPC_SAP_CODgram : public Local_IPC_SAP, public IPC_SAP_CODgram
{
private:
Local_IPC_SAP_CODgram (const Local_IPC_SAP_CODgram &);
public:
Local_IPC_SAP_CODgram (void);
Local_IPC_SAP_CODgram (const SAP_Addr &local_sap, const SAP_Addr &remote_sap = sap_any, int protocol_family = 1 , int async = 0, int protocol = 0);
int open (const SAP_Addr &local_sap, const SAP_Addr &remote_sap = sap_any, int protocol_family = 1 , int async = 0, int protocol = 0);
Local_IPC_SAP_CODgram &operator= (const Local_IPC_SAP_CODgram &);
};
class Local_IPC_SAP_Dgram : public IPC_SAP_Dgram, public Local_IPC_SAP
{
private:
Local_IPC_SAP_Dgram (const Local_IPC_SAP_Dgram &);
public:
Local_IPC_SAP_Dgram (void);
Local_IPC_SAP_Dgram (const SAP_Addr &local, int protocol_family = 1 , int async = 0, int protocol = 0);
int open (const SAP_Addr &local, int protocol_family = 1 , int async = 0, int protocol = 0);
Local_IPC_SAP_Dgram &operator= (const Local_IPC_SAP_Dgram &);
};
class SAP_UNIX_Addr : public SAP_Addr
{
public:
SAP_UNIX_Addr (void);
SAP_UNIX_Addr (const SAP_UNIX_Addr &sa);
SAP_UNIX_Addr (const char rendezvous_point[]);
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &SAP) const;
virtual int operator != (const SAP_Addr &SAP) const;
const char *get_path_name (void);
private:
sockaddr_un unix_addr;
};
class SAP_INET_Addr : public SAP_Addr
{
public:
SAP_INET_Addr (void);
SAP_INET_Addr (const SAP_INET_Addr &);
SAP_INET_Addr (short port_number, const char host_name[]);
SAP_INET_Addr (short port_number, long ip_addr = (u_long)0x00000000 );
virtual void *get_addr (void) const;
virtual int operator == (const SAP_Addr &SAP) const;
virtual int operator != (const SAP_Addr &SAP) const;
const char *get_host_name (void);
const char *get_host_addr (void);
short get_port_number (void);
private:
sockaddr_in inet_addr;
};
static int debug = 0;
static int async = 0;
Dispatcher dispatcher;
static char *program_name;
static short port_number = 10000;
static char *rendezvous_stream = "/tmp/foo_stream";
static char *rendezvous_dgram = "/tmp/foo_dgram";
static char *rendezvous_pipe = "/tmp/foo_pipe";
static Local_IPC_SAP_Listener l_accept;
static IPC_SAP_Listener r_accept;
static Local_IPC_SAP_Dgram l_dgram;
static IPC_SAP_Dgram r_dgram;
static Local_IPC_SAP_Listener l_pipe_accept;
static void print_usage_and_die (void)
{
Trace ____ ("print_usage_and_die", 44, "server_test.C") ;
::fprintf ((&_iob[2]) , "usage: %s [-a] [-d] [-p portnum] [-r rendezvous_dgram] [-s rendezvous_stream] [-ton|-toff]\n",
::program_name);
::exit (1);
}
void
parse_args (int argc, char *argv[])
{
Trace ____ ("parse_args", 53, "server_test.C") ;
extern char *optarg;
extern int optind;
int c;
int tracing = 1;
while ((c = ::getopt (argc, argv, "adp:r:s:t:")) != -1)
switch (c)
{
case 'a':
::async = 1;
break;
case 'd':
::debug = 1;
break;
case 'p':
::port_number = ::atoi (optarg);
break;
case 'r':
::rendezvous_dgram = optarg;
break;
case 's':
::rendezvous_stream = optarg;
break;
case 't':
if (::strcmp (optarg, "off") == 0)
{
Trace::stop_tracing ();
tracing = 0;
}
else if (strcmp (optarg, "on") == 0)
{
Trace::start_tracing ();
tracing = 1;
}
break;
default:
print_usage_and_die ();
break;
}
if (debug)
::fprintf ((&_iob[2]) ,
"%srunning asynchronously\n"
"rendezvous_dgram = %s\n"
"rendezvous_stream = %s\n"
"trace = %s\n"
"port_number = %d\n",
::async ? "" : "not ", ::rendezvous_dgram, ::rendezvous_stream, tracing ? "on" : "off", ::port_number);
}
char *
upper_case (char s[], int n)
{
Trace ____ ("upper_case", 108, "server_test.C") ;
while (--n >= 0)
if (((_ctype_+1)[s[n]]&02 ) )
s[n] = toupper (s[n]);
return s;
}
class Handle_L_Stream : public IO_Handler
{
public:
virtual int input_ready (IPC_SAP *sp)
{
Trace ____ ("input_ready", 123, "server_test.C") ;
Local_IPC_SAP_Listener *accept = (Local_IPC_SAP_Listener *) sp;
fprintf ((&_iob[2]) , "fd = %d\n", accept->get_fd ());
Local_IPC_SAP_Stream new_local_stream;
int fd = -1;
char buf[1024 ];
if (accept->accept (new_local_stream) == -1)
return -1;
if (new_local_stream.Local_IPC_SAP::recv_fd (fd) == -1)
return -1;
else if (::debug)
::fprintf ((&_iob[2]) , "received file descriptor %d\n", fd);
::puts ("----------------------------------------");
for (int n; n = ::read (fd, buf, sizeof buf); )
::write (1, buf, n);
::puts ("----------------------------------------");
if (::close (fd) == -1)
return -1;
return 0;
}
} handle_l_stream;
class Handle_L_Pipe : public IO_Handler
{
public:
virtual int input_ready (IPC_SAP *sp)
{
Trace ____ ("handle_l_pipe", 162, "server_test.C") ;
Local_IPC_SAP_Listener *accept = (Local_IPC_SAP_Listener *) sp;
Local_IPC_SAP_Stream new_local_stream;
int n;
int fd1 = -1;
int fd2 = -1;
char buf[1024 ];
if (accept->accept (new_local_stream) == -1)
return -1;
if (new_local_stream.Local_IPC_SAP::recv_fd (fd1) == -1
|| new_local_stream.Local_IPC_SAP::recv_fd (fd2) == -1)
return -1;
else if (::debug)
::fprintf ((&_iob[2]) , "received file descriptors %d and %d\n", fd1, fd2);
if ((n = ::read (fd1, buf, sizeof buf)) == -1)
return -1;
else if (::write (fd2, upper_case (buf, n), n) == -1)
return -1;
if (::close (fd1) == -1 || ::close (fd2) == -1)
return -1;
return 0;
}
} handle_l_pipe;
class Handle_R_Stream : public IO_Handler
{
public:
virtual int input_ready (IPC_SAP *sp)
{
Trace ____ ("handle_r_stream", 199, "server_test.C") ;
IPC_SAP_Listener *accept = (IPC_SAP_Listener *) sp;
IPC_SAP_Stream new_remote_stream;
char buf[1024 ];
int bytes;
if (accept->accept (new_remote_stream) == -1)
return -1;
else if (::debug)
{
SAP_INET_Addr sa;
if (new_remote_stream.get_peer_info (sa) == -1)
return -1;
::fprintf ((&_iob[2]) , "accepted from host %s at port %d\n",
sa.get_host_name (), sa.get_port_number ());
}
::puts ("----------------------------------------");
while ((bytes = new_remote_stream.recv (buf, sizeof buf)) > 0)
::write (1, buf, bytes);
::puts ("----------------------------------------");
return 0;
}
} handle_r_stream;
class Handle_L_Dgram : public IO_Handler
{
public:
virtual int input_ready (IPC_SAP *sp)
{
Trace ____ ("handle_l_dgram", 237, "server_test.C") ;
void *vp = (void *) sp;
Local_IPC_SAP_Dgram *l_dgram = (Local_IPC_SAP_Dgram *) vp;
int fd = -1;
char buf[1024 ];
if (l_dgram->Local_IPC_SAP::recv_fd (fd) == -1)
return -1;
else if (::debug)
fprintf ((&_iob[2]) , "received fd (%d)\n", fd);
::puts ("----------------------------------------");
for (int n; n = ::read (fd, buf, sizeof buf); )
::write (1, buf, n);
::puts ("----------------------------------------");
if (::close (fd) == -1)
return -1;
return 0;
}
} handle_l_dgram;
class Handle_R_Dgram : public IO_Handler
{
public:
virtual int input_ready (IPC_SAP *sp)
{
Trace ____ ("handle_r_dgram", 269, "server_test.C") ;
IPC_SAP_Dgram *r_dgram;
SAP_INET_Addr sa;
char buf[0x2000];
int n;
if ((n = r_dgram->recv (buf, sizeof buf, sa)) == -1)
return -1;
else if (debug)
::fprintf ((&_iob[2]) , "received datagram from host %s\n", sa.get_host_name ());
::puts ("----------------------------------------");
::write (1, buf, n);
if (buf[n - 1] != '\n')
(--((&_iob[1]) )->_cnt >= 0 ? (int)(*((&_iob[1]) )->_ptr++ = (unsigned char)(('\n'))) : ((((&_iob[1]) )->_flag & 0200 ) && -((&_iob[1]) )->_cnt < ((&_iob[1]) )->_bufsiz ? ((*((&_iob[1]) )->_ptr = (unsigned char)(('\n'))) != '\n' ? (int)(*((&_iob[1]) )->_ptr++) : _flsbuf(*(unsigned char *)((&_iob[1]) )->_ptr, (&_iob[1]) )) : _flsbuf((unsigned char)(('\n')), (&_iob[1]) ))) ;
::puts ("----------------------------------------");
return 0;
}
} handle_r_dgram;
int
init_server_processing (void)
{
Trace ____ ("init_server_processing", 298, "server_test.C") ;
if (dispatcher.link (&l_accept, Dispatcher::READ_MASK, &handle_l_stream) == -1)
return -1;
if (dispatcher.link (&r_accept, Dispatcher::READ_MASK, &handle_r_stream) == -1)
return -1;
if (dispatcher.link (&l_dgram, Dispatcher::READ_MASK, &handle_l_dgram) == -1)
return -1;
if (dispatcher.link (&r_dgram, Dispatcher::READ_MASK, &handle_r_dgram) == -1)
return -1;
if (dispatcher.link (&l_pipe_accept, Dispatcher::READ_MASK, &handle_l_pipe) == -1)
return -1;
}
void
do_async_server_processing (int)
{
Trace ____ ("do_async_server_processing", 321, "server_test.C") ;
static timeval tv = {0, 0};
if (debug)
::fprintf ((&_iob[2]) , "async response to SIGIO\n");
}
void
do_sync_server_processing (void)
{
Trace ____ ("do_sync_server_processing", 333, "server_test.C") ;
for (;;)
{
if (debug)
::fprintf ((&_iob[2]) , "dispatching...\n");
dispatcher.dispatch ();
}
}
void
setup_signal_handlers (void)
{
Trace ____ ("setup_signal_handlers", 350, "server_test.C") ;
::signal (30 , SignalHandler (Trace::start_tracing));
::signal (31 , SignalHandler (Trace::stop_tracing));
::signal (23 , SignalHandler (do_async_server_processing));
}
void
clean_up_rendezvous_points (void)
{
::unlink (::rendezvous_stream);
::unlink (::rendezvous_dgram);
::unlink (::rendezvous_pipe);
}
int
main (int argc, char *argv[])
{
Trace ____ ("main", 369, "server_test.C") ;
program_name = argv[0];
setup_signal_handlers ();
parse_args (argc, argv);
clean_up_rendezvous_points ();
SAP_INET_Addr sia (::port_number);
SAP_UNIX_Addr suas (::rendezvous_stream);
SAP_UNIX_Addr suad (::rendezvous_dgram);
SAP_UNIX_Addr suap (::rendezvous_pipe);
if (l_accept.open (suas) < 0 || (::async && l_accept.make_async () < 0))
::perror ("open"), ::exit (1);
if (r_accept.open (sia) < 0 || (::async && r_accept.make_async () < 0))
::perror ("open"), ::exit (1);
if (r_dgram.open (sia) < 0 || (::async && r_dgram.make_async () < 0))
::perror ("open"), ::exit (1);
if (l_dgram.open (suad) < 0 || (::async && l_dgram.make_async () < 0))
::perror ("open"), ::exit (1);
if (l_pipe_accept.open (suap) < 0 || (::async && l_pipe_accept.make_async () < 0))
::perror ("open"), ::exit (1);
if (init_server_processing () < 0)
::perror ("init_server_processing");
if (::async)
for (;;)
{
if (::debug)
::fprintf ((&_iob[2]) , "pausing for SIGIO\n");
::pause ();
if (::debug)
::fprintf ((&_iob[2]) , "handled signal SIGIO\n");
}
else
do_sync_server_processing ();
return 0;
}
Technical Details
Message-ID:
<9208040018.aa12270@Paris.ics.uci.edu>Path:
arc1-ca.pugleaf.net!sparky!uunet!cis.ohio-state.edu!net6.ics.uci.edu!schmidtShow Full Headers
Complete Article Headers
Newsgroups: gnu.g++.bug Path: arc1-ca.pugleaf.net!sparky!uunet!cis.ohio-state.edu!net6.ics.uci.edu!schmidt From: schmidt@net6.ics.uci.edu (Douglas C. Schmidt) Subject: fatal signal for g++ 2.2.2. Message-ID: <9208040018.aa12270@Paris.ics.uci.edu> Sender: gnulists@ai.mit.edu Organization: GNUs Not Usenet Distribution: gnu Date: Mon, 3 Aug 1992 17:17:11 GMT Approved: bug-g++@prep.ai.mit.edu Lines: 1436