httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ben Laurie <>
Subject Win32 16k problem nailed!
Date Wed, 12 Nov 1997 20:00:44 GMT
OK, I've now traced the cause of the problem, and fixed it.

Executive summary: Win32 select() is broken.

Full story: Because there's no such thing as alarm() on Windoze, doing
timeouts on read()s and write()s must be simulated. The strategy
employed is as follows (this may not be the best way of doing, but its
what we've got at the moment):

1. put socket in non-blocking mode.
2. attempt the write
3. if the write succeeds, we're done.
4. select on the socket, with timeout set to remaining time
5. write again

What happens is that sometimes, on some machines, the select returns
with write available, _but_ the write (at step 5) still says it will
block. Now, I thought at first that this could be correct - all select
is saying is that it can write a single byte to the socket, but we are
(typically) attempting to write 8k. So, I wrapped the write in a loop
that tried successively smaller amounts. I thought this should have
fixed the problem, but didn't - it gets all the way down to 1 byte and
_still_ fails. So, I added another loop - if we get down to 1 byte,
sleep for 100 milliseconds, and try again. This works.

Further thought, and manual reading, says that the "step down the size"
strategy should not be needed - if there is insufficient space for the
whole buffer, a partial write should occur. So, I'll eliminate that,
leave in the retry loop, go for one more test, and commit. I'll leave a
logging message warning that Windoze is broken.



Ben Laurie            |Phone: +44 (181) 735 0686|Apache Group member
Freelance Consultant  |Fax:   +44 (181) 735 0689|
and Technical Director|Email: |Apache-SSL author
A.L. Digital Ltd,     |
London, England.      |"Apache: TDG"

View raw message