int nghttp2_stream_dep_all_your_stream_are_belong_to_us(nghttp2_stream *stream, nghttp2_session *session) { nghttp2_stream *first, *si; DEBUGF(fprintf(stderr, "stream: ALL YOUR STREAM ARE BELONG TO US " "stream(%p)=%d\n", stream, stream->stream_id)); first = stream->roots->head; /* stream must not be include in stream->roots->head list */ assert(first != stream); if (first) { nghttp2_stream *prev; prev = first; DEBUGF(fprintf(stderr, "stream: root stream(%p)=%d\n", first, first->stream_id)); stream->sum_dep_weight += first->weight; stream->num_substreams += first->num_substreams; for (si = first->root_next; si; si = si->root_next) { assert(si != stream); DEBUGF( fprintf(stderr, "stream: root stream(%p)=%d\n", si, si->stream_id)); stream->sum_dep_weight += si->weight; stream->num_substreams += si->num_substreams; link_sib(prev, si); prev = si; } if (stream->dep_next) { nghttp2_stream *sib_next; sib_next = stream->dep_next; sib_next->dep_prev = NULL; link_sib(first, sib_next); link_dep(stream, prev); } else { link_dep(stream, first); } } nghttp2_stream_roots_remove_all(stream->roots); return nghttp2_stream_dep_make_root(stream, session); }
int nghttp2_stream_dep_insert_subtree(nghttp2_stream *dep_stream, nghttp2_stream *stream, nghttp2_session *session) { nghttp2_stream *last_sib; nghttp2_stream *dep_next; nghttp2_stream *root_stream; size_t delta_substreams; DEBUGF(fprintf(stderr, "stream: dep_insert_subtree dep_stream(%p)=%d " "stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); delta_substreams = stream->num_substreams; stream_update_dep_set_rest(stream); if (dep_stream->dep_next) { /* dep_stream->num_substreams includes dep_stream itself */ stream->num_substreams += dep_stream->num_substreams - 1; stream->sum_dep_weight += dep_stream->sum_dep_weight; dep_stream->sum_dep_weight = stream->weight; dep_next = dep_stream->dep_next; stream_update_dep_set_rest(dep_next); link_dep(dep_stream, stream); if (stream->dep_next) { last_sib = stream_last_sib(stream->dep_next); link_sib(last_sib, dep_next); dep_next->dep_prev = NULL; } else { link_dep(stream, dep_next); } } else { link_dep(dep_stream, stream); assert(dep_stream->sum_dep_weight == 0); dep_stream->sum_dep_weight = stream->weight; } root_stream = stream_update_dep_length(dep_stream, delta_substreams); stream_update_dep_set_top(root_stream); stream_update_dep_sum_norest_weight(root_stream); stream_update_dep_effective_weight(root_stream); return stream_update_dep_queue_top(root_stream, session); }
int nghttp2_stream_dep_insert_subtree(nghttp2_stream *dep_stream, nghttp2_stream *stream) { nghttp2_stream *last_sib; nghttp2_stream *dep_next; nghttp2_stream *si; int rv; DEBUGF(fprintf(stderr, "stream: dep_insert_subtree dep_stream(%p)=%d " "stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); stream->sum_dep_weight += dep_stream->sum_dep_weight; dep_stream->sum_dep_weight = stream->weight; if (dep_stream->dep_next) { dep_next = dep_stream->dep_next; link_dep(dep_stream, stream); if (stream->dep_next) { last_sib = stream_last_sib(stream->dep_next); link_sib(last_sib, dep_next); } else { link_dep(stream, dep_next); } for (si = dep_next; si; si = si->sib_next) { si->dep_prev = stream; if (si->queued) { rv = stream_obq_move(stream, dep_stream, si); if (rv != 0) { return rv; } } } } else { link_dep(dep_stream, stream); } if (stream_subtree_active(stream)) { rv = stream_obq_push(dep_stream, stream); if (rv != 0) { return rv; } } validate_tree(dep_stream); return 0; }
int nghttp2_stream_dep_add_subtree(nghttp2_stream *dep_stream, nghttp2_stream *stream, nghttp2_session *session) { nghttp2_stream *root_stream; DEBUGF(fprintf(stderr, "stream: dep_add_subtree dep_stream(%p)=%d " "stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); stream_update_dep_set_rest(stream); if (dep_stream->dep_next) { dep_stream->sum_dep_weight += stream->weight; insert_link_dep(dep_stream, stream); } else { link_dep(dep_stream, stream); assert(dep_stream->sum_dep_weight == 0); dep_stream->sum_dep_weight = stream->weight; } root_stream = stream_update_dep_length(dep_stream, stream->num_substreams); stream_update_dep_set_top(root_stream); stream_update_dep_sum_norest_weight(root_stream); stream_update_dep_effective_weight(root_stream); return stream_update_dep_queue_top(root_stream, session); }
void nghttp2_stream_dep_remove_subtree(nghttp2_stream *stream) { nghttp2_stream *next, *dep_prev; DEBUGF(fprintf(stderr, "stream: dep_remove_subtree stream(%p)=%d\n", stream, stream->stream_id)); assert(stream->dep_prev); dep_prev = stream->dep_prev; if (stream->sib_prev) { link_sib(stream->sib_prev, stream->sib_next); } else { next = stream->sib_next; link_dep(dep_prev, next); if (next) { next->sib_prev = NULL; } } dep_prev->sum_dep_weight -= stream->weight; if (stream->queued) { stream_obq_remove(stream); } validate_tree(dep_prev); stream->sib_prev = NULL; stream->sib_next = NULL; stream->dep_prev = NULL; }
int nghttp2_stream_dep_add_subtree(nghttp2_stream *dep_stream, nghttp2_stream *stream) { int rv; DEBUGF(fprintf(stderr, "stream: dep_add_subtree dep_stream(%p)=%d " "stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); dep_stream->sum_dep_weight += stream->weight; if (dep_stream->dep_next) { insert_link_dep(dep_stream, stream); } else { link_dep(dep_stream, stream); } if (stream_subtree_active(stream)) { rv = stream_obq_push(dep_stream, stream); if (rv != 0) { return rv; } } validate_tree(dep_stream); return 0; }
static void insert_link_dep(nghttp2_stream *dep_stream, nghttp2_stream *stream) { nghttp2_stream *sib_next; assert(stream->sib_prev == NULL); sib_next = dep_stream->dep_next; link_sib(stream, sib_next); link_dep(dep_stream, stream); }
static void unlink_dep(nghttp2_stream *stream) { nghttp2_stream *prev, *next, *dep_next; prev = stream->dep_prev; dep_next = stream->dep_next; assert(prev); if (dep_next) { /* * prev * | * stream(--sib_next--...) * | * dep_next */ link_dep(prev, dep_next); set_dep_prev(dep_next, stream->dep_prev); if (stream->sib_next) { link_sib(stream_last_sib(dep_next), stream->sib_next); } } else if (stream->sib_next) { /* * prev * | * stream--sib_next */ next = stream->sib_next; next->sib_prev = NULL; link_dep(prev, next); } else { prev->dep_next = NULL; } }
void nghttp2_stream_dep_add(nghttp2_stream *dep_stream, nghttp2_stream *stream) { DEBUGF(fprintf(stderr, "stream: dep_add dep_stream(%p)=%d, stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); dep_stream->sum_dep_weight += stream->weight; if (dep_stream->dep_next == NULL) { link_dep(dep_stream, stream); } else { insert_link_dep(dep_stream, stream); } validate_tree(stream); }
void nghttp2_stream_dep_add(nghttp2_stream *dep_stream, nghttp2_stream *stream) { nghttp2_stream *root_stream; assert(stream->data_item == NULL); DEBUGF(fprintf(stderr, "stream: dep_add dep_stream(%p)=%d, stream(%p)=%d\n", dep_stream, dep_stream->stream_id, stream, stream->stream_id)); root_stream = stream_update_dep_length(dep_stream, 1); dep_stream->sum_dep_weight += stream->weight; if (dep_stream->dep_next == NULL) { link_dep(dep_stream, stream); } else { insert_link_dep(dep_stream, stream); } stream_update_dep_sum_norest_weight(root_stream); stream_update_dep_effective_weight(root_stream); ++stream->roots->num_streams; }