]> granicus.if.org Git - curl/commitdiff
examples: various fixes in ephiperfifo.c
authorArnaud Rebillout <arnaud.rebillout@collabora.com>
Fri, 1 Mar 2019 09:58:25 +0000 (16:58 +0700)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 1 Mar 2019 20:38:04 +0000 (21:38 +0100)
The main change here is the timer value that was wrong, it was given in
usecs (ms * 1000), while the itimerspec struct wants nsecs (ms * 1000 *
1000). This resulted in the callback being invoked WAY TOO OFTEN.

As a quick check you can run this command before and after applying this
commit:

    # shell 1
    ./ephiperfifo 2>&1 | tee ephiperfifo.log
    # shell 2
    echo http://hacking.elboulangero.com > hiper.fifo

Then just compare the size of the logs files.

Closes #3633
Fixes #3632
Signed-off-by: Arnaud Rebillout <arnaud.rebillout@collabora.com>
docs/examples/ephiperfifo.c

index efb27b1bd0a1c4685f9071a82383392b47bb4f23..8af65367cc68d9ba30538367db1262e9f3ef546a 100644 (file)
@@ -153,23 +153,26 @@ static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
 
   fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);
 
-  timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   if(timeout_ms > 0) {
     its.it_interval.tv_sec = 1;
     its.it_interval.tv_nsec = 0;
     its.it_value.tv_sec = timeout_ms / 1000;
-    its.it_value.tv_nsec = (timeout_ms % 1000) * 1000;
-    timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
+    its.it_value.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
   }
   else if(timeout_ms == 0) {
-    rc = curl_multi_socket_action(g->multi,
-                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
-    mcode_or_die("multi_timer_cb: curl_multi_socket_action", rc);
+    /* libcurl wants us to timeout now, however setting both fields of
+     * new_value.it_value to zero disarms the timer. The closest we can
+     * do is to schedule the timer to fire in 1 ns. */
+    its.it_interval.tv_sec = 1;
+    its.it_interval.tv_nsec = 0;
+    its.it_value.tv_sec = 0;
+    its.it_value.tv_nsec = 1;
   }
   else {
     memset(&its, 0, sizeof(struct itimerspec));
-    timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   }
+
+  timerfd_settime(g->tfd, /*flags=*/0, &its, NULL);
   return 0;
 }
 
@@ -206,8 +209,8 @@ static void event_cb(GlobalInfo *g, int fd, int revents)
   CURLMcode rc;
   struct itimerspec its;
 
-  int action = (revents & EPOLLIN ? CURL_POLL_IN : 0) |
-               (revents & EPOLLOUT ? CURL_POLL_OUT : 0);
+  int action = (revents & EPOLLIN ? CURL_CSELECT_IN : 0) |
+               (revents & EPOLLOUT ? CURL_CSELECT_OUT : 0);
 
   rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
   mcode_or_die("event_cb: curl_multi_socket_action", rc);