From 0f4343d542e89a9438e302c77e6a1ab05793f6c6 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 10 Sep 2018 17:05:12 +0300 Subject: [PATCH] Add real NativeFd::set_is_blocking. GitOrigin-RevId: a44de74e99cbe6161589e0d039f8fcb8b6e339c1 --- tdutils/td/utils/port/Fd.cpp | 13 ------------- tdutils/td/utils/port/ServerSocketFd.cpp | 2 +- tdutils/td/utils/port/SocketFd.cpp | 2 +- tdutils/td/utils/port/UdpSocketFd.cpp | 2 +- tdutils/td/utils/port/detail/EventFdBsd.cpp | 4 ++-- tdutils/td/utils/port/detail/NativeFd.cpp | 17 +++++++++++++++++ tdutils/td/utils/port/detail/NativeFd.h | 2 ++ 7 files changed, 24 insertions(+), 18 deletions(-) diff --git a/tdutils/td/utils/port/Fd.cpp b/tdutils/td/utils/port/Fd.cpp index 89e29a9fb..4e4f32d27 100644 --- a/tdutils/td/utils/port/Fd.cpp +++ b/tdutils/td/utils/port/Fd.cpp @@ -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 diff --git a/tdutils/td/utils/port/ServerSocketFd.cpp b/tdutils/td/utils/port/ServerSocketFd.cpp index 5d1023759..2697ef60c 100644 --- a/tdutils/td/utils/port/ServerSocketFd.cpp +++ b/tdutils/td/utils/port/ServerSocketFd.cpp @@ -314,7 +314,7 @@ Result 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}; diff --git a/tdutils/td/utils/port/SocketFd.cpp b/tdutils/td/utils/port/SocketFd.cpp index bea99e216..42a98de20 100644 --- a/tdutils/td/utils/port/SocketFd.cpp +++ b/tdutils/td/utils/port/SocketFd.cpp @@ -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 diff --git a/tdutils/td/utils/port/UdpSocketFd.cpp b/tdutils/td/utils/port/UdpSocketFd.cpp index c7ab2687f..7de5414dd 100644 --- a/tdutils/td/utils/port/UdpSocketFd.cpp +++ b/tdutils/td/utils/port/UdpSocketFd.cpp @@ -761,7 +761,7 @@ Result 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 diff --git a/tdutils/td/utils/port/detail/EventFdBsd.cpp b/tdutils/td/utils/port/detail/EventFdBsd.cpp index 37fb2c0a8..0d9f7e5e7 100644 --- a/tdutils/td/utils/port/detail/EventFdBsd.cpp +++ b/tdutils/td/utils/port/detail/EventFdBsd.cpp @@ -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(); diff --git a/tdutils/td/utils/port/detail/NativeFd.cpp b/tdutils/td/utils/port/detail/NativeFd.cpp index 1747f518f..11421374f 100644 --- a/tdutils/td/utils/port/detail/NativeFd.cpp +++ b/tdutils/td/utils/port/detail/NativeFd.cpp @@ -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 diff --git a/tdutils/td/utils/port/detail/NativeFd.h b/tdutils/td/utils/port/detail/NativeFd.h index cf5479f7e..d01de1f5e 100644 --- a/tdutils/td/utils/port/detail/NativeFd.h +++ b/tdutils/td/utils/port/detail/NativeFd.h @@ -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();