I've come to the conclusion that in order to be able to use sockets,
even in the blocking mode which usocket supports now, we need an API
to wait for one or more sockets to become ready for input (or accept()
in case of server sockets). If this call would support time-outs, that
would be even better.
So, I've investigated all supported implementations and -apart from
LispWorks- they all support a
'wait-for-input-on-one-or-more-sockets-with-timeout' api. (I've sent
LispWorks tech support a mail about this, hoping they actually do
provide a function to achieve this.)
As for the API which I think I'll be able to support on all platforms,
it'll look like this:
(defmethod wait-for-input (stream-or-streams &key timeout))
=> (values ready-streams time-remaining-within-timeout)
So, the input is a stream or a list of streams and a real or integer
value timeout (in seconds). It will return the remaining time in the
timeout and the streams ready for reading/accepting.
When the ready-streams list is empty, there are 2 possible situations:
1) We timed out (time-remaining-within-timeout <= 0)
2) We were interrupted while waiting (time-remaining-within-timeout > 0)
Does this API seem acceptable to you?
If not, please tell me so!
BTW: Discussing sockets and event schedulers on #lisp, drewc brought
up that IOLib has an event dispatcher the API which he would really
like to see copied into usocket. I counter proposed we abstract the
api into a general event dispatching mechanism into which many
different libraries can provide their hooks. I don't think that
providing hooks like these is beyond the scope of this project, but I
do think that adding a dispatcher as complex as the one I found in
IOLib is contrary to the short term goal of 'getting a useable
portability library out there'. IOW: I'd love to work on it, but not
before 1.0.
bye,
Erik.