void serf_connection_request_prioritize()

in src/outgoing_request.c [706:789]


void serf_connection_request_prioritize(serf_request_t *request,
                                        serf_request_t *depends_on,
                                        apr_uint16_t priority,
                                        int exclusive)
{
    if (request->depends_on != depends_on) {
        serf_request_t *r;

        if (depends_on->conn != request->conn || depends_on == request)
            abort();

        /* If we are indirectly made dependent on ourself, we first
           reprioritize the descendant on our current parent. See
           https://tools.ietf.org/html/rfc7540#section-5.3.3

           If a stream is made dependent on one of its own dependencies, the
           formerly dependent stream is first moved to be dependent on the
           reprioritized stream's previous parent.  The moved dependency
           retains its weight. */

        r = depends_on;

        while (r && r != request && r->depends_on)
            r = r->depends_on;

        if (r == request)
        {
            serf_connection_request_prioritize(depends_on,
                                               request->depends_on,
                                               depends_on->dep_priority,
                                               false /* exclusive */);
        }

        if (request->depends_on) {
        /* Ok, we can now update our dependency */

            serf_request_t **pr = &request->depends_on->depends_first;

            while (*pr) {
                if (*pr == request) {
                    *pr = request->depends_next;
                    break;
                }
                pr = &(*pr)->depends_next;
            }
        }

        request->depends_on = depends_on;

        if (depends_on) {
            if (exclusive) {
                r = depends_on->depends_first;

                while (r) {
                    r->depends_on = request;

                    if (r->depends_next)
                        r = r->depends_next;
                    else
                        break;
                }

                if (r) {
                    r->depends_next = request->depends_first;
                    r->depends_first = depends_on->depends_first;
                }
                request->depends_next = NULL;
            }
            else {
                request->depends_next = depends_on->depends_first;
            }
            depends_on->depends_first = request;
        }
        else
            request->depends_next = NULL;
    }

    if (priority)
        request->dep_priority = priority;

    /* And now tell the protocol about this */
    if (request->conn->perform_prioritize_request)
        request->conn->perform_prioritize_request(request, exclusive != 0);
}