At 01:17 PM 7/29/2002, Brian Pane wrote:

hmmm...another characteristic of the use case in which the current
API is useful is that there's exactly one descriptor involved.  Would
that yield a useful simplification of the two-API plan?  I'm thinking
of something like:

 - apr_pollset API for general-purpose use (abstract interface,
   does its own memory management, etc)

This is extremely effective for any poll-based server daemon. We need this so that the pollset can be manipulated for a group of listeners, and it will become doubly necessary that it's very abstract if we will ever support the async dispatch model in a poll-like fashion.

 - lightweight API that just checks a single descriptor for readability
   or writability

We have that [this is what started the argument.] But I'd argue that up to five or six sources are very useful, consider two ideas;

1. apr_poll learns to support brigades, so that a filter stack might be
   plugged in later for cgi output.  This probably is a combination of the
   APR_SPECULATIVE interface [is there anything on the stack] and
   a bit of intimate knowledge of the raw socket if there is nothing useful
   that's already sufficiently complete that is pending on the filter stack.

2. cgi needs to poll the cgi's stdout / stderr and the client input stack,
   while polling the cgi's stdin and client response stack for ready-to-write.

This is a pretty tightly knit group of fd's that should be optimized for the
small-set case.

Of course, if we can only come up with a single use case for the second
API, and it happens to be apr_wait_for_io_or_timeout(), then let's just
inline the poll/select call there and forget about the lightweight API
until we find another use case.

Well, I've offered the bigger-than-one case, which will be true for many apps that poll on stdin/stdout and some other socket or file entity. I really can't conceive of more than about 6 fd's in any obvious small-set case.

But I agree, go with an abstract implementation, and make our existing
apr_wait_for_io_or_timeout into the first special case.  It's so darned simple
that we shouldn't be trying to overwhelm it with multi-fd logic.

I *really* empathize with Ryan that we should eat our own dogfood.  But
our dogfood is built for an application like the server's accept pollset, or
the several handles of a good cgi implementation.  We shouldn't convince
ourselves that the right solution for a one-of-many is the same solution
for a one-of-few, or a one-of-one.  And we shouldn't clobber the good of
the many for the good of the few, or the one :-)

Bill







Reply via email to