X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-resolve%2Fsd-resolve.c;h=fea695fcf945e0d9f5a495d7f9104cb124465c73;hb=4c213d6cf416917c61f82d8bee795b8f3a4c5372;hp=10f8ed29a2041785b50b094baef4b7be0629ce01;hpb=f2e2415d694a21f43f79038cdc644c3dc029d651;p=elogind.git diff --git a/src/libsystemd/sd-resolve/sd-resolve.c b/src/libsystemd/sd-resolve/sd-resolve.c index 10f8ed29a..fea695fcf 100644 --- a/src/libsystemd/sd-resolve/sd-resolve.c +++ b/src/libsystemd/sd-resolve/sd-resolve.c @@ -85,9 +85,9 @@ struct sd_resolve { pthread_t workers[WORKERS_MAX]; unsigned n_valid_workers; - unsigned current_id, current_index; + unsigned current_id; sd_resolve_query* query_array[QUERIES_MAX]; - unsigned n_queries, n_done; + unsigned n_queries, n_done, n_outstanding; sd_event_source *event_source; sd_event *event; @@ -526,7 +526,7 @@ static int start_threads(sd_resolve *resolve, unsigned extra) { unsigned n; int r; - n = resolve->n_queries + extra - resolve->n_done; + n = resolve->n_outstanding + extra; n = CLAMP(n, WORKERS_MIN, WORKERS_MAX); while (resolve->n_valid_workers < n) { @@ -772,13 +772,15 @@ static int complete_query(sd_resolve *resolve, sd_resolve_query *q) { assert_not_reached("Cannot complete unknown query type"); } - resolve->current = sd_resolve_query_unref(q); + resolve->current = NULL; if (q->floating) { resolve_query_disconnect(q); sd_resolve_query_unref(q); } + sd_resolve_query_unref(q); + return r; } @@ -852,6 +854,9 @@ static int handle_response(sd_resolve *resolve, const Packet *packet, size_t len return 0; } + assert(resolve->n_outstanding > 0); + resolve->n_outstanding--; + q = lookup_query(resolve, resp->id); if (!q) return 0; @@ -1022,21 +1027,17 @@ static int alloc_query(sd_resolve *resolve, bool floating, sd_resolve_query **_q if (r < 0) return r; - while (resolve->query_array[resolve->current_index]) { - resolve->current_index++; + while (resolve->query_array[resolve->current_id % QUERIES_MAX]) resolve->current_id++; - resolve->current_index %= QUERIES_MAX; - } - - q = resolve->query_array[resolve->current_index] = new0(sd_resolve_query, 1); + q = resolve->query_array[resolve->current_id % QUERIES_MAX] = new0(sd_resolve_query, 1); if (!q) return -ENOMEM; q->n_ref = 1; q->resolve = resolve; q->floating = floating; - q->id = resolve->current_id; + q->id = resolve->current_id++; if (!floating) sd_resolve_ref(resolve); @@ -1101,6 +1102,8 @@ _public_ int sd_resolve_getaddrinfo( return -errno; } + resolve->n_outstanding++; + if (_q) *_q = q; @@ -1169,6 +1172,8 @@ _public_ int sd_resolve_getnameinfo( return -errno; } + resolve->n_outstanding++; + if (_q) *_q = q; @@ -1233,6 +1238,8 @@ static int resolve_res( return -errno; } + resolve->n_outstanding++; + if (_q) *_q = q;