diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2019-08-19 13:34:01 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2019-08-19 13:34:01 +0200 |
commit | b95cf87d3da1659c516afca36c10b26425824d88 (patch) | |
tree | 5943486331b0457684191a6238972c828a045027 /vespalib | |
parent | 5fb8e66dbd2d6e02a64a054e147ac7214943d563 (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.cpp | 19 |
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))); } } |