| 521 | }; |
| 522 | |
| 523 | void ParallelChannel::Reset() { |
| 524 | // Removal of channels are a little complex because a channel may be |
| 525 | // added multiple times. |
| 526 | |
| 527 | // Dereference call_mapper and mergers first. |
| 528 | for (size_t i = 0; i < _chans.size(); ++i) { |
| 529 | _chans[i].call_mapper.reset(); |
| 530 | _chans[i].merger.reset(); |
| 531 | } |
| 532 | |
| 533 | // Remove not own-ed channels. |
| 534 | for (size_t i = 0; i < _chans.size();) { |
| 535 | if (_chans[i].ownership != OWNS_CHANNEL) { |
| 536 | _chans[i] = _chans.back(); |
| 537 | _chans.pop_back(); |
| 538 | } else { |
| 539 | ++i; |
| 540 | } |
| 541 | } |
| 542 | |
| 543 | if (_chans.empty()) { |
| 544 | return; |
| 545 | } |
| 546 | |
| 547 | // Sort own-ed channels so that we can deduplicate them more efficiently. |
| 548 | std::sort(_chans.begin(), _chans.end(), SortByChannelPtr()); |
| 549 | const size_t uniq_size = |
| 550 | std::unique(_chans.begin(), _chans.end(), EqualChannelPtr()) |
| 551 | - _chans.begin(); |
| 552 | for (size_t i = 0; i < uniq_size; ++i) { |
| 553 | CHECK_EQ(_chans[i].ownership, OWNS_CHANNEL); |
| 554 | delete _chans[i].chan; |
| 555 | } |
| 556 | _chans.clear(); |
| 557 | } |
| 558 | |
| 559 | ParallelChannel::~ParallelChannel() { |
| 560 | Reset(); |
nothing calls this directly
no test coverage detected