Refactor stream tree code
This commit is contained in:
parent
502ff24568
commit
bc8a583184
|
@ -629,6 +629,80 @@ static void insert_link_dep(nghttp2_stream *dep_stream,
|
||||||
link_dep(dep_stream, stream);
|
link_dep(dep_stream, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void unlink_sib(nghttp2_stream *stream)
|
||||||
|
{
|
||||||
|
nghttp2_stream *prev, *next, *dep_next;
|
||||||
|
|
||||||
|
prev = stream->sib_prev;
|
||||||
|
dep_next = stream->dep_next;
|
||||||
|
|
||||||
|
assert(prev);
|
||||||
|
|
||||||
|
if(dep_next) {
|
||||||
|
/*
|
||||||
|
* prev--stream(--sib_next--...)
|
||||||
|
* |
|
||||||
|
* dep_next
|
||||||
|
*/
|
||||||
|
dep_next->dep_prev = NULL;
|
||||||
|
|
||||||
|
link_sib(prev, dep_next);
|
||||||
|
|
||||||
|
if(stream->sib_next) {
|
||||||
|
link_sib(stream_last_sib(dep_next), stream->sib_next);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* prev--stream(--sib_next--...)
|
||||||
|
*/
|
||||||
|
next = stream->sib_next;
|
||||||
|
|
||||||
|
prev->sib_next = next;
|
||||||
|
|
||||||
|
if(next) {
|
||||||
|
next->sib_prev = prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
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,
|
void nghttp2_stream_dep_add(nghttp2_stream *dep_stream,
|
||||||
nghttp2_stream *stream)
|
nghttp2_stream *stream)
|
||||||
{
|
{
|
||||||
|
@ -646,8 +720,7 @@ void nghttp2_stream_dep_add(nghttp2_stream *dep_stream,
|
||||||
dep_stream->sum_dep_weight += stream->weight;
|
dep_stream->sum_dep_weight += stream->weight;
|
||||||
|
|
||||||
if(dep_stream->dep_next == NULL) {
|
if(dep_stream->dep_next == NULL) {
|
||||||
dep_stream->dep_next = stream;
|
link_dep(dep_stream, stream);
|
||||||
stream->dep_prev = dep_stream;
|
|
||||||
} else {
|
} else {
|
||||||
insert_link_dep(dep_stream, stream);
|
insert_link_dep(dep_stream, stream);
|
||||||
}
|
}
|
||||||
|
@ -660,7 +733,7 @@ void nghttp2_stream_dep_add(nghttp2_stream *dep_stream,
|
||||||
|
|
||||||
void nghttp2_stream_dep_remove(nghttp2_stream *stream)
|
void nghttp2_stream_dep_remove(nghttp2_stream *stream)
|
||||||
{
|
{
|
||||||
nghttp2_stream *prev, *next, *dep_next, *dep_prev, *si, *root_stream;
|
nghttp2_stream *prev, *next, *dep_prev, *si, *root_stream;
|
||||||
int32_t sum_dep_weight_delta;
|
int32_t sum_dep_weight_delta;
|
||||||
|
|
||||||
root_stream = NULL;
|
root_stream = NULL;
|
||||||
|
@ -688,46 +761,12 @@ void nghttp2_stream_dep_remove(nghttp2_stream *stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(stream->sib_prev) {
|
if(stream->sib_prev) {
|
||||||
prev = stream->sib_prev;
|
unlink_sib(stream);
|
||||||
dep_next = stream->dep_next;
|
|
||||||
|
|
||||||
if(dep_next) {
|
|
||||||
dep_next->dep_prev = NULL;
|
|
||||||
|
|
||||||
prev->sib_next = dep_next;
|
|
||||||
dep_next->sib_prev = prev;
|
|
||||||
} else {
|
|
||||||
next = stream->sib_next;
|
|
||||||
|
|
||||||
prev->sib_next = next;
|
|
||||||
|
|
||||||
if(next) {
|
|
||||||
next->sib_prev = prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(stream->dep_prev) {
|
} else if(stream->dep_prev) {
|
||||||
prev = stream->dep_prev;
|
unlink_dep(stream);
|
||||||
dep_next = stream->dep_next;
|
|
||||||
|
|
||||||
if(dep_next) {
|
|
||||||
prev->dep_next = dep_next;
|
|
||||||
dep_next->dep_prev = prev;
|
|
||||||
} else if(stream->sib_next) {
|
|
||||||
next = stream->sib_next;
|
|
||||||
|
|
||||||
prev->dep_next = next;
|
|
||||||
next->dep_prev = prev;
|
|
||||||
|
|
||||||
next->sib_prev = NULL;
|
|
||||||
} else {
|
|
||||||
prev->dep_next = NULL;
|
|
||||||
dep_next = NULL;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
nghttp2_stream_roots_remove(stream->roots, stream);
|
nghttp2_stream_roots_remove(stream->roots, stream);
|
||||||
|
|
||||||
dep_next = NULL;
|
|
||||||
|
|
||||||
/* stream is a root of tree. Removing stream makes its
|
/* stream is a root of tree. Removing stream makes its
|
||||||
descendants a root of its own subtree. */
|
descendants a root of its own subtree. */
|
||||||
|
|
||||||
|
@ -747,14 +786,6 @@ void nghttp2_stream_dep_remove(nghttp2_stream *stream)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dep_next && stream->sib_next) {
|
|
||||||
prev = stream_last_sib(dep_next);
|
|
||||||
next = stream->sib_next;
|
|
||||||
|
|
||||||
prev->sib_next = next;
|
|
||||||
next->sib_prev = prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(root_stream) {
|
if(root_stream) {
|
||||||
stream_update_dep_sum_norest_weight(root_stream);
|
stream_update_dep_sum_norest_weight(root_stream);
|
||||||
stream_update_dep_effective_weight(root_stream);
|
stream_update_dep_effective_weight(root_stream);
|
||||||
|
@ -801,23 +832,19 @@ int nghttp2_stream_dep_insert_subtree(nghttp2_stream *dep_stream,
|
||||||
|
|
||||||
stream_update_dep_set_rest(dep_next);
|
stream_update_dep_set_rest(dep_next);
|
||||||
|
|
||||||
dep_stream->dep_next = stream;
|
link_dep(dep_stream, stream);
|
||||||
stream->dep_prev = dep_stream;
|
|
||||||
|
|
||||||
if(stream->dep_next) {
|
if(stream->dep_next) {
|
||||||
last_sib = stream_last_sib(stream->dep_next);
|
last_sib = stream_last_sib(stream->dep_next);
|
||||||
|
|
||||||
last_sib->sib_next = dep_next;
|
link_sib(last_sib, dep_next);
|
||||||
dep_next->sib_prev = last_sib;
|
|
||||||
|
|
||||||
dep_next->dep_prev = NULL;
|
dep_next->dep_prev = NULL;
|
||||||
} else {
|
} else {
|
||||||
stream->dep_next = dep_next;
|
link_dep(stream, dep_next);
|
||||||
dep_next->dep_prev = stream;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dep_stream->dep_next = stream;
|
link_dep(dep_stream, stream);
|
||||||
stream->dep_prev = dep_stream;
|
|
||||||
|
|
||||||
assert(dep_stream->sum_dep_weight == 0);
|
assert(dep_stream->sum_dep_weight == 0);
|
||||||
dep_stream->sum_dep_weight = stream->weight;
|
dep_stream->sum_dep_weight = stream->weight;
|
||||||
|
@ -852,8 +879,7 @@ int nghttp2_stream_dep_add_subtree(nghttp2_stream *dep_stream,
|
||||||
|
|
||||||
insert_link_dep(dep_stream, stream);
|
insert_link_dep(dep_stream, stream);
|
||||||
} else {
|
} else {
|
||||||
dep_stream->dep_next = stream;
|
link_dep(dep_stream, stream);
|
||||||
stream->dep_prev = dep_stream;
|
|
||||||
|
|
||||||
assert(dep_stream->sum_dep_weight == 0);
|
assert(dep_stream->sum_dep_weight == 0);
|
||||||
dep_stream->sum_dep_weight = stream->weight;
|
dep_stream->sum_dep_weight = stream->weight;
|
||||||
|
@ -975,8 +1001,7 @@ int nghttp2_stream_dep_all_your_stream_are_belong_to_us
|
||||||
stream->sum_dep_weight += si->weight;
|
stream->sum_dep_weight += si->weight;
|
||||||
stream->num_substreams += si->num_substreams;
|
stream->num_substreams += si->num_substreams;
|
||||||
|
|
||||||
si->sib_prev = prev;
|
link_sib(prev, si);
|
||||||
prev->sib_next = si;
|
|
||||||
|
|
||||||
prev = si;
|
prev = si;
|
||||||
}
|
}
|
||||||
|
@ -991,8 +1016,7 @@ int nghttp2_stream_dep_all_your_stream_are_belong_to_us
|
||||||
link_sib(first, sib_next);
|
link_sib(first, sib_next);
|
||||||
link_dep(stream, prev);
|
link_dep(stream, prev);
|
||||||
} else {
|
} else {
|
||||||
stream->dep_next = first;
|
link_dep(stream, first);
|
||||||
first->dep_prev = stream;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue