summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-08-19 13:34:01 +0200
committerTor Egge <Tor.Egge@broadpark.no>2019-08-19 13:34:01 +0200
commitb95cf87d3da1659c516afca36c10b26425824d88 (patch)
tree5943486331b0457684191a6238972c828a045027 /vespalib
parent5fb8e66dbd2d6e02a64a054e147ac7214943d563 (diff)
Avoid hang in vepalib::ws::Acceptor::accept_main on systems where
shutdown on socket doesn't wake up a blocking accept call on same socket.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/websocket/acceptor.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/vespalib/src/vespa/vespalib/websocket/acceptor.cpp b/vespalib/src/vespa/vespalib/websocket/acceptor.cpp
index 4ba1bf3b908..d99035e0be7 100644
--- a/vespalib/src/vespa/vespalib/websocket/acceptor.cpp
+++ b/vespalib/src/vespa/vespalib/websocket/acceptor.cpp
@@ -3,15 +3,34 @@
#include "acceptor.h"
#include <vespa/vespalib/net/socket_spec.h>
#include <functional>
+#ifdef __APPLE__
+#include <poll.h>
+#endif
namespace vespalib::ws {
void
Acceptor::accept_main(Handler<Socket> &socket_handler)
{
+#ifdef __APPLE__
+ _server_socket.set_blocking(false);
+#endif
while (!_is_closed) {
+#ifdef __APPLE__
+ pollfd fds;
+ fds.fd = _server_socket.get_fd();
+ fds.events = POLLIN;
+ fds.revents = 0;
+ int res = poll(&fds, 1, 10);
+ if (res < 1 || fds.revents == 0 || _is_closed) {
+ continue;
+ }
+#endif
SocketHandle handle = _server_socket.accept();
if (handle.valid()) {
+#ifdef __APPLE__
+ handle.set_blocking(true);
+#endif
socket_handler.handle(std::make_unique<SimpleSocket>(std::move(handle)));
}
}