=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxserver00.c,v retrieving revision 1.6 retrieving revision 1.10 diff -u -p -r1.6 -r1.10 --- OpenXM/src/kxx/oxserver00.c 2001/12/21 02:32:11 1.6 +++ OpenXM/src/kxx/oxserver00.c 2003/08/22 16:08:23 1.10 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.5 2001/05/06 07:53:01 takayama Exp $ */ +/* $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; @@ -84,7 +88,11 @@ 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); @@ -101,19 +109,28 @@ 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); } @@ -127,6 +144,7 @@ nullserver(int fdStream) { */ 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"); @@ -168,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; } } @@ -312,12 +330,17 @@ void controlResetHandler(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 } }