I've checked in support for a rudimentary form of continuations.
The basic idea is that previously you had to rely on the following
sequence of events:
(((
hook_connect : dnsbl -> fire off dns query and turn off read mode on
socket.
callback : get dns response - turn on read mode on socket. Can't send
anything to client here as it's already been sent at the end of running
all the connect hooks.
hook_rcpt : process dns responses and send valid return codes.
)))
Now what you can do is:
(((
hook_connect : dnsbl -> fire off dns query and turn off read mode on
socket. Suspend remaining hooks as a continuation.
callback : get dns response - turn on read mode on socket, but also
continue the continuation.
hook_connect(2) : dnsbl2 -> process dns responses and send valid
return codes.
)))
Most of this is transparent - you just have to return CONTINUATION and
remember to call $qp->finish_continuation when everything is ready to
continue (see plugins/dnsbl for the example).
For those confused as to why all this was necessary - we needed a way
to do the sort of things dnsbl does but without waiting for more input
from the client to trigger another event - e.g. at data_post time where
the client won't send anything more before we queue the mail. This
gives us that capability in the high_perf branch. So now converting
plugins/spamassassin to high_perf will (should) be fairly
straightforward.
Enjoy.