diff --git a/hiper/hipev.c b/hiper/hipev.c index c46e8abed..050d7333d 100644 --- a/hiper/hipev.c +++ b/hiper/hipev.c @@ -86,6 +86,8 @@ static int running_handles; done, we can remove the timerevent as well */ static struct event timerevent; +static void update_timeout(CURLM *multi_handle); + /* called from libevent on action on a particular socket ("event") */ static void eventcallback(int fd, short type, void *userp) { @@ -110,6 +112,8 @@ static void eventcallback(int fd, short type, void *userp) if(evtimer_pending(&timerevent, NULL)) evtimer_del(&timerevent); } + else + update_timeout(fdp->multi); } /* called from libevent when our timer event expires */ @@ -118,8 +122,6 @@ static void timercallback(int fd, short type, void *userp) (void)fd; /* not used for this */ (void)type; /* ignored in here */ CURLM *multi_handle = (CURLM *)userp; - long timeout_ms; - struct timeval timeout; int running_handles; CURLMcode rc; @@ -131,15 +133,9 @@ static void timercallback(int fd, short type, void *userp) &running_handles); } while (rc == CURLM_CALL_MULTI_PERFORM); - if(running_handles) { + if(running_handles) /* Get the current timeout value from libcurl and set a new timeout */ - curl_multi_timeout(multi_handle, &timeout_ms); - - /* convert ms to timeval */ - timeout.tv_sec = timeout_ms/1000; - timeout.tv_usec = (timeout_ms%1000)*1000; - evtimer_add(&timerevent, &timeout); - } + update_timeout(multi_handle); } static void remsock(struct fdinfo *f) @@ -266,6 +262,7 @@ writecallback(void *ptr, size_t size, size_t nmemb, void *data) { size_t realsize = size * nmemb; struct connection *c = (struct connection *)data; + (void)ptr; c->dlcounter += realsize; c->global->dlcounter += realsize; @@ -283,19 +280,28 @@ int num_total; int num_idle; int num_active; +static void update_timeout(CURLM *multi_handle) +{ + long timeout_ms; + struct timeval timeout; + + /* Since we need a global timeout to occur after a given time of inactivity, + we use a single timeout-event. Get the timeout value from libcurl, and + update it after every call to libcurl. */ + curl_multi_timeout(multi_handle, &timeout_ms); + + /* convert ms to timeval */ + timeout.tv_sec = timeout_ms/1000; + timeout.tv_usec = (timeout_ms%1000)*1000; + evtimer_add(&timerevent, &timeout); +} + int main(int argc, char **argv) { CURLM *multi_handle; CURLMsg *msg; CURLcode code = CURLE_OK; - CURLMcode mcode = CURLM_OK; - int rc; int i; - int selectmaxamount; - struct fdinfo *fdp; - char act; - long timeout_ms; - struct timeval timeout; memset(&info, 0, sizeof(struct globalinfo)); @@ -324,12 +330,14 @@ int main(int argc, char **argv) printf("About to do %d connections\n", num_total); + /* initialize the timeout event */ + evtimer_set(&timerevent, timercallback, multi_handle); + /* init the multi stack */ multi_handle = curl_multi_init(); for(i=0; i< num_total; i++) { CURL *e; - char *nl; memset(&conns[i], 0, sizeof(struct connection)); @@ -370,14 +378,8 @@ int main(int argc, char **argv) while(CURLM_CALL_MULTI_PERFORM == curl_multi_socket_all(multi_handle, &running_handles)); - /* Since we need a global timeout to occur after a given time of inactivity, - we add a single timeout-event. Get the timeout value from libcurl */ - curl_multi_timeout(multi_handle, &timeout_ms); - /* convert ms to timeval */ - timeout.tv_sec = timeout_ms/1000; - timeout.tv_usec = (timeout_ms%1000)*1000; - evtimer_set(&timerevent, timercallback, multi_handle); - evtimer_add(&timerevent, &timeout); + /* update timeout */ + update_timeout(multi_handle); /* event_dispatch() runs the event main loop. It ends when no events are left to wait for. */