~flier-lu/libmemcached/win32-vs2008

« back to all changes in this revision

Viewing changes to poll/poll.c

  • Committer: Flier Lu
  • Date: 2011-01-07 04:01:52 UTC
  • Revision ID: flier.lu@gmail.com-20110107040152-gzvrzlx717qdbave
port poll to win32

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
 *
10
10
 */
11
11
#include "config.h"
12
 
#include <sys/time.h>
13
 
#include <strings.h>
 
12
 
 
13
#ifdef WIN32
 
14
# include <ws2tcpip.h>
 
15
#else
 
16
# include <sys/time.h>
 
17
# include <strings.h>
 
18
#endif
14
19
 
15
20
int poll(struct pollfd fds[], nfds_t nfds, int tmo)
16
21
{
 
22
  int maxfd= 0, ret;
 
23
  nfds_t x;
 
24
  struct timeval timeout;
 
25
  struct timeval *tp;
 
26
 
17
27
  fd_set readfds, writefds, errorfds;
18
28
  FD_ZERO(&readfds);
19
29
  FD_ZERO(&writefds);
20
 
  FD_ZERO(&errorfds);
21
 
 
22
 
  int maxfd= 0;
23
 
 
24
 
  for (nfds_t x= 0; x < nfds; ++x)
 
30
  FD_ZERO(&errorfds);  
 
31
 
 
32
  for (x= 0; x < nfds; ++x)
25
33
  {
26
34
    if (fds[x].events & (POLLIN | POLLOUT))
27
35
    {
42
50
    }
43
51
  }
44
52
 
45
 
  struct timeval timeout= { .tv_sec = tmo / 1000,
46
 
                            .tv_usec= (tmo % 1000) * 1000 };
47
 
  struct timeval *tp= &timeout;
 
53
  timeout.tv_sec = tmo / 1000;
 
54
  timeout.tv_usec= (tmo % 1000) * 1000;
 
55
 
 
56
  tp= &timeout;
48
57
  if (tmo == -1)
49
58
  {
50
59
    tp= NULL;
51
60
  }
52
 
  int ret= select(maxfd + 1, &readfds, &writefds, &errorfds, tp);
 
61
  ret= select(maxfd + 1, &readfds, &writefds, &errorfds, tp);
53
62
  if (ret <= 0)
54
63
  {
55
64
    return ret;
56
65
  }
57
66
 
58
67
  /* Iterate through all of them because I need to clear the revent map */
59
 
  for (nfds_t x= 0; x < nfds; ++x)
 
68
  for (x= 0; x < nfds; ++x)
60
69
  {
61
70
    fds[x].revents= 0;
62
71
    if (FD_ISSET(fds[x].fd, &readfds))