It's me again.

 I changed signal.c:posix_signal like this

#ifdef SA_RESTART
    if (signum != SIGVTALRM) {
        sigact.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */        
    }
#endif

 And now truss output is

setcontext(0xFFBEAAC0)
16128:      Received signal #28, SIGVTALRM [caught]
16128:  setcontext(0xFFBEAAC0)
16128:      Received signal #28, SIGVTALRM, in poll() [caught]
16128:  poll(0xFFBEA8B8, 1, 480000)                     Err#4 EINTR
16128:          fd=4  ev=POLLRDNORM rev=0x4057
16128:  setcontext(0xFFBEA5A0)

        I.e. poll returns EINTR.

16128:  write(2, " r b _ t h r e a d _ s e".., 23)      = 23
16128:  write(2, " 2 2", 2)         = 2

        but why the heck the select in rb_thread_select still
        sets errno to  EINVAL? I'm really  really confused.
        

16128:  write(2, "   i n   S E L E C T\n", 11)          = 11
16128:  sigprocmask(SIG_SETMASK, 0x000BD2F0, 0x00000000) = 0
16128:           set = 0 0 0 0
16128:  write(1, " I n v a l i d   a r g u".., 17)      = 17