]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
alloc / free requests into worker-specific list
authorAlan T. DeKok <aland@freeradius.org>
Mon, 9 Dec 2019 23:24:34 +0000 (18:24 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 9 Dec 2019 23:24:34 +0000 (18:24 -0500)
src/lib/io/worker.c

index 0896fbfb3d4ebc27842760af7c52bbfb54130da6..a51b30e5f59ac2be094d2726fde05cf7451c9504 100644 (file)
@@ -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;
 }