3939#endif
4040#else
4141#include < arpa/inet.h>
42- #include < errno.h>
4342#include < fcntl.h>
4443#include < netdb.h>
4544#include < netinet/in.h>
5655#include < unordered_map>
5756#include < vector>
5857
59- #include " ../support/ssize.h"
60- #include " ../support/utils.h"
58+ #include " errno_handling.h"
59+ #include " ssize.h"
60+ #include " utils.h"
6161
6262#if defined(_WIN32)
6363static inline int poll (struct pollfd * pfd, int nfds, int timeout) {
@@ -310,7 +310,7 @@ class Socket {
310310 /* !
311311 * \return last error of socket operation
312312 */
313- static int GetLastError () {
313+ static int GetLastErrorCode () {
314314#ifdef _WIN32
315315 return WSAGetLastError ();
316316#else
@@ -319,7 +319,7 @@ class Socket {
319319 }
320320 /* ! \return whether last error was would block */
321321 static bool LastErrorWouldBlock () {
322- int errsv = GetLastError ();
322+ int errsv = GetLastErrorCode ();
323323#ifdef _WIN32
324324 return errsv == WSAEWOULDBLOCK;
325325#else
@@ -355,50 +355,14 @@ class Socket {
355355 * \param msg The error message.
356356 */
357357 static void Error (const char * msg) {
358- int errsv = GetLastError ();
358+ int errsv = GetLastErrorCode ();
359359#ifdef _WIN32
360360 LOG (FATAL) << " Socket " << msg << " Error:WSAError-code=" << errsv;
361361#else
362362 LOG (FATAL) << " Socket " << msg << " Error:" << strerror (errsv);
363363#endif
364364 }
365365
366- /* !
367- * \brief Call a function and retry if an EINTR error is encountered.
368- *
369- * Socket operations can return EINTR when the interrupt handler
370- * is registered by the execution environment(e.g. python).
371- * We should retry if there is no KeyboardInterrupt recorded in
372- * the environment.
373- *
374- * \note This function is needed to avoid rare interrupt event
375- * in long running server code.
376- *
377- * \param func The function to retry.
378- * \return The return code returned by function f or error_value on retry failure.
379- */
380- template <typename FuncType>
381- ssize_t RetryCallOnEINTR (FuncType func) {
382- ssize_t ret = func ();
383- // common path
384- if (ret != -1 ) return ret;
385- // less common path
386- do {
387- if (GetLastError () == EINTR) {
388- // Call into env check signals to see if there are
389- // environment specific(e.g. python) signal exceptions.
390- // This function will throw an exception if there is
391- // if the process received a signal that requires TVM to return immediately (e.g. SIGINT).
392- runtime::EnvCheckSignals ();
393- } else {
394- // other errors
395- return ret;
396- }
397- ret = func ();
398- } while (ret == -1 );
399- return ret;
400- }
401-
402366 protected:
403367 explicit Socket (SockType sockfd) : sockfd(sockfd) {}
404368};
@@ -445,7 +409,8 @@ class TCPSocket : public Socket {
445409 * \return The accepted socket connection.
446410 */
447411 TCPSocket Accept () {
448- SockType newfd = RetryCallOnEINTR ([&]() { return accept (sockfd, nullptr , nullptr ); });
412+ SockType newfd =
413+ RetryCallOnEINTR ([&]() { return accept (sockfd, nullptr , nullptr ); }, GetLastErrorCode);
449414 if (newfd == INVALID_SOCKET) {
450415 Socket::Error (" Accept" );
451416 }
@@ -459,7 +424,8 @@ class TCPSocket : public Socket {
459424 TCPSocket Accept (SockAddr* addr) {
460425 socklen_t addrlen = sizeof (addr->addr );
461426 SockType newfd = RetryCallOnEINTR (
462- [&]() { return accept (sockfd, reinterpret_cast <sockaddr*>(&addr->addr ), &addrlen); });
427+ [&]() { return accept (sockfd, reinterpret_cast <sockaddr*>(&addr->addr ), &addrlen); },
428+ GetLastErrorCode);
463429 if (newfd == INVALID_SOCKET) {
464430 Socket::Error (" Accept" );
465431 }
@@ -500,7 +466,7 @@ class TCPSocket : public Socket {
500466 ssize_t Send (const void * buf_, size_t len, int flag = 0 ) {
501467 const char * buf = reinterpret_cast <const char *>(buf_);
502468 return RetryCallOnEINTR (
503- [&]() { return send (sockfd, buf, static_cast <sock_size_t >(len), flag); });
469+ [&]() { return send (sockfd, buf, static_cast <sock_size_t >(len), flag); }, GetLastErrorCode );
504470 }
505471 /* !
506472 * \brief receive data using the socket
@@ -513,7 +479,8 @@ class TCPSocket : public Socket {
513479 ssize_t Recv (void * buf_, size_t len, int flags = 0 ) {
514480 char * buf = reinterpret_cast <char *>(buf_);
515481 return RetryCallOnEINTR (
516- [&]() { return recv (sockfd, buf, static_cast <sock_size_t >(len), flags); });
482+ [&]() { return recv (sockfd, buf, static_cast <sock_size_t >(len), flags); },
483+ GetLastErrorCode);
517484 }
518485 /* !
519486 * \brief perform block write that will attempt to send all data out
@@ -527,7 +494,8 @@ class TCPSocket : public Socket {
527494 size_t ndone = 0 ;
528495 while (ndone < len) {
529496 ssize_t ret = RetryCallOnEINTR (
530- [&]() { return send (sockfd, buf, static_cast <ssize_t >(len - ndone), 0 ); });
497+ [&]() { return send (sockfd, buf, static_cast <ssize_t >(len - ndone), 0 ); },
498+ GetLastErrorCode);
531499 if (ret == -1 ) {
532500 if (LastErrorWouldBlock ()) return ndone;
533501 Socket::Error (" SendAll" );
@@ -549,7 +517,8 @@ class TCPSocket : public Socket {
549517 size_t ndone = 0 ;
550518 while (ndone < len) {
551519 ssize_t ret = RetryCallOnEINTR (
552- [&]() { return recv (sockfd, buf, static_cast <sock_size_t >(len - ndone), MSG_WAITALL); });
520+ [&]() { return recv (sockfd, buf, static_cast <sock_size_t >(len - ndone), MSG_WAITALL); },
521+ GetLastErrorCode);
553522 if (ret == -1 ) {
554523 if (LastErrorWouldBlock ()) {
555524 LOG (FATAL) << " would block" ;
0 commit comments