fetchers: Rework the about, data, file, and resource fetcher poll loop
This simplifies the poll loops a little more and makes me less worried that some other corner case will bite us in the future. Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
parent
a47270c93e
commit
bb5d72410b
|
@ -1580,7 +1580,6 @@ static void fetch_about_free(void *ctx)
|
|||
{
|
||||
struct fetch_about_context *c = ctx;
|
||||
nsurl_unref(c->url);
|
||||
RING_REMOVE(ring, c);
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
@ -1614,14 +1613,14 @@ static void fetch_about_abort(void *ctx)
|
|||
*/
|
||||
static void fetch_about_poll(lwc_string *scheme)
|
||||
{
|
||||
struct fetch_about_context *c, *next;
|
||||
bool was_last_item = false;
|
||||
|
||||
if (ring == NULL) return;
|
||||
struct fetch_about_context *c, *save_ring = NULL;
|
||||
|
||||
/* Iterate over ring, processing each pending fetch */
|
||||
c = ring;
|
||||
do {
|
||||
while (ring != NULL) {
|
||||
/* Take the first entry from the ring */
|
||||
c = ring;
|
||||
RING_REMOVE(ring, c);
|
||||
|
||||
/* Ignore fetches that have been flagged as locked.
|
||||
* This allows safe re-entrant calls to this function.
|
||||
* Re-entrancy can occur if, as a result of a callback,
|
||||
|
@ -1629,7 +1628,7 @@ static void fetch_about_poll(lwc_string *scheme)
|
|||
* again.
|
||||
*/
|
||||
if (c->locked == true) {
|
||||
next = c->r_next;
|
||||
RING_INSERT(save_ring, c);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1639,32 +1638,15 @@ static void fetch_about_poll(lwc_string *scheme)
|
|||
c->handler(c);
|
||||
}
|
||||
|
||||
/* Compute next fetch item at the last possible moment
|
||||
* as processing this item may have added to the ring
|
||||
*/
|
||||
next = c->r_next;
|
||||
was_last_item = next == c;
|
||||
|
||||
/* And now finish */
|
||||
fetch_remove_from_queues(c->fetchh);
|
||||
fetch_free(c->fetchh);
|
||||
}
|
||||
|
||||
/* Having called into the fetch machinery, our ring might
|
||||
* have been updated
|
||||
*/
|
||||
if (was_last_item) {
|
||||
/* We were previously the last item in the ring
|
||||
* so let's reset to the head of the ring
|
||||
* and try again
|
||||
*/
|
||||
c = ring;
|
||||
} else {
|
||||
c = next;
|
||||
}
|
||||
|
||||
/* Advance to next ring entry, exiting if we've reached
|
||||
* the start of the ring or the ring has become empty
|
||||
*/
|
||||
} while (ring != NULL);
|
||||
/* Finally, if we saved any fetches which were locked, put them back
|
||||
* into the ring for next time
|
||||
*/
|
||||
ring = save_ring;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -135,7 +135,6 @@ static void fetch_data_free(void *ctx)
|
|||
nsurl_unref(c->url);
|
||||
free(c->data);
|
||||
free(c->mimetype);
|
||||
RING_REMOVE(ring, c);
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
@ -245,14 +244,14 @@ static bool fetch_data_process(struct fetch_data_context *c)
|
|||
static void fetch_data_poll(lwc_string *scheme)
|
||||
{
|
||||
fetch_msg msg;
|
||||
struct fetch_data_context *c, *next;
|
||||
bool was_last_item = false;
|
||||
|
||||
if (ring == NULL) return;
|
||||
struct fetch_data_context *c, *save_ring = NULL;
|
||||
|
||||
/* Iterate over ring, processing each pending fetch */
|
||||
c = ring;
|
||||
do {
|
||||
while (ring != NULL) {
|
||||
/* Take the first entry from the ring */
|
||||
c = ring;
|
||||
RING_REMOVE(ring, c);
|
||||
|
||||
/* Ignore fetches that have been flagged as locked.
|
||||
* This allows safe re-entrant calls to this function.
|
||||
* Re-entrancy can occur if, as a result of a callback,
|
||||
|
@ -260,7 +259,7 @@ static void fetch_data_poll(lwc_string *scheme)
|
|||
* again.
|
||||
*/
|
||||
if (c->locked == true) {
|
||||
next = c->r_next;
|
||||
RING_INSERT(save_ring, c);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -311,32 +310,15 @@ static void fetch_data_poll(lwc_string *scheme)
|
|||
assert(c->locked == false);
|
||||
}
|
||||
|
||||
/* Compute next fetch item at the last possible moment as
|
||||
* processing this item may have added to the ring.
|
||||
*/
|
||||
next = c->r_next;
|
||||
was_last_item = next == c;
|
||||
|
||||
/* And now finish */
|
||||
fetch_remove_from_queues(c->parent_fetch);
|
||||
fetch_free(c->parent_fetch);
|
||||
}
|
||||
|
||||
/* Having called into the fetch machinery, our ring might
|
||||
* have been updated
|
||||
*/
|
||||
if (was_last_item) {
|
||||
/* We were previously the last item in the ring
|
||||
* so let's reset to the head of the ring
|
||||
* and try again
|
||||
*/
|
||||
c = ring;
|
||||
} else {
|
||||
c = next;
|
||||
}
|
||||
|
||||
/* Advance to next ring entry, exiting if we've reached
|
||||
* the start of the ring or the ring has become empty
|
||||
*/
|
||||
} while (ring != NULL);
|
||||
/* Finally, if we saved any fetches which were locked, put them back
|
||||
* into the ring for next time
|
||||
*/
|
||||
ring = save_ring;
|
||||
}
|
||||
|
||||
nserror fetch_data_register(void)
|
||||
|
|
|
@ -195,7 +195,6 @@ static void fetch_file_free(void *ctx)
|
|||
struct fetch_file_context *c = ctx;
|
||||
nsurl_unref(c->url);
|
||||
free(c->path);
|
||||
RING_REMOVE(ring, c);
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
@ -791,14 +790,13 @@ static void fetch_file_process(struct fetch_file_context *ctx)
|
|||
/** callback to poll for additional file fetch contents */
|
||||
static void fetch_file_poll(lwc_string *scheme)
|
||||
{
|
||||
struct fetch_file_context *c, *next;
|
||||
bool was_last_item = false;
|
||||
struct fetch_file_context *c, *save_ring = NULL;
|
||||
|
||||
if (ring == NULL) return;
|
||||
while (ring != NULL) {
|
||||
/* Take the first entry from the ring */
|
||||
c = ring;
|
||||
RING_REMOVE(ring, c);
|
||||
|
||||
/* Iterate over ring, processing each pending fetch */
|
||||
c = ring;
|
||||
do {
|
||||
/* Ignore fetches that have been flagged as locked.
|
||||
* This allows safe re-entrant calls to this function.
|
||||
* Re-entrancy can occur if, as a result of a callback,
|
||||
|
@ -806,7 +804,7 @@ static void fetch_file_poll(lwc_string *scheme)
|
|||
* again.
|
||||
*/
|
||||
if (c->locked == true) {
|
||||
next = c->r_next;
|
||||
RING_INSERT(save_ring, c);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -816,32 +814,16 @@ static void fetch_file_poll(lwc_string *scheme)
|
|||
fetch_file_process(c);
|
||||
}
|
||||
|
||||
/* Compute next fetch item at the last possible moment as
|
||||
* processing this item may have added to the ring.
|
||||
*/
|
||||
next = c->r_next;
|
||||
was_last_item = next == c;
|
||||
|
||||
/* And now finish */
|
||||
fetch_remove_from_queues(c->fetchh);
|
||||
fetch_free(c->fetchh);
|
||||
|
||||
/* Having called into the fetch machinery, our ring might
|
||||
* have been updated
|
||||
*/
|
||||
if (was_last_item) {
|
||||
/* We were previously the last item in the ring
|
||||
* so let's reset to the head of the ring
|
||||
* and try again
|
||||
*/
|
||||
c = ring;
|
||||
} else {
|
||||
c = next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Advance to next ring entry, exiting if we've reached
|
||||
* the start of the ring or the ring has become empty
|
||||
*/
|
||||
} while (ring != NULL);
|
||||
/* Finally, if we saved any fetches which were locked, put them back
|
||||
* into the ring for next time
|
||||
*/
|
||||
ring = save_ring;
|
||||
}
|
||||
|
||||
nserror fetch_file_register(void)
|
||||
|
|
|
@ -406,7 +406,6 @@ static void fetch_resource_free(void *ctx)
|
|||
struct fetch_resource_context *c = ctx;
|
||||
if (c->url != NULL)
|
||||
nsurl_unref(c->url);
|
||||
RING_REMOVE(ring, c);
|
||||
free(ctx);
|
||||
}
|
||||
|
||||
|
@ -432,14 +431,13 @@ static void fetch_resource_abort(void *ctx)
|
|||
/** callback to poll for additional resource fetch contents */
|
||||
static void fetch_resource_poll(lwc_string *scheme)
|
||||
{
|
||||
struct fetch_resource_context *c, *next;
|
||||
bool was_last_item = false;
|
||||
struct fetch_resource_context *c, *save_ring = NULL;
|
||||
|
||||
if (ring == NULL) return;
|
||||
while (ring != NULL) {
|
||||
/* Take the first entry from the ring */
|
||||
c = ring;
|
||||
RING_REMOVE(ring, c);
|
||||
|
||||
/* Iterate over ring, processing each pending fetch */
|
||||
c = ring;
|
||||
do {
|
||||
/* Ignore fetches that have been flagged as locked.
|
||||
* This allows safe re-entrant calls to this function.
|
||||
* Re-entrancy can occur if, as a result of a callback,
|
||||
|
@ -447,7 +445,7 @@ static void fetch_resource_poll(lwc_string *scheme)
|
|||
* again.
|
||||
*/
|
||||
if (c->locked == true) {
|
||||
next = c->r_next;
|
||||
RING_INSERT(save_ring, c);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -457,32 +455,15 @@ static void fetch_resource_poll(lwc_string *scheme)
|
|||
c->handler(c);
|
||||
}
|
||||
|
||||
/* Compute next fetch item at the last possible moment
|
||||
* as processing this item may have added to the ring
|
||||
*/
|
||||
next = c->r_next;
|
||||
was_last_item = next == c;
|
||||
|
||||
/* And now finish */
|
||||
fetch_remove_from_queues(c->fetchh);
|
||||
fetch_free(c->fetchh);
|
||||
}
|
||||
|
||||
/* Having called into the fetch machinery, our ring might
|
||||
* have been updated
|
||||
*/
|
||||
if (was_last_item) {
|
||||
/* We were previously the last item in the ring
|
||||
* so let's reset to the head of the ring
|
||||
* and try again
|
||||
*/
|
||||
c = ring;
|
||||
} else {
|
||||
c = next;
|
||||
}
|
||||
|
||||
/* Advance to next ring entry, exiting if we've reached
|
||||
* the start of the ring or the ring has become empty
|
||||
*/
|
||||
} while (ring != NULL);
|
||||
/* Finally, if we saved any fetches which were locked, put them back
|
||||
* into the ring for next time
|
||||
*/
|
||||
ring = save_ring;
|
||||
}
|
||||
|
||||
nserror fetch_resource_register(void)
|
||||
|
|
Loading…
Reference in New Issue