@@ -157,7 +157,7 @@ bool Sock::Wait(std::chrono::milliseconds timeout, Event requested, SocketEvents
157157{
158158 EventsPerSock events_per_sock{std::make_pair (m_socket, Events{requested})};
159159
160- if (auto [sem, _] = event_params; sem != SocketEventsMode::Poll && sem != SocketEventsMode::Select) {
160+ if (auto [sem, _, __ ] = event_params; sem != SocketEventsMode::Poll && sem != SocketEventsMode::Select) {
161161 // We need to ensure we are only using a level-triggered mode because we are expecting
162162 // a direct correlation between the events reported and the one socket we are querying
163163 event_params = SocketEventsParams ();
@@ -186,25 +186,25 @@ bool Sock::WaitManyInternal(std::chrono::milliseconds timeout, EventsPerSock& ev
186186 {
187187 case SocketEventsMode::Poll:
188188#ifdef USE_POLL
189- return WaitManyPoll (timeout, events_per_sock);
189+ return WaitManyPoll (timeout, events_per_sock, event_params. m_wrap_func );
190190#else
191191 debug_str += " Sock::Wait -- Support for poll not compiled in, falling back on " ;
192192 break ;
193193#endif /* USE_POLL */
194194 case SocketEventsMode::Select:
195- return WaitManySelect (timeout, events_per_sock);
195+ return WaitManySelect (timeout, events_per_sock, event_params. m_wrap_func );
196196 case SocketEventsMode::EPoll:
197197#ifdef USE_EPOLL
198198 assert (event_params.m_event_fd != INVALID_SOCKET);
199- return WaitManyEPoll (timeout, events_per_sock, event_params.m_event_fd );
199+ return WaitManyEPoll (timeout, events_per_sock, event_params.m_event_fd , event_params. m_wrap_func );
200200#else
201201 debug_str += " Sock::Wait -- Support for epoll not compiled in, falling back on " ;
202202 break ;
203203#endif /* USE_EPOLL */
204204 case SocketEventsMode::KQueue:
205205#ifdef USE_KQUEUE
206206 assert (event_params.m_event_fd != INVALID_SOCKET);
207- return WaitManyKQueue (timeout, events_per_sock, event_params.m_event_fd );
207+ return WaitManyKQueue (timeout, events_per_sock, event_params.m_event_fd , event_params. m_wrap_func );
208208#else
209209 debug_str += " Sock::Wait -- Support for kqueue not compiled in, falling back on " ;
210210 break ;
@@ -219,18 +219,24 @@ bool Sock::WaitManyInternal(std::chrono::milliseconds timeout, EventsPerSock& ev
219219#endif /* USE_POLL*/
220220 LogPrint (BCLog::NET, " %s\n " , debug_str);
221221#ifdef USE_POLL
222- return WaitManyPoll (timeout, events_per_sock);
222+ return WaitManyPoll (timeout, events_per_sock, event_params. m_wrap_func );
223223#else
224- return WaitManySelect (timeout, events_per_sock);
224+ return WaitManySelect (timeout, events_per_sock, event_params. m_wrap_func );
225225#endif /* USE_POLL */
226226}
227227
228228#ifdef USE_EPOLL
229- bool Sock::WaitManyEPoll (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock, SOCKET epoll_fd)
229+ bool Sock::WaitManyEPoll (std::chrono::milliseconds timeout,
230+ EventsPerSock& events_per_sock,
231+ SOCKET epoll_fd,
232+ SocketEventsParams::wrap_fn wrap_func)
230233{
231234 std::array<epoll_event, MAX_EVENTS> events{};
232235
233- int ret = epoll_wait (epoll_fd, events.data (), events.size (), count_milliseconds (timeout));
236+ int ret{SOCKET_ERROR};
237+ wrap_func ([&](){
238+ ret = epoll_wait (epoll_fd, events.data (), events.size (), count_milliseconds (timeout));
239+ });
234240 if (ret == SOCKET_ERROR) {
235241 return false ;
236242 }
@@ -260,12 +266,18 @@ bool Sock::WaitManyEPoll(std::chrono::milliseconds timeout, EventsPerSock& event
260266#endif /* USE_EPOLL */
261267
262268#ifdef USE_KQUEUE
263- bool Sock::WaitManyKQueue (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock, SOCKET kqueue_fd)
269+ bool Sock::WaitManyKQueue (std::chrono::milliseconds timeout,
270+ EventsPerSock& events_per_sock,
271+ SOCKET kqueue_fd,
272+ SocketEventsParams::wrap_fn wrap_func)
264273{
265274 std::array<struct kevent , MAX_EVENTS> events{};
266275 struct timespec ts = MillisToTimespec (timeout);
267276
268- int ret = kevent (kqueue_fd, nullptr , 0 , events.data (), events.size (), &ts);
277+ int ret{SOCKET_ERROR};
278+ wrap_func ([&](){
279+ ret = kevent (kqueue_fd, nullptr , 0 , events.data (), events.size (), &ts);
280+ });
269281 if (ret == SOCKET_ERROR) {
270282 return false ;
271283 }
@@ -299,7 +311,9 @@ bool Sock::WaitManyKQueue(std::chrono::milliseconds timeout, EventsPerSock& even
299311#endif /* USE_KQUEUE */
300312
301313#ifdef USE_POLL
302- bool Sock::WaitManyPoll (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock)
314+ bool Sock::WaitManyPoll (std::chrono::milliseconds timeout,
315+ EventsPerSock& events_per_sock,
316+ SocketEventsParams::wrap_fn wrap_func)
303317{
304318 if (events_per_sock.empty ()) return true ;
305319
@@ -316,7 +330,11 @@ bool Sock::WaitManyPoll(std::chrono::milliseconds timeout, EventsPerSock& events
316330 }
317331 }
318332
319- if (poll (pfds.data (), pfds.size (), count_milliseconds (timeout)) == SOCKET_ERROR) {
333+ int ret{SOCKET_ERROR};
334+ wrap_func ([&](){
335+ ret = poll (pfds.data (), pfds.size (), count_milliseconds (timeout));
336+ });
337+ if (ret == SOCKET_ERROR) {
320338 return false ;
321339 }
322340
@@ -341,7 +359,9 @@ bool Sock::WaitManyPoll(std::chrono::milliseconds timeout, EventsPerSock& events
341359}
342360#endif /* USE_POLL */
343361
344- bool Sock::WaitManySelect (std::chrono::milliseconds timeout, EventsPerSock& events_per_sock)
362+ bool Sock::WaitManySelect (std::chrono::milliseconds timeout,
363+ EventsPerSock& events_per_sock,
364+ SocketEventsParams::wrap_fn wrap_func)
345365{
346366 if (events_per_sock.empty ()) return true ;
347367
@@ -370,7 +390,11 @@ bool Sock::WaitManySelect(std::chrono::milliseconds timeout, EventsPerSock& even
370390
371391 timeval tv = MillisToTimeval (timeout);
372392
373- if (select (socket_max + 1 , &recv, &send, &err, &tv) == SOCKET_ERROR) {
393+ int ret{SOCKET_ERROR};
394+ wrap_func ([&](){
395+ ret = select (socket_max + 1 , &recv, &send, &err, &tv);
396+ });
397+ if (ret == SOCKET_ERROR) {
374398 return false ;
375399 }
376400
0 commit comments