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