]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
httpc: add hc_pause + http_client_unpause() functionality
authorJaroslav Kysela <perex@perex.cz>
Fri, 13 Nov 2015 08:07:08 +0000 (09:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 13 Nov 2015 10:41:23 +0000 (11:41 +0100)
src/http.h
src/httpc.c

index d21c0edc8ea026606413d13b1f54d7720c6f7fe8..57b63f38138efb20fd285cf574b22523d3f8924f 100644 (file)
@@ -275,6 +275,7 @@ struct http_client {
   char        *hc_bindaddr;
   tvhpoll_t   *hc_efd;
   int          hc_pevents;
+  int          hc_pevents_pause;
 
   int          hc_code;
   http_ver_t   hc_version;
@@ -316,6 +317,7 @@ struct http_client {
   int          hc_running:1;
   int          hc_shutdown_wait:1;
   int          hc_handle_location:1; /* handle the redirection (location) requests */
+  int          hc_pause:1;
 
   http_client_wcmd_t            *hc_wcmd;
   TAILQ_HEAD(,http_client_wcmd)  hc_wqueue;
@@ -375,6 +377,7 @@ int http_client_simple( http_client_t *hc, const url_t *url);
 int http_client_clear_state( http_client_t *hc );
 int http_client_run( http_client_t *hc );
 void http_client_ssl_peer_verify( http_client_t *hc, int verify );
+void http_client_unpause( http_client_t *hc );
 
 /*
  * RTSP helpers
index c17f3a955e0dc985d0429d726eb5b9bfedc52867..109528aed12bbb8e5c755896757692c29eefd7a8 100644 (file)
@@ -168,19 +168,39 @@ static void
 http_client_poll_dir ( http_client_t *hc, int in, int out )
 {
   int events = (in ? TVHPOLL_IN : 0) | (out ? TVHPOLL_OUT : 0);
-  if (hc->hc_efd && hc->hc_pevents != events) {
-    tvhpoll_event_t ev;
-    memset(&ev, 0, sizeof(ev));
-    ev.fd       = hc->hc_fd;
-    ev.events   = events | TVHPOLL_IN;
-    ev.data.ptr = hc;  
-    tvhpoll_add(hc->hc_efd, &ev, 1);
+  tvhpoll_event_t ev;
+  if (hc->hc_efd) {
+    if (events == 0 && hc->hc_pause) {
+      if (hc->hc_pevents_pause == 0)
+        hc->hc_pevents_pause = hc->hc_pevents;
+      memset(&ev, 0, sizeof(ev));
+      ev.fd       = hc->hc_fd;
+      ev.data.ptr = hc;
+      tvhpoll_rem(hc->hc_efd, &ev, 1);
+    } else if (hc->hc_pevents != events) {
+      memset(&ev, 0, sizeof(ev));
+      ev.fd       = hc->hc_fd;
+      ev.events   = events | TVHPOLL_IN;
+      ev.data.ptr = hc;
+      tvhpoll_add(hc->hc_efd, &ev, 1);
+    }
   }
   hc->hc_pevents = events;
   /* make sure to se the correct errno for our SSL routines */
   errno = EAGAIN;
 }
 
+void
+http_client_unpause( http_client_t *hc )
+{
+  if (hc->hc_pause) {
+    http_client_poll_dir(hc, hc->hc_pevents_pause & TVHPOLL_IN,
+                             hc->hc_pevents_pause & TVHPOLL_OUT);
+    hc->hc_pause = 0;
+    hc->hc_pevents_pause = 0;
+  }
+}
+
 static void
 http_client_direction ( http_client_t *hc, int sending )
 {
@@ -909,6 +929,10 @@ http_client_run( http_client_t *hc )
   }
 
 retry:
+  if (hc->hc_pause) {
+    http_client_poll_dir(hc, 0, 0);
+    return HTTP_CON_RECEIVING;
+  }
   if (hc->hc_ssl)
     r = http_client_ssl_recv(hc, buf, hc->hc_io_size);
   else