in src/outgoing_request.c [107:204]
apr_status_t serf__destroy_request(serf_request_t *request)
{
serf_connection_t *conn = request->conn;
if (request->depends_first && request->depends_on) {
apr_uint64_t total = 0;
serf_request_t *r, **pr;
apr_uint64_t rqd = request->dep_priority;
/* Calculate total priority of descendants */
for (r = request->depends_first; r; r = r->depends_next) {
total += r->dep_priority;
}
/* Apply now, as if they depend on the parent */
for (r = request->depends_first; r; r = r->depends_next) {
if (total) {
r->dep_priority = (apr_uint16_t)(rqd * r->dep_priority
/ total);
}
else
r->dep_priority = 0;
r->depends_on = request->depends_on;
}
/* Remove us from parent */
pr = &request->depends_on->depends_first;
while (*pr) {
if (*pr == request) {
*pr = request->depends_next;
break;
}
pr = &(*pr)->depends_next;
}
/* And append all our descendants */
*pr = request->depends_first;
request->depends_on = NULL;
request->depends_first = NULL;
request->depends_next = NULL;
}
else if (request->depends_first) {
/* Dependencies will lose their parent */
serf_request_t *r, *next;
for (r = request->depends_first; r; r = next) {
next = r->next;
r->depends_on = NULL;
r->depends_next = NULL;
}
request->depends_first = NULL;
}
else if (request->depends_on) {
serf_request_t **pr;
/* Remove us from parent */
pr = &request->depends_on->depends_first;
while (*pr) {
if (*pr == request) {
*pr = request->depends_next;
break;
}
pr = &(*pr)->depends_next;
}
request->depends_on = NULL;
}
if (request->writing >= SERF_WRITING_STARTED
&& request->writing < SERF_WRITING_FINISHED) {
/* Schedule for destroy when it is safe again.
Destroying now will destroy memory of buckets that we
may still need.
*/
serf__link_requests(&conn->done_reqs, &conn->done_reqs_tail,
request);
}
else {
if (request->respool) {
apr_pool_t *pool = request->respool;
apr_pool_cleanup_run(pool, request, clean_resp);
apr_pool_destroy(pool);
}
serf_bucket_mem_free(conn->allocator, request);
}
return APR_SUCCESS;
}