diff --git a/src/lpc_signal.c b/src/lpc_signal.c index b149afe867a8862ae66bc8c481904c84347a7f42..cc9108068a1f320d1de07b170e1b3b60994dd2d1 100644 --- a/src/lpc_signal.c +++ b/src/lpc_signal.c @@ -230,14 +230,16 @@ static RETSIGTYPE receive_signal(int signum) void check_signals() { + static int signalling=0; #ifdef DEBUG extern int d_flag; if(d_flag>5) do_debug(0); #endif - if(firstsig != lastsig) + if(firstsig != lastsig && !signalling) { int tmp=firstsig; + signalling=1; while(lastsig != tmp) { @@ -247,6 +249,8 @@ void check_signals() apply_svalue(signal_callbacks + sigbuf[lastsig], 1); pop_stack(); } + + signalling=0; } } @@ -389,6 +393,24 @@ static void f_alarm(INT32 args) push_int(alarm(seconds)); } +#ifdef HAVE_UALARM +static void f_ualarm(INT32 args) +{ + long seconds; + + if(args < 1) + error("Too few arguments to signame()\n"); + + if(sp[-args].type != T_INT) + error("Bad argument 1 to signame()\n"); + + seconds=sp[-args].u.integer; + + pop_n_elems(args); + push_int(ualarm(seconds)); +} +#endif + void init_signals() { int e; @@ -407,6 +429,9 @@ void init_signals() add_efun("signum",f_signum,"function(string:int)",0); add_efun("getpid",f_getpid,"function(:int)",0); add_efun("alarm",f_alarm,"function(int:int)",OPT_SIDE_EFFECT); +#ifdef HAVE_UALARM + add_efun("ualarm",f_ualarm,"function(int:int)",OPT_SIDE_EFFECT); +#endif } void exit_signals()