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:
Daniel Silverstone 2020-02-24 14:24:48 +00:00
parent a47270c93e
commit bb5d72410b
No known key found for this signature in database
GPG Key ID: C30DF439F2987D74
4 changed files with 50 additions and 123 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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)

View File

@ -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)