apr_status_t serf__destroy_request()

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;
}