rebase poll branch
This commit is contained in:
		| @@ -15,6 +15,7 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  | #include <poll.h> | ||||||
|  |  | ||||||
| #include <algorithm> | #include <algorithm> | ||||||
| #include <iostream> | #include <iostream> | ||||||
| @@ -37,22 +38,21 @@ namespace ix | |||||||
|  |  | ||||||
|     void Socket::poll(const OnPollCallback& onPollCallback, int timeoutSecs) |     void Socket::poll(const OnPollCallback& onPollCallback, int timeoutSecs) | ||||||
|     { |     { | ||||||
|         fd_set rfds; |         if (_sockfd == -1) | ||||||
|         FD_ZERO(&rfds); |         { | ||||||
|         FD_SET(_sockfd, &rfds); |             onPollCallback(PollResultType_Error); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
| #ifdef __linux__ | #ifdef __linux__ | ||||||
|         FD_SET(_eventfd.getFd(), &rfds); |         FD_SET(_eventfd.getFd(), &rfds); | ||||||
| #endif | #endif | ||||||
|  |         struct pollfd fds[1]; | ||||||
|  |         fds[0].fd = _sockfd; | ||||||
|  |         fds[0].events = POLLIN | POLLHUP | POLLERR; | ||||||
|  |  | ||||||
|         struct timeval timeout; |         int timeout_msecs = timeoutSecs * 1000; | ||||||
|         timeout.tv_sec = timeoutSecs; |         int ret = ::poll(fds, 1, timeout_msecs); | ||||||
|         timeout.tv_usec = 0; |  | ||||||
|  |  | ||||||
|         int sockfd = _sockfd; |  | ||||||
|         int nfds = (std::max)(sockfd, _eventfd.getFd()); |  | ||||||
|         int ret = select(nfds + 1, &rfds, nullptr, nullptr, |  | ||||||
|                          (timeoutSecs == kDefaultPollNoTimeout) ? nullptr : &timeout); |  | ||||||
|  |  | ||||||
|         PollResultType pollResult = PollResultType_ReadyForRead; |         PollResultType pollResult = PollResultType_ReadyForRead; | ||||||
|         if (ret < 0) |         if (ret < 0) | ||||||
| @@ -65,6 +65,7 @@ namespace ix | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         onPollCallback(pollResult); |         onPollCallback(pollResult); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void Socket::wakeUpFromPoll() |     void Socket::wakeUpFromPoll() | ||||||
| @@ -92,6 +93,9 @@ namespace ix | |||||||
|  |  | ||||||
|         if (_sockfd == -1) return; |         if (_sockfd == -1) return; | ||||||
|  |  | ||||||
|  | #if 1 | ||||||
|  |         ::shutdown(_sockfd, SHUT_RDWR); | ||||||
|  | #endif | ||||||
|         closeSocket(_sockfd); |         closeSocket(_sockfd); | ||||||
|         _sockfd = -1; |         _sockfd = -1; | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user