From 594eb74c4c180dd903a9a3162321e87b8a208576 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Wed, 4 Jul 2007 18:44:13 +0000 Subject: Fix deadlock when fetching stylesheets when max_fetchers_per_host is reached by splitting fetch_can_be_freed() into fetch_remove_from_queues() and fetch_free(). svn path=/trunk/netsurf/; revision=3380 --- content/fetch.c | 8 +++----- content/fetch.h | 3 ++- content/fetchers/fetch_curl.c | 9 ++++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/content/fetch.c b/content/fetch.c index b69f50be1..a325fb17a 100644 --- a/content/fetch.c +++ b/content/fetch.c @@ -89,7 +89,6 @@ static void fetch_unref_fetcher(scheme_fetcher *fetcher); static void fetch_dispatch_jobs(void); static bool fetch_choose_and_dispatch(void); static bool fetch_dispatch_job(struct fetch *fetch); -static void fetch_free(struct fetch *f); /** @@ -544,8 +543,8 @@ fetch_send_callback(fetch_msg msg, struct fetch *fetch, const void *data, fetch->callback(msg, fetch->p, data, size); } -void -fetch_can_be_freed(struct fetch *fetch) + +void fetch_remove_from_queues(struct fetch *fetch) { int all_active, all_queued; @@ -565,10 +564,9 @@ fetch_can_be_freed(struct fetch *fetch) LOG(("Fetch ring is now %d elements.", all_active)); LOG(("Queue ring is now %d elements.", all_queued)); - - fetch_free(fetch); } + void fetch_set_http_code(struct fetch *fetch, long http_code) { diff --git a/content/fetch.h b/content/fetch.h index 819f29fa9..d369bec76 100644 --- a/content/fetch.h +++ b/content/fetch.h @@ -110,7 +110,8 @@ bool fetch_add_fetcher(const char *scheme, void fetch_send_callback(fetch_msg msg, struct fetch *fetch, const void *data, unsigned long size); -void fetch_can_be_freed(struct fetch *fetch); +void fetch_remove_from_queues(struct fetch *fetch); +void fetch_free(struct fetch *f); void fetch_set_http_code(struct fetch *fetch, long http_code); const char *fetch_get_referer_to_send(struct fetch *fetch); #endif diff --git a/content/fetchers/fetch_curl.c b/content/fetchers/fetch_curl.c index 41ebc3fea..8587c9b1d 100644 --- a/content/fetchers/fetch_curl.c +++ b/content/fetchers/fetch_curl.c @@ -644,7 +644,8 @@ void fetch_curl_abort(void *vf) if (f->curl_handle) { f->abort = true; } else { - fetch_can_be_freed(f->fetch_handle); + fetch_remove_from_queues(f->fetch_handle); + fetch_free(f->fetch_handle); } } @@ -672,7 +673,7 @@ void fetch_curl_stop(struct curl_fetch_info *f) f->curl_handle = 0; } - fetch_can_be_freed(f->fetch_handle); + fetch_remove_from_queues(f->fetch_handle); } @@ -808,6 +809,8 @@ void fetch_curl_done(CURL *curl_handle, CURLcode result) else error = true; + fetch_curl_stop(f); + /* If finished, acquire cache info to pass to callback */ if (finished) { memcpy(&cachedata, &f->cachedata, sizeof(struct cache_data)); @@ -908,7 +911,7 @@ void fetch_curl_done(CURL *curl_handle, CURLcode result) fetch_send_callback(FETCH_ERROR, f->fetch_handle, fetch_error_buffer, 0); - fetch_curl_stop(f); + fetch_free(f->fetch_handle); } -- cgit v1.2.3