--- sargasso2/feed.c 2006/09/26 21:31:28 77 +++ sargasso2/feed.c 2006/09/30 21:34:24 78 @@ -21,6 +21,8 @@ const char *feed_error = 0; static const char *feed_status_name[] = { "NEW", "FETCHING", "OK", "ERROR" }; static CURLM *curl_multi_handle; +static unsigned int fetching = 0; +#define MAX_FETCHES 3 static void feed_set_status(struct feed *feed, feed_status status); @@ -236,8 +238,11 @@ } } - if (running || queue) - feed_work_needed = true; + for (i = 0; i != feed_count; i++) + if (feeds[i].status == FEED_NEW || + feeds[i].status == FEED_FETCHING || + feeds[i].status == FEED_UPDATE) + feed_work_needed = true; for (i = 0; i != feed_count; i++) if (feeds[i].updated) @@ -254,7 +259,8 @@ { assert(feed); - if (feed->status == FEED_NEW || feed->status == FEED_UPDATE) { + if ((feed->status == FEED_NEW || feed->status == FEED_UPDATE) && + fetching < MAX_FETCHES) { feed_create_fetch(feed); if (feed->status != FEED_ERROR) feed_start_fetch(feed); @@ -282,6 +288,7 @@ headers2 = curl_slist_append(headers, "Accept: " "application/rss+xml, application/xml, text/xml"); if (!headers2) { + curl_easy_cleanup(feed); curl_slist_free_all(headers); feed_set_status(feed, FEED_ERROR); feed->error = "Out of memory"; @@ -295,6 +302,7 @@ snprintf(if_none_match, n, "If-None-Match: %s", feed->etag); headers2 = curl_slist_append(headers, if_none_match); if (!headers2) { + curl_easy_cleanup(curl); curl_slist_free_all(headers); feed_set_status(feed, FEED_ERROR); feed->error = "Out of memory"; @@ -352,6 +360,7 @@ printf("fetching feed %s\n", feed->url); + fetching++; feed_work_needed = true; } @@ -436,6 +445,8 @@ printf("finished %s with result %i %s\n", feed->url, result, curl_easy_strerror(result)); + fetching--; + if (result == CURLE_OK) { curl_easy_getinfo(feed->curl, CURLINFO_RESPONSE_CODE, &http_code); @@ -514,6 +525,9 @@ } //xmlDebugDumpDocument(stdout, doc); + free(feed->data); + feed->data = 0; + for (rss = doc->children; rss; rss = rss->next) if (rss->type == XML_ELEMENT_NODE && !strcmp(rss->name, "rss")) break;