| 2671 | } |
| 2672 | |
| 2673 | inline void SocketPool::ListSockets(std::vector<SocketId>* out, size_t max_count) { |
| 2674 | out->clear(); |
| 2675 | // NOTE: size() of vector is thread-unsafe and may return a very |
| 2676 | // large value during resizing. |
| 2677 | _mutex.lock(); |
| 2678 | size_t expected_size = _pool.size(); |
| 2679 | if (max_count > 0 && max_count < _pool.size()) { |
| 2680 | expected_size = max_count; |
| 2681 | } |
| 2682 | if (out->capacity() < expected_size) { |
| 2683 | _mutex.unlock(); |
| 2684 | out->reserve(expected_size + 4); // pool may add sockets. |
| 2685 | _mutex.lock(); |
| 2686 | } |
| 2687 | if (max_count == 0) { |
| 2688 | out->insert(out->end(), _pool.begin(), _pool.end()); |
| 2689 | } else { |
| 2690 | for (size_t i = 0; i < expected_size; ++i) { |
| 2691 | out->push_back(_pool[i]); |
| 2692 | } |
| 2693 | } |
| 2694 | _mutex.unlock(); |
| 2695 | } |
| 2696 | |
| 2697 | Socket::SharedPart* Socket::GetOrNewSharedPartSlower() { |
| 2698 | // Create _shared_part optimistically. |