I just found that Event goes into an endless polling loop whenever an error
occurs on a filehandle:

   poll([{fd=3, events=POLLPRI|POLLOUT|POLLWRNORM|POLLRDBAND|POLLWRBAND, 
revents=POLLERR|POLLHUP}], 1, 60000) = 1
   gettimeofday({995996622, 745496}, NULL) = 0
   poll([{fd=3, events=POLLPRI|POLLOUT|POLLWRNORM|POLLRDBAND|POLLWRBAND, 
revents=POLLERR|POLLHUP}], 1, 60000) = 1
   gettimeofday({995996622, 746308}, NULL) = 0
   poll([{fd=3, events=POLLPRI|POLLOUT|POLLWRNORM|POLLRDBAND|POLLWRBAND, 
revents=POLLERR|POLLHUP}], 1, 60000) = 1
   gettimeofday({995996622, 747280}, NULL) = 0

without ever calling a callback. Reading the source I see that poll =>
'e' does not, as I anticipated, get called on error conditions (unless
select() is being used) but ONLY on high priority read data (interesting
side note: 'R' does not include high-priority read data but 'W' does
include high priority write data, which makes for some nice asymetry). If
an filehandle returns POLLHUP or POLLERR Event goes into an endless
CPU-eating poll-loop.

I temporarily worked around this bug by changing c/unix.c:141 from:

            if (mask & (POLLRDBAND | POLLPRI)) got |= PE_E;

to

            if (mask & (POLLRDBAND | POLLPRI | POLLERR | POLLHUP)) got |= PE_E;

however, wether this is the right fixc is the question: when select is
used, errors are reported using 'e', so it's probably the right thing
to do. I also think that the asymmetric distribution of POLLWRBAND
vs. POLLRDBAND is also not what is expected.

;)

HTH,

-- 
      -----==-                                             |
      ----==-- _                                           |
      ---==---(_)__  __ ____  __       Marc Lehmann      +--
      --==---/ / _ \/ // /\ \/ /       [EMAIL PROTECTED]      |e|
      -=====/_/_//_/\_,_/ /_/\_\       XX11-RIPE         --+
    The choice of a GNU generation                       |
                                                         |

Reply via email to