diff options
Diffstat (limited to 'ponymap.c')
-rw-r--r-- | ponymap.c | 34 |
1 files changed, 19 insertions, 15 deletions
@@ -565,12 +565,15 @@ unit_update_poller (struct unit *u, const struct pollfd *pfd) static void on_unit_ready (const struct pollfd *pfd, struct unit *u) { - struct transport *transport = u->transport; struct service *service = u->service; + struct transport *transport = u->transport; enum transport_io_result result; + bool got_eof = false; + + if ((result = transport->on_readable (u)) == TRANSPORT_IO_ERROR) + goto error; + got_eof |= result == TRANSPORT_IO_EOF; - if ((result = transport->on_readable (u))) - goto exception; if (u->read_buffer.len) { struct str *buf = &u->read_buffer; @@ -581,23 +584,24 @@ on_unit_ready (const struct pollfd *pfd, struct unit *u) goto abort; } - if ((result = transport->on_writeable (u))) - goto exception; + if ((result = transport->on_writeable (u)) == TRANSPORT_IO_ERROR) + goto error; + got_eof |= result == TRANSPORT_IO_EOF; - unit_update_poller (u, pfd); - return; - -exception: - if (result == TRANSPORT_IO_EOF) + if (got_eof) { if (service->on_eof) service->on_eof (u->service_data, u); + if (u->abortion_requested || !u->write_buffer.len) + goto abort; } - else if (result == TRANSPORT_IO_ERROR) - { - if (service->on_error) - service->on_error (u->service_data, u); - } + + unit_update_poller (u, pfd); + return; + +error: + if (service->on_error) + service->on_error (u->service_data, u); abort: unit_abort (u); |