]> granicus.if.org Git - libevent/commitdiff
r15086@catbus: nickm | 2007-09-15 14:42:55 -0400
authorNick Mathewson <nickm@torproject.org>
Sat, 15 Sep 2007 18:45:57 +0000 (18:45 +0000)
committerNick Mathewson <nickm@torproject.org>
Sat, 15 Sep 2007 18:45:57 +0000 (18:45 +0000)
 Patch from Trond Norbye: Fix two solaris bugs.

svn:r432

ChangeLog
evport.c

index 76d78bcf09d43882b4dfbd25f7630141ddb6b657..2d6ded1fd680a374409fd6346d5f9cea7e0240d2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,3 +12,5 @@ Changes in current version:
  o Respond to nonstandard DNS queries with "NOTIMPL" rather than by ignoring them.
  o In DNS responses, the CD flag should be preserved, not the TC flag.
  o Fix http.c to compile properly with USE_DEBUG; from Christopher Layne
+ o Handle NULL timeouts correctly on Solaris; from Trond Norbye
+ o Recalculate pending events properly when reallocating event array on Solaris; from Trond Norbye
\ No newline at end of file
index 7d6f2d262e716797babc9dbcf44a6e844d913ee6..8bb3c8cf5b63fad8ce2f918a607d5e3d73df48ac 100644 (file)
--- a/evport.c
+++ b/evport.c
@@ -240,8 +240,10 @@ static int
 grow(struct evport_data *epdp, int factor)
 {
        struct fd_info *tmp;
+       struct fd_info *old = epdp->ed_fds;
        int oldsize = epdp->ed_nevents;
        int newsize = factor * oldsize;
+       int ii;
        assert(factor > 1);
 
        check_evportop(epdp);
@@ -252,6 +254,15 @@ grow(struct evport_data *epdp, int factor)
        epdp->ed_fds = tmp;
        memset((char*) (epdp->ed_fds + oldsize), 0, 
            (newsize - oldsize)*sizeof(struct fd_info));
+
+       /* The ev_pending array contains pointers into the released array. */
+       for (ii = 0; ii < EVENTS_PER_GETN; ++ii) {
+               if (epdp->ed_pending[ii] != 0) {
+                       int offset = epdp->ed_pending[ii] - old;
+                       epdp->ed_pending[ii] = epdp->ed_fds + offset;
+               }
+       }
+        
        epdp->ed_nevents = newsize;
 
        check_evportop(epdp);
@@ -309,9 +320,16 @@ evport_dispatch(struct event_base *base, void *arg, struct timeval *tv)
 
        /*
         * We have to convert a struct timeval to a struct timespec
-        * (only difference is nanoseconds vs. microseconds)
+        * (only difference is nanoseconds vs. microseconds). If no time-based
+        * events are active, we should wait for I/O (and tv == NULL).
         */
-       struct timespec ts = {tv->tv_sec, tv->tv_usec * 1000};
+       struct timespec ts;
+       struct timespec *ts_p = NULL;
+       if (tv != NULL) {
+               ts.tv_sec = tv->tv_sec;
+               ts.tv_nsec = tv->tv_usec * 1000;
+               ts_p = &ts;
+       }
 
        /*
         * Before doing anything else, we need to reassociate the events we hit
@@ -330,7 +348,7 @@ evport_dispatch(struct event_base *base, void *arg, struct timeval *tv)
        }
 
        if ((res = port_getn(epdp->ed_port, pevtlist, EVENTS_PER_GETN, 
-                   (unsigned int *) &nevents, &ts)) == -1) {
+                   (unsigned int *) &nevents, ts_p)) == -1) {
                if (errno == EINTR) {
                        evsignal_process(base);
                        return (0);