MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / WaitMany

Method WaitMany

src/util/sock.cpp:163–247  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

161}
162
163bool Sock::WaitMany(std::chrono::milliseconds timeout, EventsPerSock& events_per_sock) const
164{
165#ifdef USE_POLL
166 std::vector<pollfd> pfds;
167 for (const auto& [sock, events] : events_per_sock) {
168 pfds.emplace_back();
169 auto& pfd = pfds.back();
170 pfd.fd = sock->m_socket;
171 if (events.requested & RecvEvent) {
172 pfd.events |= POLLIN;
173 }
174 if (events.requested & SendEvent) {
175 pfd.events |= POLLOUT;
176 }
177 }
178
179 if (poll(pfds.data(), pfds.size(), count_milliseconds(timeout)) == SOCKET_ERROR) {
180 return false;
181 }
182
183 assert(pfds.size() == events_per_sock.size());
184 size_t i{0};
185 for (auto& [sock, events] : events_per_sock) {
186 assert(sock->m_socket == static_cast<SOCKET>(pfds[i].fd));
187 events.occurred = 0;
188 if (pfds[i].revents & POLLIN) {
189 events.occurred |= RecvEvent;
190 }
191 if (pfds[i].revents & POLLOUT) {
192 events.occurred |= SendEvent;
193 }
194 if (pfds[i].revents & (POLLERR | POLLHUP)) {
195 events.occurred |= ErrorEvent;
196 }
197 ++i;
198 }
199
200 return true;
201#else
202 fd_set recv;
203 fd_set send;
204 fd_set err;
205 FD_ZERO(&recv);
206 FD_ZERO(&send);
207 FD_ZERO(&err);
208 SOCKET socket_max{0};
209
210 for (const auto& [sock, events] : events_per_sock) {
211 if (!sock->IsSelectable()) {
212 return false;
213 }
214 const auto& s = sock->m_socket;
215 if (events.requested & RecvEvent) {
216 FD_SET(s, &recv);
217 }
218 if (events.requested & SendEvent) {
219 FD_SET(s, &send);
220 }

Callers 2

ThreadSocketHandlerMethod · 0.45
SocketHandlerMethod · 0.45

Calls 7

count_millisecondsFunction · 0.85
MillisToTimevalFunction · 0.85
emplace_backMethod · 0.45
backMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45
IsSelectableMethod · 0.45

Tested by

no test coverage detected