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
#endif
DEBUG3("freeing request");
- talloc_free(request);
+ request_unused(&worker->request_list, request);
}
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);
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
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
goto fail2;
}
+ fr_dlist_init(&worker->request_list, REQUEST, entry);
+
return worker;
}