=================================================================== RCS file: /home/cvs/OpenXM/src/kxx/oxserver00.c,v retrieving revision 1.13 retrieving revision 1.15 diff -u -p -r1.13 -r1.15 --- OpenXM/src/kxx/oxserver00.c 2003/11/20 11:41:44 1.13 +++ OpenXM/src/kxx/oxserver00.c 2004/09/05 00:51:18 1.15 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.12 2003/11/19 01:02:40 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kxx/oxserver00.c,v 1.14 2004/03/08 08:24:42 takayama Exp $ */ /* nullserver01 */ #include #include @@ -20,6 +20,7 @@ int NoExecution = 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; @@ -139,7 +140,11 @@ 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; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + } + Calling_ctrlC_hook = 0; KSexecuteString(" (Computation is interrupted.) "); signal(SIGUSR1,controlResetHandler); goto aaa; } else { @@ -165,7 +170,11 @@ 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; + KSexecuteString(" ctrlC-hook "); /* Execute User Defined functions. */ + } + Calling_ctrlC_hook = 0; signal(SIGUSR1,controlResetHandler); goto aaa ; } else { if (JmpMessage) fprintf(stderr,"Set EnvOfStackMachine.\n"); @@ -306,6 +315,20 @@ nullserverCommand(ox_stream ostreamIn,ox_stream ostrea return(-1); } break; + case SM_executeFunctionWithOptionalArgument: + OxCritical = 0; + if (NoExecution) { + iresult = 0; + }else{ + iresult = Sm1_executeStringByLocalParser(); + } + OxCritical = 1; signal(SIGUSR1,controlResetHandler); + if (iresult < 0) { + emsg = Sm1_popErrorMessage("executeFunctionWithOptionalArgument: "); + Sm1_pushError2(SerialCurrent,-1,emsg); + return(-1); + } + break; case SM_popCMO: oxSendOXheader(ostreamOut,OX_DATA,SerialOX++); n=Sm1_popCMO(ostreamOut,SerialCurrent); @@ -353,6 +376,7 @@ void controlResetHandler(sig) if (OxCritical) { return; }else{ + (void) traceShowStack(); traceClearStack(); #if defined(__CYGWIN__) siglongjmp(EnvOfChildServer,2); /* returns 2 for ctrl-C */ #else