diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2019-08-21 11:28:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-21 11:28:55 +0200 |
commit | ebaeab3586618252f4e28237de070b48e743e87a (patch) | |
tree | 15ee4e2629befc3b7984000ee9c76a7ed348df3f /vespalib | |
parent | 21082911a3825fb8bc9f6d0ed74d1bdf5d5c5dab (diff) | |
parent | b95cf87d3da1659c516afca36c10b26425824d88 (diff) |
Merge pull request #10324 from vespa-engine/toregge/avoid-hang-in-vespalib-websocket-acceptor
Avoid hang in vepalib::ws::Acceptor::accept_main on systems where
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))); } } |