When EV_READ|EV_WRITE is returned, I think it is done because we're trying to prompt the caller to call read() or write() on the socket, which will let them discover the error condition.

OTOH, calling read or write will not notify the caller of the EOF condition, so I'm not sure if it makes sense. That said, I don't feel too strongly about this. I'm interested in hearing with the libevent maintainers feel is the most consistent API.