summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-08-21 11:28:55 +0200
committerGitHub <noreply@github.com>2019-08-21 11:28:55 +0200
commitebaeab3586618252f4e28237de070b48e743e87a (patch)
tree15ee4e2629befc3b7984000ee9c76a7ed348df3f /vespalib
parent21082911a3825fb8bc9f6d0ed74d1bdf5d5c5dab (diff)
parentb95cf87d3da1659c516afca36c10b26425824d88 (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.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)));
}
}