+ assert_msg(active_fd == 1 , "poll() returned an unexpected number of active file descriptors");
+ if (fds.revents & POLLIN or fds.revents & POLLOUT)
+ {
+ return MEMCACHED_SUCCESS;
+ }
+
+ if (fds.revents & POLLHUP)
+ {
+ return memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT,
+ memcached_literal_param("poll() detected hang up"));
+ }
+
+ if (fds.revents & POLLERR)
+ {
+ int local_errno= EINVAL;
+ int err;
+ socklen_t len= sizeof (err);
+ if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
+ {
+ if (err == 0) // treat this as EINTR
+ {
+ continue;
+ }
+ local_errno= err;
+ }
+ memcached_quit_server(ptr, true);
+ return memcached_set_errno(*ptr, local_errno, MEMCACHED_AT,
+ memcached_literal_param("poll() returned POLLHUP"));
+ }
+
+ return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT, memcached_literal_param("poll() returned a value that was not dealt with"));