Question about Cygwin's select()

Ken Brown kbrown@cornell.edu
Thu Oct 20 12:14:00 GMT 2011


On 10/19/2011 4:15 PM, Ken Brown wrote:
> I don't have a testcase yet, but I have a clearer idea of what's
> happening. It actually has nothing to do with the gdb subprocess, but
> rather is a problem that can occur whenever emacs is running its main
> command loop. emacs polls for keyboard input while also using select to
> check for output from subprocesses. It's in this setting that select
> often fails with EINTR, even when there are no subprocesses running. I
> wonder if the keyboard polling is doing something that interrupts the
> select call.

I think this guess is correct.  If I start up emacs and do nothing, 
strace shows many sequences like the following:

  - emacs calls select
  - a timer sends SIGALRM
  - select returns -1 with error EINTR

The EINTR isn't actually visible in the strace output, but I do see 
"select_stuff::wait: signal received".  A glance at select.cc indicates 
that this is the debug output produced by select when it is about to 
return -1 with EINTR.

These sequences always occur in connection with start_thread_socket. 
I've appended a typical excerpt from the strace output below.  Please 
let me know if you need to see more strace output.  I didn't want to 
spam the list by sending too much.

You still might need more information, but I can at least refine my 
original question:  Is it reasonable that select should give up and 
return -1 because a timer has sent SIGALRM?

Ken

[...]
   686 8226742 [main] emacs 6772 cygwin_select: 6, 0x28C134, 0x28C12C, 
0x0, 0x28C200
[...]
   106 8227514 [main] emacs 6772 select_stuff::wait: m 4, ms 464
    49 8227563 [select_socket] emacs 6772 thread_socket: stuff_start 
0x28C098
    53 8227616 [select_socket] emacs 6772 peek_socket: read_ready: 0, 
write_ready: 0, except_ready: 0
  2501 8230117 [itimer] emacs 6772 timer_thread: timed out
    66 8230183 [itimer] emacs 6772 timer_thread: 0x6118D560 sending sig 14
    52 8230235 [itimer] emacs 6772 sig_send: sendsig 0x104, pid 6772, 
signal 14, its_me 1
    52 8230287 [itimer] emacs 6772 sig_send: Not waiting for 
sigcomplete.  its_me 1 signal 14
     5 8230292 [sig] emacs 6772 sigpacket::process: signal 14 processing
    35 8230327 [itimer] emacs 6772 sig_send: returning 0x0 from sending 
signal 14
    28 8230355 [sig] emacs 6772 _cygtls::find_tls: sig 14
    61 8230416 [sig] emacs 6772 sigpacket::process: signal 14, about to 
call 0x5E85A8
    37 8230453 [sig] emacs 6772 setup_handler: controlled interrupt. 
stackptr 0x28DA34, stack 0x28DA30, stackptr[-1] 0x4F2F4C
[...]
    35 8230632 [sig] emacs 6772 _cygtls::interrupt_setup: armed 
signal_arrived 0x154, sig 14, res 1
    57 8230689 [sig] emacs 6772 setup_handler: signal 14 delivered
    40 8230729 [sig] emacs 6772 sigpacket::process: returning 1
    51 8230780 [main] emacs 6772 select_stuff::cleanup: calling cleanup 
routines
   596 8231376 [main] emacs 6772 socket_cleanup: si 0x8016D220 
si->thread 0x611773F0
   307 8231683 [select_socket] emacs 6772 thread_socket: leaving 
thread_socket
   696 8232379 [main] emacs 6772 socket_cleanup: returning
    56 8232435 [main] emacs 6772 select_stuff::wait: signal received




--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list