=================================================================== RCS file: /home/cvs/OpenXM/src/k097/ox_k0.c,v retrieving revision 1.5 retrieving revision 1.11 diff -u -p -r1.5 -r1.11 --- OpenXM/src/k097/ox_k0.c 2003/12/05 14:02:23 1.5 +++ OpenXM/src/k097/ox_k0.c 2016/03/31 05:27:34 1.11 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/k097/ox_k0.c,v 1.4 2003/11/19 00:11:02 takayama Exp $ */ +/* $OpenXM: OpenXM/src/k097/ox_k0.c,v 1.10 2015/10/10 11:29:46 takayama Exp $ */ #include #include #include @@ -7,6 +7,8 @@ #include #include #include +#include +#include /* -lnsl -lsocket /usr/ucblib/libucb.a */ #include "../kxx/ox_kan.h" #include "../kxx/serversm.h" @@ -18,6 +20,7 @@ int PacketMonitor = 0; extern int SerialOX; /* Serial number of the packets sent. */ extern int SerialCurrent; /* Current Serial number of the recieved packet. */ extern int OXprintMessage; /* print oxmessages? */ +extern int Calling_ctrlC_hook; #if defined(__CYGWIN__) sigjmp_buf EnvOfChildServer; @@ -68,6 +71,7 @@ nullserver(int fdStreamIn,int fdStreamOut) { ox_stream ostreamIn; ox_stream ostreamOut; char sreason[1024]; + extern int RestrictedMode, RestrictedMode_saved; extern void controlResetHandler(); #if defined(__CYGWIN__) extern sigjmp_buf EnvOfStackMachine; @@ -118,13 +122,18 @@ nullserver(int fdStreamIn,int fdStreamOut) { if (OxInterruptFlag == 0) { fprintf(stderr," ?! \n"); fflush(NULL); } - KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + if (!Calling_ctrlC_hook) { + Calling_ctrlC_hook = 1; RestrictedMode = 0; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; + } + Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); InSendmsg2 = 0; - signal(SIGUSR1,controlResetHandler); goto aaa; + mysignal(SIGUSR1,controlResetHandler); goto aaa; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfChildServer.\n"); - signal(SIGUSR1,controlResetHandler); + mysignal(SIGUSR1,controlResetHandler); } #if defined(__CYGWIN__) if (sigsetjmp(EnvOfStackMachine,1)) { @@ -152,13 +161,18 @@ nullserver(int fdStreamIn,int fdStreamOut) { */ Sm1_pushError2(SerialCurrent,-1,"Global jump by sm1 error"); - KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + if (!Calling_ctrlC_hook) { + Calling_ctrlC_hook = 1; RestrictedMode = 0; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + RestrictedMode = RestrictedMode_saved; + } + Calling_ctrlC_hook = 0; InSendmsg2=0; - signal(SIGUSR1,controlResetHandler); goto aaa ; + mysignal(SIGUSR1,controlResetHandler); goto aaa ; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n"); - if (signal(SIGUSR1,SIG_IGN) != SIG_IGN) { - signal(SIGUSR1,controlResetHandler); + if (mysignal(SIGUSR1,SIG_IGN) != SIG_IGN) { + mysignal(SIGUSR1,controlResetHandler); } } @@ -278,7 +292,7 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea if (message) fprintf(stderr," executeStringByLocalParser\n"); OxCritical = 0; iresult = K0_executeStringByLocalParser(); - OxCritical = 1; signal(SIGUSR1,controlResetHandler); + OxCritical = 1; mysignal(SIGUSR1,controlResetHandler); if (iresult < 0) { emsg = Sm1_popErrorMessage("executeString: "); Sm1_pushError2(SerialCurrent,-1,emsg); @@ -289,7 +303,7 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea if (message) fprintf(stderr," executeFunction\n"); OxCritical = 0; iresult = K0_executeStringByLocalParser(); - OxCritical = 1; signal(SIGUSR1,controlResetHandler); + OxCritical = 1; mysignal(SIGUSR1,controlResetHandler); if (iresult < 0) { emsg = Sm1_popErrorMessage("executeFunction: "); Sm1_pushError2(SerialCurrent,-1,emsg); @@ -330,7 +344,7 @@ nullserver_simplest(int fd) { int c; while(1) { c = readOneByte(fd); - if (c == '@') { return; } + if (c == '@') { return 0; } } } @@ -338,13 +352,14 @@ nullserver_simplest(int fd) { void controlResetHandler(sig) int sig; { - signal(sig,SIG_IGN); + mysignal(sig,SIG_IGN); cancelAlarm(); fprintf(stderr,"From controlResetHandler. OxCritical = %d\n",OxCritical); OxInterruptFlag = 1; if (OxCritical) { return; }else{ + (void) traceShowStack(); traceClearStack(); #if defined(__CYGWIN__) siglongjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ #else