From: Alan T. DeKok Date: Mon, 9 Dec 2019 23:24:34 +0000 (-0500) Subject: alloc / free requests into worker-specific list X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd4dcaeccfe4334e0d45f08549b070ae98dad314;p=thirdparty%2Ffreeradius-server.git alloc / free requests into worker-specific list --- diff --git a/src/lib/io/worker.c b/src/lib/io/worker.c index 0896fbfb3d4..a51b30e5f59 100644 --- a/src/lib/io/worker.c +++ b/src/lib/io/worker.c @@ -115,6 +115,8 @@ struct fr_worker_t { size_t talloc_pool_size; //!< for each REQUEST + fr_dlist_head_t request_list; //!< for re-use of free requests + fr_worker_heap_t to_decode; //!< messages from the master, to be decoded or localized fr_worker_heap_t localized; //!< localized messages to be decoded @@ -531,7 +533,7 @@ finished: #endif DEBUG3("freeing request"); - talloc_free(request); + request_unused(&worker->request_list, request); } @@ -755,14 +757,14 @@ static REQUEST *fr_worker_get_request(fr_worker_t *worker, fr_time_t now) worker->num_decoded++; } while (!cd); - ctx = request = request_alloc(NULL); + ctx = request = request_alloc_used(&worker->request_list, NULL); if (!request) goto nak; request->el = worker->el; request->backlog = worker->runnable; - MEM(request->packet = fr_radius_alloc(request, false)); + if (!request->packet) MEM(request->packet = fr_radius_alloc(request, false)); request->packet->timestamp = *cd->request.recv_time; /* Legacy - Remove once everything looks at request->async */ - request->reply = fr_radius_alloc(request, false); + if (!request->reply) request->reply = fr_radius_alloc(request, false); rad_assert(request->reply != NULL); request->async = talloc_zero(request, fr_async_t); @@ -876,7 +878,7 @@ nak: RWARN("Discarding duplicate of request (%"PRIu64")", old->number); fr_channel_null_reply(request->async->channel); - talloc_free(request); + request_unused(&worker->request_list, request); /* * Signal there's a dup, and ignore the @@ -1187,6 +1189,12 @@ void fr_worker_destroy(fr_worker_t *worker) worker_stop_request(worker, request, now); talloc_free(request); } + + while ((request = fr_dlist_head(&worker->request_list)) != NULL) { + fr_dlist_remove(&worker->request_list, request); + talloc_free(request); + } + rad_assert(fr_heap_num_elements(worker->runnable) == 0); #if 0 @@ -1319,6 +1327,8 @@ nomem: goto fail2; } + fr_dlist_init(&worker->request_list, REQUEST, entry); + return worker; }