diff options
Diffstat (limited to 'src/dist.cpp')
-rw-r--r-- | src/dist.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/dist.cpp b/src/dist.cpp index 26a0c81..4e94276 100644 --- a/src/dist.cpp +++ b/src/dist.cpp @@ -80,13 +80,33 @@ void xs::dist_t::terminated (pipe_t *pipe_) { // Remove the pipe from the list; adjust number of matching, active and/or // eligible pipes accordingly. - if (pipes.index (pipe_) < matching) - matching--; - if (pipes.index (pipe_) < active) - active--; - if (pipes.index (pipe_) < eligible) - eligible--; - pipes.erase (pipe_); + + int i = pipes.index (pipe_); + if (i < (int) matching) { + pipes [i] = pipes [matching - 1]; + pipes [matching - 1] = NULL; + if (pipes [i]) + ((pipes_t::item_t*) pipes [i])->set_array_index (i); + --matching; + i = matching; + } + if (i < (int) active) { + pipes [i] = pipes [active - 1]; + pipes [active - 1] = NULL; + if (pipes [i]) + ((pipes_t::item_t*) pipes [i])->set_array_index (i); + --active; + i = active; + } + if (i < (int) eligible) { + pipes [i] = pipes [eligible - 1]; + pipes [eligible - 1] = NULL; + if (pipes [i]) + ((pipes_t::item_t*) pipes [i])->set_array_index (i); + --eligible; + i = eligible; + } + pipes.erase (i); } void xs::dist_t::activated (pipe_t *pipe_) |