RSockFD accept()

in net/rsocket/rsocket.cpp [202:227]


    RSockFD accept(uint64_t timeout, photon::net::EndPoint* remote_endpoint,
                   Func&& interrupt) {
        sockaddr_storage addr;
        socklen_t socklen = sizeof(addr.store);
        Timeout tmo(timeout);
        int ret;
        do {
            ret = raccept(fd, (sockaddr*)&addr.store, &socklen);
            if (ret < 0) {
                if (errno == EWOULDBLOCK || errno == EAGAIN) {
                    if (interrupt()) {
                        errno = EINTR;
                        break;
                    }
                    photon::thread_yield();
                } else {
                    break;
                }
            }
        } while (ret < 0 && tmo.timeout());
        if (ret < 0) return RSockFD(-1);
        if (remote_endpoint) {
            *remote_endpoint = addr.to_endpoint();
        }
        return RSockFD(ret);
    }