chiark / gitweb /
sd-resolve: scale number of threads by queries currently being processed, rather...
authorLennart Poettering <lennart@poettering.net>
Tue, 12 Aug 2014 17:29:38 +0000 (19:29 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 12 Aug 2014 17:30:18 +0000 (19:30 +0200)
This way a query that blocks for a longer time, and whose reference has
been dropped won't block subsequent lookups from finishing.

src/libsystemd/sd-resolve/sd-resolve.c

index 15f19386393ef212c304394c010439f48880befc..fea695fcf945e0d9f5a495d7f9104cb124465c73 100644 (file)
@@ -87,7 +87,7 @@ struct sd_resolve {
 
         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) {
@@ -854,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;
@@ -1099,6 +1102,8 @@ _public_ int sd_resolve_getaddrinfo(
                 return -errno;
         }
 
+        resolve->n_outstanding++;
+
         if (_q)
                 *_q = q;
 
@@ -1167,6 +1172,8 @@ _public_ int sd_resolve_getnameinfo(
                 return -errno;
         }
 
+        resolve->n_outstanding++;
+
         if (_q)
                 *_q = q;
 
@@ -1231,6 +1238,8 @@ static int resolve_res(
                 return -errno;
         }
 
+        resolve->n_outstanding++;
+
         if (_q)
                 *_q = q;