summaryrefslogtreecommitdiff
path: root/content
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2016-06-27 21:00:58 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2016-06-27 21:00:58 +0100
commita468b409901236ecf77f0cbd81dfeda96cebc758 (patch)
tree9796fda726d37a3a30da44fbcb8690d200b2b079 /content
parentab6c03f3112ef01e41a8a1e931a6990636edbae4 (diff)
downloadnetsurf-a468b409901236ecf77f0cbd81dfeda96cebc758.tar.gz
netsurf-a468b409901236ecf77f0cbd81dfeda96cebc758.tar.bz2
Refactor the fdset acquisition into the fetchers to stop fetch.c including curl.h
Diffstat (limited to 'content')
-rw-r--r--content/fetch.c23
-rw-r--r--content/fetchers.h6
-rw-r--r--content/fetchers/curl.c18
3 files changed, 38 insertions, 9 deletions
diff --git a/content/fetch.c b/content/fetch.c
index c5928ba85..decb261a7 100644
--- a/content/fetch.c
+++ b/content/fetch.c
@@ -39,7 +39,6 @@
#include <strings.h>
#include <time.h>
#include <libwapcaplet/libwapcaplet.h>
-#include <curl/curl.h>
#include "utils/config.h"
#include "utils/corestrings.h"
@@ -386,8 +385,7 @@ nserror fetcher_fdset(fd_set *read_fd_set,
fd_set *except_fd_set,
int *maxfd_out)
{
- CURLMcode code;
- int maxfd;
+ int maxfd = -1;
int fetcherd; /* fetcher index */
if (!fetch_dispatch_jobs()) {
@@ -408,12 +406,19 @@ nserror fetcher_fdset(fd_set *read_fd_set,
FD_ZERO(read_fd_set);
FD_ZERO(write_fd_set);
FD_ZERO(except_fd_set);
- code = curl_multi_fdset(fetch_curl_multi,
- read_fd_set,
- write_fd_set,
- except_fd_set,
- &maxfd);
- assert(code == CURLM_OK);
+
+ for (fetcherd = 0; fetcherd < MAX_FETCHERS; fetcherd++) {
+ if ((fetchers[fetcherd].refcount > 0) &&
+ (fetchers[fetcherd].ops.fdset != NULL)) {
+ /* fetcher present */
+ int fetcher_maxfd;
+ fetcher_maxfd = fetchers[fetcherd].ops.fdset(
+ fetchers[fetcherd].scheme, read_fd_set,
+ write_fd_set, except_fd_set);
+ if (fetcher_maxfd > maxfd)
+ maxfd = fetcher_maxfd;
+ }
+ }
if (maxfd >= 0) {
/* change the scheduled poll to happen is a 1000ms as
diff --git a/content/fetchers.h b/content/fetchers.h
index 92b11dc69..cd09e92e4 100644
--- a/content/fetchers.h
+++ b/content/fetchers.h
@@ -91,6 +91,12 @@ struct fetcher_operation_table {
void (*poll)(lwc_string *scheme);
/**
+ * update an fdset with the FDs needed to poll cleanly
+ */
+ int (*fdset)(lwc_string *scheme, fd_set *read_set, fd_set *write_set,
+ fd_set *error_set);
+
+ /**
* Finalise the fetcher.
*/
void (*finalise)(lwc_string *scheme);
diff --git a/content/fetchers/curl.c b/content/fetchers/curl.c
index 10a0d9918..66970ef7e 100644
--- a/content/fetchers/curl.c
+++ b/content/fetchers/curl.c
@@ -1374,6 +1374,23 @@ fetch_curl_header(char *data, size_t size, size_t nmemb, void *_f)
#undef SKIP_ST
}
+static int fetch_curl_fdset(lwc_string *scheme, fd_set *read_set,
+ fd_set *write_set, fd_set *error_set)
+{
+ CURLMcode code;
+ int maxfd = -1;
+
+ code = curl_multi_fdset(fetch_curl_multi,
+ read_set,
+ write_set,
+ error_set,
+ &maxfd);
+ assert(code == CURLM_OK);
+
+ return maxfd;
+}
+
+
/* exported function documented in content/fetchers/curl.h */
nserror fetch_curl_register(void)
@@ -1390,6 +1407,7 @@ nserror fetch_curl_register(void)
.abort = fetch_curl_abort,
.free = fetch_curl_free,
.poll = fetch_curl_poll,
+ .fdset = fetch_curl_fdset,
.finalise = fetch_curl_finalise
};