diff options
| author | malosek <malosek@fastmq.com> | 2010-01-05 11:05:03 +0100 | 
|---|---|---|
| committer | malosek <malosek@fastmq.com> | 2010-01-05 11:05:03 +0100 | 
| commit | 472ddf8de2c93f750831d52b5473cdbed1db51e8 (patch) | |
| tree | 476650afd868502a5a023599910c5415fdc57fe6 /src/zmq.cpp | |
| parent | d10c605fa94a8fe8265785043aeef63983e07f3f (diff) | |
| parent | 4f6baf4dde627656b63cc4e2acdb78a8577ba640 (diff) | |
fixed failed merge with autogen.sh
Diffstat (limited to 'src/zmq.cpp')
| -rw-r--r-- | src/zmq.cpp | 25 | 
1 files changed, 19 insertions, 6 deletions
| diff --git a/src/zmq.cpp b/src/zmq.cpp index cce07af..e244171 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -1,5 +1,5 @@  /* -    Copyright (c) 2007-2009 FastMQ Inc. +    Copyright (c) 2007-2010 iMatix Corporation      This file is part of 0MQ. @@ -264,7 +264,7 @@ int zmq_recv (void *s_, zmq_msg_t *msg_, int flags_)      return (((zmq::socket_base_t*) s_)->recv (msg_, flags_));  } -int zmq_poll (zmq_pollitem_t *items_, int nitems_) +int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)  {  #if defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\      defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\ @@ -321,6 +321,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_)          npollfds++;      } +    int timeout = timeout_ > 0 ? timeout_ / 1000 : -1;      int nevents = 0;      bool initial = true;      while (!nevents) { @@ -328,10 +329,16 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_)          //  Wait for activity. In the first iteration just check for events,          //  don't wait. Waiting would prevent exiting on any events that may          //  already be signaled on 0MQ sockets. -        int rc = poll (pollfds, npollfds, initial ? 0 : -1); +        int rc = poll (pollfds, npollfds, initial ? 0 : timeout);          if (rc == -1 && errno == EINTR)              continue;          errno_assert (rc >= 0); + +        //  If timeout was hit with no events signaled, return zero. +        if (!initial && rc == 0) +            return 0; + +        //  From now on, perform blocking polling.          initial = false;          //  Process 0MQ commands if needed. @@ -426,6 +433,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_)              maxfd = notify_fd;      } +    timeval timeout = {timeout_ / 1000000, timeout_ % 1000000}; +    timeval zero_timeout = {0, 0};      int nevents = 0;      bool initial = true;      while (!nevents) { @@ -433,17 +442,21 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_)          //  Wait for activity. In the first iteration just check for events,          //  don't wait. Waiting would prevent exiting on any events that may          //  already be signaled on 0MQ sockets. -        timeval timeout = {0, 0};          int rc = select (maxfd, &pollset_in, &pollset_out, &pollset_err, -            initial ? &timeout : NULL); +            initial ? &zero_timeout : &timeout);  #if defined ZMQ_HAVE_WINDOWS          wsa_assert (rc != SOCKET_ERROR);  #else          if (rc == -1 && errno == EINTR)              continue;  #endif -          errno_assert (rc >= 0); + +        //  If timeout was hit with no events signaled, return zero. +        if (!initial && rc == 0) +            return 0; + +        //  From now on, perform blocking select.          initial = false;          //  Process 0MQ commands if needed. | 
