=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxserver00.c,v retrieving revision 1.2 retrieving revision 1.10 diff -u -p -r1.2 -r1.10 --- OpenXM/src/kxx/oxserver00.c 1999/11/09 11:43:35 1.2 +++ OpenXM/src/kxx/oxserver00.c 2003/08/22 16:08:23 1.10 @@ -1,4 +1,4 @@ -/* $OpenXM$ */ +/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.9 2002/11/04 11:09:00 takayama Exp $ */ /* nullserver01 */ #include #include @@ -20,7 +20,11 @@ extern int SerialOX; /* Serial number of the packets extern int SerialCurrent; /* Current Serial number of the recieved packet. */ extern int OXprintMessage; /* print oxmessages? */ +#if defined(__CYGWIN__) +sigjmp_buf EnvOfChildServer; +#else jmp_buf EnvOfChildServer; +#endif int JmpMessage = 0; @@ -33,7 +37,7 @@ main(int argc, char *argv[]) { char *tigers[] = {"callsm1.sm1","tigers.sm1"}; char *basicCD[] = {"basicCD.sm1"}; /* If you change the above, you need to change the argc of Sm1_start below. - */ + */ if (argc > 1) { if (strcmp(argv[1],"-monitor")==0) { @@ -64,9 +68,13 @@ main(int argc, char *argv[]) { static char *getSuffix(char *s) { /* getSuffix("ox_sm1_forAsir") returns "forAsir" */ + /* getSuffix("ox_sm1_forAsir.exe") returns "forAsir" */ /* getSuffix("ox_sm1_gnuplot") returns "gnuplot" */ int n,i,k; n = strlen(s); + if (n > 5 && (strcmp(".exe",&(s[n-4]))==0 || strcmp(".EXE",&(s[n-4]))==0)) { + s[n-4] = '\0'; + } for (i=n-1; i>=0; i--) { if (s[i] == '_') { return( s+i+1 ); @@ -80,9 +88,14 @@ nullserver(int fdStream) { ox_stream ostream; char sreason[1024]; extern void controlResetHandler(); +#if defined(__CYGWIN__) + extern sigjmp_buf EnvOfStackMachine; +#else extern jmp_buf EnvOfStackMachine; +#endif int engineByteOrder; + fflush(NULL); engineByteOrder = oxTellMyByteOrder(fdStream); /* Set the network byte order. */ fprintf(stderr,"engineByteOrder=%x\n",engineByteOrder); @@ -96,32 +109,42 @@ nullserver(int fdStream) { if (PacketMonitor) fp2watch(ostream,stdout); } aaa : ; +#if defined(__CYGWIN__) + if (sigsetjmp(EnvOfChildServer,1)) { +#else if (setjmp(EnvOfChildServer)) { +#endif fprintf(stderr,"childServerMain: jump here.\n"); if (OxInterruptFlag == 0) { fprintf(stderr," ?! \n"); fflush(NULL); } + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + KSexecuteString(" (Computation is interrupted.) "); signal(SIGUSR1,controlResetHandler); goto aaa; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfChildServer.\n"); signal(SIGUSR1,controlResetHandler); } - +#if defined(__CYGWIN__) + if (sigsetjmp(EnvOfStackMachine,1)) { +#else if (setjmp(EnvOfStackMachine)) { - fprintf(stderr,"childServerMain: jump here by EnvOfStackMachine.\n"); +#endif + fprintf(stderr,"childServerMain: jump here by EnvOfStackMachine or timeout.\n"); if (OxInterruptFlag == 0) { fprintf(stderr," ?! \n"); fflush(NULL); } /* In case of error in the stack machine, pop the error info and send the error packet. */ /* oxSendOXheader(ostream,OX_DATA,SerialOX++); - oxSendCmoError(ostream); - oxSendOXheader(ostream,OX_DATA,SerialOX++); - sprintf(sreason,"Jump here by sm1 error."); - oxSendCmoError2(ostream,sreason); + oxSendCmoError(ostream); + oxSendOXheader(ostream,OX_DATA,SerialOX++); + sprintf(sreason,"Jump here by sm1 error."); + oxSendCmoError2(ostream,sreason); */ Sm1_pushError2(SerialCurrent,-1,"Global jump by sm1 error"); + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ signal(SIGUSR1,controlResetHandler); goto aaa ; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n"); @@ -163,7 +186,7 @@ nullserver(int fdStream) { case OX_DATA: fprintf(stderr," OX_DATA \n"); break; case OX_SYNC_BALL: fprintf(stderr," OX_SYNC_BALL \n"); break; case -1: fprintf(stderr," End of file. Exiting the server child.\n"); - exit(); break; + exit(0); break; default: fprintf(stderr," ?! \n"); break; } } @@ -224,6 +247,10 @@ nullserverCommand(ox_stream ostream) { if (message) fprintf(stderr," dupErrors \n"); Sm1_dupErrors(); break; + case SM_pushCMOtag: + if (message) fprintf(stderr," pushCMOtag \n"); + Sm1_pushCMOtag(SerialCurrent); + break; case SM_setName: if (message) fprintf(stderr," setName \n"); iresult = Sm1_setName(); @@ -273,6 +300,9 @@ nullserverCommand(ox_stream ostream) { if (message) fprintf(stderr,"Done.\n"); break; case SM_shutdown: + fprintf(stderr,"Shutting down the engine.\n"); + exit(0); + break; case SM_beginBlock: case SM_endBlock: fprintf(stderr,"This command has not yet been implemented.\n"); @@ -297,15 +327,20 @@ nullserver_simplest(int fd) { void controlResetHandler(sig) -int sig; + int sig; { signal(sig,SIG_IGN); + cancelAlarm(); fprintf(stderr,"From controlResetHandler. OxCritical = %d\n",OxCritical); OxInterruptFlag = 1; if (OxCritical) { return; }else{ +#if defined(__CYGWIN__) + siglongjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ +#else longjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ +#endif } }