1
1

less code duplication in the poll vs select code flows

libssh2_keepalive_send and libssh2_session_block_directions are
now used outside of the #ifdef blocks.
Этот коммит содержится в:
Daniel Stenberg 2010-04-13 10:45:01 +02:00
родитель 79ee2f339e
Коммит f514bcac53

Просмотреть файл

@ -519,59 +519,53 @@ int _libssh2_wait_socket(LIBSSH2_SESSION *session)
{ {
int rc; int rc;
int dir; int dir;
#if HAVE_POLL
struct pollfd sockets[1];
int seconds_to_next;
rc = libssh2_keepalive_send (session, &seconds_to_next);
if (rc < 0)
return rc;
sockets[0].fd = session->socket_fd;
sockets[0].events = 0;
sockets[0].revents = 0;
/* now make sure we wait in the correct direction */
dir = libssh2_session_block_directions(session);
if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)
sockets[0].events |= POLLIN;
if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
sockets[0].events |= POLLOUT;
rc = poll(sockets, 1, seconds_to_next ? seconds_to_next / 1000 : -1);
#else
fd_set fd;
fd_set *writefd = NULL;
fd_set *readfd = NULL;
struct timeval tv;
int seconds_to_next; int seconds_to_next;
rc = libssh2_keepalive_send (session, &seconds_to_next); rc = libssh2_keepalive_send (session, &seconds_to_next);
if (rc < 0) if (rc < 0)
return rc; return rc;
else {
/* figure out what to wait for */
dir = libssh2_session_block_directions(session);
tv.tv_sec = seconds_to_next; #ifdef HAVE_POLL
tv.tv_usec = 0; struct pollfd sockets[1];
FD_ZERO(&fd); sockets[0].fd = session->socket_fd;
FD_SET(session->socket_fd, &fd); sockets[0].events = 0;
sockets[0].revents = 0;
/* now make sure we wait in the correct direction */ if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)
dir = libssh2_session_block_directions(session); sockets[0].events |= POLLIN;
if(dir & LIBSSH2_SESSION_BLOCK_INBOUND) if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
readfd = &fd; sockets[0].events |= POLLOUT;
if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) rc = poll(sockets, 1, seconds_to_next ? seconds_to_next / 1000 : -1);
writefd = &fd; #else
fd_set fd;
fd_set *writefd = NULL;
fd_set *readfd = NULL;
struct timeval tv;
/* Note that this COULD be made to use a timeout that perhaps could be tv.tv_sec = seconds_to_next;
customizable by the app or something... */ tv.tv_usec = 0;
rc = select(session->socket_fd + 1, readfd, writefd, NULL,
seconds_to_next ? &tv : NULL); FD_ZERO(&fd);
FD_SET(session->socket_fd, &fd);
if(dir & LIBSSH2_SESSION_BLOCK_INBOUND)
readfd = &fd;
if(dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
writefd = &fd;
/* Note that this COULD be made to use a timeout that perhaps could be
customizable by the app or something... */
rc = select(session->socket_fd + 1, readfd, writefd, NULL,
seconds_to_next ? &tv : NULL);
#endif #endif
}
if(rc <= 0) { if(rc <= 0) {
/* timeout (or error), bail out with a timeout error */ /* timeout (or error), bail out with a timeout error */