IO->Terminate(IO);
}
+void PostInbound(AsyncIO *IO)
+{
+ switch (IO->NextState) {
+ case eSendFile:
+ ev_io_start(event_base, &IO->send_event);
+ break;
+ case eSendReply:
+ case eSendMore:
+ assert(IO->SendDone);
+ IO->NextState = IO->SendDone(IO);
+ ev_io_start(event_base, &IO->send_event);
+ break;
+ case eReadPayload:
+ case eReadMore:
+ case eReadFile:
+ ev_io_start(event_base, &IO->recv_event);
+ break;
+ case eTerminateConnection:
+ ShutDownCLient(IO);
+ break;
+ case eAbort:
+ ShutDownCLient(IO);
+ break;
+ case eSendDNSQuery:
+ case eReadDNSReply:
+ case eDBQuery:
+ case eConnect:
+ case eReadMessage:
+ break;
+ }
+}
eReadState HandleInbound(AsyncIO *IO)
{
const char *Err = NULL;
}
}
- switch (IO->NextState) {
- case eSendFile:
- ev_io_start(event_base, &IO->send_event);
- break;
- case eSendReply:
- case eSendMore:
- assert(IO->SendDone);
- IO->NextState = IO->SendDone(IO);
- ev_io_start(event_base, &IO->send_event);
- break;
- case eReadPayload:
- case eReadMore:
- case eReadFile:
- ev_io_start(event_base, &IO->recv_event);
- break;
- case eTerminateConnection:
- ShutDownCLient(IO);
- break;
- case eAbort:
- ShutDownCLient(IO);
- break;
- case eSendDNSQuery:
- case eReadDNSReply:
- case eDBQuery:
- case eConnect:
- case eReadMessage:
- break;
- }
+ PostInbound(IO);
+
return Finished;
}
if (IO->IOB.ChunkSendRemain == 0)
{
IO->NextState = eSendReply;
+ assert(IO->ReadDone);
+ ev_io_stop(event_base, &IO->recv_event);
+ PostInbound(IO);
+ return;
}
else
return;
if (nbytes > 0) {
HandleInbound(IO);
} else if (nbytes == 0) {
- assert(IO->Timeout);
-
- switch (IO->Timeout(IO))
- {
- case eAbort:
- ShutDownCLient(IO);
- default:
- break;
- }
+ IO_Timeout_callback(loop, &IO->rw_timeout, revents);
return;
} else if (nbytes == -1) {
// FD is gone. kick it.