1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
/* LibMemcached
* Copyright (C) 2010 Brian Aker, Trond Norbye
* All rights reserved.
*
* Use and distribution licensed under the BSD license. See
* the COPYING file in the parent directory for full text.
*
* Summary: Implementation of poll by using select
*
*/
#include "config.h"
#include <sys/time.h>
#include <strings.h>
int poll(struct pollfd fds[], nfds_t nfds, int tmo)
{
fd_set readfds, writefds, errorfds;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&errorfds);
int maxfd= 0;
for (nfds_t x= 0; x < nfds; ++x)
{
if (fds[x].events & (POLLIN | POLLOUT))
{
#ifndef WIN32
if (fds[x].fd > maxfd)
{
maxfd= fds[x].fd;
}
#endif
if (fds[x].events & POLLIN)
{
FD_SET(fds[x].fd, &readfds);
}
if (fds[x].events & POLLOUT)
{
FD_SET(fds[x].fd, &writefds);
}
}
}
struct timeval timeout= { .tv_sec = tmo / 1000,
.tv_usec= (tmo % 1000) * 1000 };
struct timeval *tp= &timeout;
if (tmo == -1)
{
tp= NULL;
}
int ret= select(maxfd + 1, &readfds, &writefds, &errorfds, tp);
if (ret <= 0)
{
return ret;
}
/* Iterate through all of them because I need to clear the revent map */
for (nfds_t x= 0; x < nfds; ++x)
{
fds[x].revents= 0;
if (FD_ISSET(fds[x].fd, &readfds))
{
fds[x].revents |= POLLIN;
}
if (FD_ISSET(fds[x].fd, &writefds))
{
fds[x].revents |= POLLOUT;
}
if (FD_ISSET(fds[x].fd, &errorfds))
{
fds[x].revents |= POLLERR;
}
}
return ret;
}
|