in net/basic_socket.cpp [86:113]
int connect(int fd, const struct sockaddr *addr, socklen_t addrlen,
Timeout timeout) {
int err = 0;
while (true) {
int ret = ::connect(fd, addr, addrlen);
if (ret < 0) {
auto e = errno; // errno is usually a macro that expands to a
// function call
if (e == EINTR) {
err = 1;
continue;
}
if (e == EINPROGRESS || (e == EADDRINUSE && err == 1)) {
ret = photon::wait_for_fd_writable(fd, timeout);
if (ret < 0) return -1;
socklen_t n = sizeof(err);
ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &n);
if (unlikely(ret < 0)) return -1;
if (err) {
errno = err;
return -1;
}
return 0;
}
}
return ret;
}
}