Close socket on Windows only after pending write is confirmed.

This commit is contained in:
levlam 2021-06-14 19:06:23 +03:00
parent 8a418e9e03
commit e18ff8a810

View File

@ -78,6 +78,12 @@ class SocketFdImpl : private Iocp::Callback {
}
void close() {
if (!is_write_waiting_) {
VLOG(fd) << get_native_fd() << " will close after ongoing write";
auto lock = lock_.lock();
need_close_after_write_ = true;
return;
}
notify_iocp_close();
}
@ -160,6 +166,7 @@ class SocketFdImpl : private Iocp::Callback {
std::atomic<int> refcnt_{1};
bool close_flag_{false};
bool need_close_after_write_{false};
bool is_connected_{false};
bool is_read_active_{false};
@ -188,7 +195,7 @@ class SocketFdImpl : private Iocp::Callback {
void loop_read() {
CHECK(is_connected_);
CHECK(!is_read_active_);
if (close_flag_) {
if (close_flag_ || need_close_after_write_) {
return;
}
std::memset(&read_overlapped_, 0, sizeof(read_overlapped_));
@ -216,6 +223,9 @@ class SocketFdImpl : private Iocp::Callback {
to_write = output_reader_.prepare_read();
if (to_write.empty()) {
is_write_waiting_ = true;
if (need_close_after_write_) {
notify_iocp_close();
}
return;
}
}