Author: bursa
Date: Wed Jul 4 19:44:13 2007
New Revision: 3380
URL:
http://source.netsurf-browser.org?rev=3D3380&view=3Drev
Log:
Fix deadlock when fetching stylesheets when max_fetchers_per_host is reache=
d by splitting fetch_can_be_freed() into fetch_remove_from_queues() and fet=
ch_free().
Modified:
trunk/netsurf/content/fetch.c
trunk/netsurf/content/fetch.h
trunk/netsurf/content/fetchers/fetch_curl.c
Modified: trunk/netsurf/content/fetch.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/content/fetch.c?rev=3D=
3380&r1=3D3379&r2=3D3380&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/netsurf/content/fetch.c (original)
+++ trunk/netsurf/content/fetch.c Wed Jul 4 19:44:13 2007
@@ -89,7 +89,6 @@
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->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,9 +564,8 @@
=
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)
Modified: trunk/netsurf/content/fetch.h
URL:
http://source.netsurf-browser.org/trunk/netsurf/content/fetch.h?rev=3D=
3380&r1=3D3379&r2=3D3380&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/netsurf/content/fetch.h (original)
+++ trunk/netsurf/content/fetch.h Wed Jul 4 19:44:13 2007
@@ -110,7 +110,8 @@
=
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
Modified: trunk/netsurf/content/fetchers/fetch_curl.c
URL:
http://source.netsurf-browser.org/trunk/netsurf/content/fetchers/fetch=
_curl.c?rev=3D3380&r1=3D3379&r2=3D3380&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/netsurf/content/fetchers/fetch_curl.c (original)
+++ trunk/netsurf/content/fetchers/fetch_curl.c Wed Jul 4 19:44:13 2007
@@ -644,7 +644,8 @@
if (f->curl_handle) {
f->abort =3D 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 @@
f->curl_handle =3D 0;
}
=
- fetch_can_be_freed(f->fetch_handle);
+ fetch_remove_from_queues(f->fetch_handle);
}
=
=
@@ -808,6 +809,8 @@
else
error =3D 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 @@
fetch_send_callback(FETCH_ERROR, f->fetch_handle,
fetch_error_buffer, 0);
=
- fetch_curl_stop(f);
+ fetch_free(f->fetch_handle);
}
=
=