|
@@ -693,20 +693,23 @@ std::pair<SocketBase::AcceptResult, Errno> Socket::Accept() {
|
|
|
sockaddr_in addr;
|
|
sockaddr_in addr;
|
|
|
socklen_t addrlen = sizeof(addr);
|
|
socklen_t addrlen = sizeof(addr);
|
|
|
|
|
|
|
|
- std::vector<WSAPOLLFD> host_pollfds{
|
|
|
|
|
- WSAPOLLFD{fd, POLLIN, 0},
|
|
|
|
|
- WSAPOLLFD{GetInterruptSocket(), POLLIN, 0},
|
|
|
|
|
- };
|
|
|
|
|
-
|
|
|
|
|
- while (true) {
|
|
|
|
|
- const int pollres =
|
|
|
|
|
- WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1);
|
|
|
|
|
- if (host_pollfds[1].revents != 0) {
|
|
|
|
|
- // Interrupt signaled before a client could be accepted, break
|
|
|
|
|
- return {AcceptResult{}, Errno::AGAIN};
|
|
|
|
|
- }
|
|
|
|
|
- if (pollres > 0) {
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ const bool wait_for_accept = !is_non_blocking;
|
|
|
|
|
+ if (wait_for_accept) {
|
|
|
|
|
+ std::vector<WSAPOLLFD> host_pollfds{
|
|
|
|
|
+ WSAPOLLFD{fd, POLLIN, 0},
|
|
|
|
|
+ WSAPOLLFD{GetInterruptSocket(), POLLIN, 0},
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ while (true) {
|
|
|
|
|
+ const int pollres =
|
|
|
|
|
+ WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1);
|
|
|
|
|
+ if (host_pollfds[1].revents != 0) {
|
|
|
|
|
+ // Interrupt signaled before a client could be accepted, break
|
|
|
|
|
+ return {AcceptResult{}, Errno::AGAIN};
|
|
|
|
|
+ }
|
|
|
|
|
+ if (pollres > 0) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -913,6 +916,7 @@ Errno Socket::SetRcvTimeo(u32 value) {
|
|
|
|
|
|
|
|
Errno Socket::SetNonBlock(bool enable) {
|
|
Errno Socket::SetNonBlock(bool enable) {
|
|
|
if (EnableNonBlock(fd, enable)) {
|
|
if (EnableNonBlock(fd, enable)) {
|
|
|
|
|
+ is_non_blocking = enable;
|
|
|
return Errno::SUCCESS;
|
|
return Errno::SUCCESS;
|
|
|
}
|
|
}
|
|
|
return GetAndLogLastError();
|
|
return GetAndLogLastError();
|