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.Thread Next