Add real NativeFd::set_is_blocking.
GitOrigin-RevId: a44de74e99cbe6161589e0d039f8fcb8b6e339c1
This commit is contained in:
parent
27b848f5c0
commit
0f4343d542
@ -19,19 +19,6 @@ Status Fd::duplicate(const Fd &from, Fd &to) {
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
Status Fd::set_is_blocking(bool is_blocking) {
|
||||
auto old_flags = fcntl(fd_, F_GETFL);
|
||||
if (old_flags == -1) {
|
||||
return OS_SOCKET_ERROR("Failed to get socket flags");
|
||||
}
|
||||
auto new_flags = is_blocking ? old_flags & ~O_NONBLOCK : old_flags | O_NONBLOCK;
|
||||
if (new_flags != old_flags && fcntl(fd_, F_SETFL, new_flags) == -1) {
|
||||
return OS_SOCKET_ERROR("Failed to set socket flags");
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if TD_PORT_WINDOWS
|
||||
|
@ -314,7 +314,7 @@ Result<ServerSocketFd> ServerSocketFd::open(int32 port, CSlice addr) {
|
||||
return OS_SOCKET_ERROR("Failed to create a socket");
|
||||
}
|
||||
|
||||
TRY_STATUS(fd.set_is_blocking(false));
|
||||
TRY_STATUS(fd.set_is_blocking_unsafe(false));
|
||||
auto sock = fd.socket();
|
||||
|
||||
linger ling = {0, 0};
|
||||
|
@ -455,7 +455,7 @@ Status get_socket_pending_error(const NativeFd &fd) {
|
||||
#endif
|
||||
|
||||
Status init_socket_options(NativeFd &native_fd) {
|
||||
TRY_STATUS(native_fd.set_is_blocking(false));
|
||||
TRY_STATUS(native_fd.set_is_blocking_unsafe(false));
|
||||
|
||||
auto sock = native_fd.socket();
|
||||
#if TD_PORT_POSIX
|
||||
|
@ -761,7 +761,7 @@ Result<UdpSocketFd> UdpSocketFd::open(const IPAddress &address) {
|
||||
if (!native_fd) {
|
||||
return OS_SOCKET_ERROR("Failed to create a socket");
|
||||
}
|
||||
TRY_STATUS(native_fd.set_is_blocking(false));
|
||||
TRY_STATUS(native_fd.set_is_blocking_unsafe(false));
|
||||
|
||||
auto sock = native_fd.socket();
|
||||
#if TD_PORT_POSIX
|
||||
|
@ -41,8 +41,8 @@ void EventFdBsd::init() {
|
||||
|
||||
auto fd_a = NativeFd(fds[0]);
|
||||
auto fd_b = NativeFd(fds[1]);
|
||||
fd_a.set_is_blocking(false).ensure();
|
||||
fd_b.set_is_blocking(false).ensure();
|
||||
fd_a.set_is_blocking_unsafe(false).ensure();
|
||||
fd_b.set_is_blocking_unsafe(false).ensure();
|
||||
|
||||
in_ = SocketFd::from_native_fd(std::move(fd_a)).move_as_ok();
|
||||
out_ = SocketFd::from_native_fd(std::move(fd_b)).move_as_ok();
|
||||
|
@ -68,6 +68,23 @@ NativeFd::Raw NativeFd::socket() const {
|
||||
#endif
|
||||
|
||||
Status NativeFd::set_is_blocking(bool is_blocking) const {
|
||||
#if TD_PORT_POSIX
|
||||
auto old_flags = fcntl(fd(), F_GETFL);
|
||||
if (old_flags == -1) {
|
||||
return OS_SOCKET_ERROR("Failed to get socket flags");
|
||||
}
|
||||
auto new_flags = is_blocking ? old_flags & ~O_NONBLOCK : old_flags | O_NONBLOCK;
|
||||
if (new_flags != old_flags && fcntl(fd(), F_SETFL, new_flags) == -1) {
|
||||
return OS_SOCKET_ERROR("Failed to set socket flags");
|
||||
}
|
||||
|
||||
return Status::OK();
|
||||
#elif TD_PORT_WINDOWS
|
||||
return set_is_blocking_unsafe(is_blocking);
|
||||
#endif
|
||||
}
|
||||
|
||||
Status NativeFd::set_is_blocking_unsafe(bool is_blocking) const {
|
||||
#if TD_PORT_POSIX
|
||||
if (fcntl(fd(), F_SETFL, is_blocking ? 0 : O_NONBLOCK) == -1) {
|
||||
#elif TD_PORT_WINDOWS
|
||||
|
@ -48,6 +48,8 @@ class NativeFd {
|
||||
|
||||
Status set_is_blocking(bool is_blocking) const;
|
||||
|
||||
Status set_is_blocking_unsafe(bool is_blocking) const; // may drop other Fd flags on non-Windows
|
||||
|
||||
void close();
|
||||
Raw release();
|
||||
|
||||
|
Reference in New Issue
Block a user