Why does ksh93 use SIGALRM internally to implement sleep? It looks a
bit byzantine, aside from the issue that the code in
src/cmd/ksh93/sh/fault.c can never work, as intended:
        if(shp->savesig)
        {
                /* critical region, save and process later */
                if(!(shp->sigflag[sig]&SH_SIGIGNORE))
                        shp->savesig = sig;
                return;
        }
        if(sig==SIGALRM && shp->bltinfun==b_sleep)
        {
                if(trap && *trap)
                {
                        shp->trapnote |= SH_SIGTRAP;
                        shp->sigflag[sig] |= SH_SIGTRAP;
#ifdef _lib_sigaction
                        set_trapinfo(shp,sig,info);
#endif
                }
                return;
        }

I can imagine so many problems caused by this.
1. if(shp->savesig)/return; - if this code is *ever* executed for a
signal we loose the siginfo data for this signal.

2. if(sig==SIGALRM && shp->bltinfun==b_sleep) happens only during
builtin sleep(1), but at the same time it cannot work because this is
an asynchronous timer signal which can happen at *any* time, while
being inside b_sleep(), or not. There is no guarantee by POSIX that it
should arrive exactly then.

IMO the whole byzantine SIGALRM code should be removed.

Olga
-- 
      ,   _                                    _   ,
     { \/`o;====-    Olga Kryzhanovska   -====;o`\/ }
.----'-/`-/     olga.kryzhanov...@gmail.com   \-`\-'----.
 `'-..-| /       http://twitter.com/fleyta     \ |-..-'`
      /\/\     Solaris/BSD//C/C++ programmer   /\/\
      `--`                                      `--`
_______________________________________________
ast-developers mailing list
ast-developers@lists.research.att.com
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to