Move skip_eintr to detail.
GitOrigin-RevId: f9898af5691b7fda7e0036de4ede6f17e281c657
This commit is contained in:
parent
cfea83b4c5
commit
5260fa4ef9
@ -316,7 +316,7 @@ Status Fd::get_pending_error() {
|
||||
|
||||
Result<size_t> Fd::write_unsafe(Slice slice) {
|
||||
int native_fd = get_native_fd();
|
||||
auto write_res = skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_errno = errno;
|
||||
if (write_res >= 0) {
|
||||
return narrow_cast<size_t>(write_res);
|
||||
@ -326,7 +326,7 @@ Result<size_t> Fd::write_unsafe(Slice slice) {
|
||||
|
||||
Result<size_t> Fd::write(Slice slice) {
|
||||
int native_fd = get_native_fd();
|
||||
auto write_res = skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_errno = errno;
|
||||
if (write_res >= 0) {
|
||||
return narrow_cast<size_t>(write_res);
|
||||
@ -372,7 +372,7 @@ Result<size_t> Fd::read(MutableSlice slice) {
|
||||
}
|
||||
int native_fd = get_native_fd();
|
||||
CHECK(slice.size() > 0);
|
||||
auto read_res = skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_res = detail::skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_errno = errno;
|
||||
if (read_res >= 0) {
|
||||
if (read_res == 0) {
|
||||
|
@ -195,28 +195,6 @@ class Fd {
|
||||
#endif
|
||||
};
|
||||
|
||||
#if TD_PORT_POSIX
|
||||
template <class F>
|
||||
auto skip_eintr(F &&f) {
|
||||
decltype(f()) res;
|
||||
static_assert(std::is_integral<decltype(res)>::value, "integral type expected");
|
||||
do {
|
||||
errno = 0; // just in case
|
||||
res = f();
|
||||
} while (res < 0 && errno == EINTR);
|
||||
return res;
|
||||
}
|
||||
template <class F>
|
||||
auto skip_eintr_cstr(F &&f) {
|
||||
char *res;
|
||||
do {
|
||||
errno = 0; // just in case
|
||||
res = f();
|
||||
} while (res == nullptr && errno == EINTR);
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
template <class FdT>
|
||||
bool can_read(const FdT &fd) {
|
||||
return (fd.get_flags() & (Fd::Read | Fd::Error)) != 0;
|
||||
|
@ -129,7 +129,7 @@ Result<FileFd> FileFd::open(CSlice filepath, int32 flags, int32 mode) {
|
||||
native_flags |= O_APPEND;
|
||||
}
|
||||
|
||||
int native_fd = skip_eintr([&] { return ::open(filepath.c_str(), native_flags, static_cast<mode_t>(mode)); });
|
||||
int native_fd = detail::skip_eintr([&] { return ::open(filepath.c_str(), native_flags, static_cast<mode_t>(mode)); });
|
||||
if (native_fd < 0) {
|
||||
return OS_ERROR(PSLICE() << "File \"" << filepath << "\" can't be " << PrintFlags{flags});
|
||||
}
|
||||
@ -202,7 +202,7 @@ FileFd FileFd::from_native_fd(NativeFd native_fd) {
|
||||
Result<size_t> FileFd::write(Slice slice) {
|
||||
#if TD_PORT_POSIX
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto write_res = skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
if (write_res >= 0) {
|
||||
return narrow_cast<size_t>(write_res);
|
||||
}
|
||||
@ -231,7 +231,7 @@ Result<size_t> FileFd::write(Slice slice) {
|
||||
Result<size_t> FileFd::read(MutableSlice slice) {
|
||||
#if TD_PORT_POSIX
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto read_res = skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_res = detail::skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_errno = errno;
|
||||
|
||||
if (read_res >= 0) {
|
||||
@ -271,7 +271,7 @@ Result<size_t> FileFd::pwrite(Slice slice, int64 offset) {
|
||||
#if TD_PORT_POSIX
|
||||
auto native_fd = get_native_fd().fd();
|
||||
TRY_RESULT(offset_off_t, narrow_cast_safe<off_t>(offset));
|
||||
auto pwrite_res = skip_eintr([&] { return ::pwrite(native_fd, slice.begin(), slice.size(), offset_off_t); });
|
||||
auto pwrite_res = detail::skip_eintr([&] { return ::pwrite(native_fd, slice.begin(), slice.size(), offset_off_t); });
|
||||
if (pwrite_res >= 0) {
|
||||
return narrow_cast<size_t>(pwrite_res);
|
||||
}
|
||||
@ -309,7 +309,7 @@ Result<size_t> FileFd::pread(MutableSlice slice, int64 offset) {
|
||||
#if TD_PORT_POSIX
|
||||
auto native_fd = get_native_fd().fd();
|
||||
TRY_RESULT(offset_off_t, narrow_cast_safe<off_t>(offset));
|
||||
auto pread_res = skip_eintr([&] { return ::pread(native_fd, slice.begin(), slice.size(), offset_off_t); });
|
||||
auto pread_res = detail::skip_eintr([&] { return ::pread(native_fd, slice.begin(), slice.size(), offset_off_t); });
|
||||
if (pread_res >= 0) {
|
||||
return narrow_cast<size_t>(pread_res);
|
||||
}
|
||||
@ -481,7 +481,7 @@ Status FileFd::seek(int64 position) {
|
||||
CHECK(!empty());
|
||||
#if TD_PORT_POSIX
|
||||
TRY_RESULT(position_off_t, narrow_cast_safe<off_t>(position));
|
||||
if (skip_eintr([&] { return ::lseek(get_native_fd().fd(), position_off_t, SEEK_SET); }) < 0) {
|
||||
if (detail::skip_eintr([&] { return ::lseek(get_native_fd().fd(), position_off_t, SEEK_SET); }) < 0) {
|
||||
#elif TD_PORT_WINDOWS
|
||||
LARGE_INTEGER offset;
|
||||
offset.QuadPart = position;
|
||||
@ -496,7 +496,7 @@ Status FileFd::truncate_to_current_position(int64 current_position) {
|
||||
CHECK(!empty());
|
||||
#if TD_PORT_POSIX
|
||||
TRY_RESULT(current_position_off_t, narrow_cast_safe<off_t>(current_position));
|
||||
if (skip_eintr([&] { return ::ftruncate(get_native_fd().fd(), current_position_off_t); }) < 0) {
|
||||
if (detail::skip_eintr([&] { return ::ftruncate(get_native_fd().fd(), current_position_off_t); }) < 0) {
|
||||
#elif TD_PORT_WINDOWS
|
||||
if (SetEndOfFile(get_native_fd().io_handle()) == 0) {
|
||||
#endif
|
||||
|
@ -215,7 +215,7 @@ class ServerSocketFdImpl {
|
||||
sockaddr_storage addr;
|
||||
socklen_t addr_len = sizeof(addr);
|
||||
int native_fd = get_native_fd().fd();
|
||||
int r_fd = skip_eintr([&] { return ::accept(native_fd, reinterpret_cast<sockaddr *>(&addr), &addr_len); });
|
||||
int r_fd = detail::skip_eintr([&] { return ::accept(native_fd, reinterpret_cast<sockaddr *>(&addr), &addr_len); });
|
||||
auto accept_errno = errno;
|
||||
if (r_fd >= 0) {
|
||||
return SocketFd::from_native_fd(NativeFd(r_fd));
|
||||
|
@ -331,7 +331,7 @@ class SocketFdImpl {
|
||||
}
|
||||
Result<size_t> write(Slice slice) {
|
||||
int native_fd = get_native_fd().fd();
|
||||
auto write_res = skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_errno = errno;
|
||||
if (write_res >= 0) {
|
||||
return narrow_cast<size_t>(write_res);
|
||||
@ -376,7 +376,7 @@ class SocketFdImpl {
|
||||
}
|
||||
int native_fd = get_native_fd().fd();
|
||||
CHECK(slice.size() > 0);
|
||||
auto read_res = skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_res = detail::skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_errno = errno;
|
||||
if (read_res >= 0) {
|
||||
if (read_res == 0) {
|
||||
|
@ -503,7 +503,7 @@ class UdpSocketFdImpl {
|
||||
helper.to_native(message, message_header);
|
||||
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto recvmsg_res = skip_eintr([&] { return recvmsg(native_fd, &message_header, flags); });
|
||||
auto recvmsg_res = detail::skip_eintr([&] { return recvmsg(native_fd, &message_header, flags); });
|
||||
auto recvmsg_errno = errno;
|
||||
if (recvmsg_res >= 0) {
|
||||
helper.from_native(message_header, recvmsg_res, message);
|
||||
@ -558,7 +558,7 @@ class UdpSocketFdImpl {
|
||||
helper.to_native(message, message_header);
|
||||
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto sendmsg_res = skip_eintr([&] { return sendmsg(native_fd, &message_header, 0); });
|
||||
auto sendmsg_res = detail::skip_eintr([&] { return sendmsg(native_fd, &message_header, 0); });
|
||||
auto sendmsg_errno = errno;
|
||||
if (sendmsg_res >= 0) {
|
||||
is_sent = true;
|
||||
@ -668,7 +668,7 @@ class UdpSocketFdImpl {
|
||||
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto sendmmsg_res =
|
||||
skip_eintr([&] { return sendmmsg(native_fd, headers.data(), narrow_cast<unsigned int>(to_send), 0); });
|
||||
detail::skip_eintr([&] { return sendmmsg(native_fd, headers.data(), narrow_cast<unsigned int>(to_send), 0); });
|
||||
auto sendmmsg_errno = errno;
|
||||
if (sendmmsg_res >= 0) {
|
||||
cnt = sendmmsg_res;
|
||||
@ -718,7 +718,7 @@ class UdpSocketFdImpl {
|
||||
}
|
||||
|
||||
auto native_fd = get_native_fd().fd();
|
||||
auto recvmmsg_res = skip_eintr(
|
||||
auto recvmmsg_res = detail::skip_eintr(
|
||||
[&] { return recvmmsg(native_fd, headers.data(), narrow_cast<unsigned int>(to_receive), flags, nullptr); });
|
||||
auto recvmmsg_errno = errno;
|
||||
if (recvmmsg_res >= 0) {
|
||||
|
@ -61,7 +61,7 @@ void EventFdLinux::release() {
|
||||
auto native_fd = impl_->info.native_fd().fd();
|
||||
|
||||
auto result = [&]() -> Result<size_t> {
|
||||
auto write_res = skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_res = detail::skip_eintr([&] { return ::write(native_fd, slice.begin(), slice.size()); });
|
||||
auto write_errno = errno;
|
||||
if (write_res >= 0) {
|
||||
return narrow_cast<size_t>(write_res);
|
||||
@ -84,7 +84,7 @@ void EventFdLinux::acquire() {
|
||||
auto native_fd = impl_->info.native_fd().fd();
|
||||
auto result = [&]() -> Result<size_t> {
|
||||
CHECK(slice.size() > 0);
|
||||
auto read_res = skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_res = detail::skip_eintr([&] { return ::read(native_fd, slice.begin(), slice.size()); });
|
||||
auto read_errno = errno;
|
||||
if (read_res >= 0) {
|
||||
CHECK(read_res != 0);
|
||||
|
@ -324,6 +324,7 @@ inline const NativeFd &PollableFd::native_fd() const {
|
||||
}
|
||||
|
||||
#if TD_PORT_POSIX
|
||||
namespace detail {
|
||||
template <class F>
|
||||
auto skip_eintr(F &&f) {
|
||||
decltype(f()) res;
|
||||
@ -343,6 +344,7 @@ auto skip_eintr_cstr(F &&f) {
|
||||
} while (res == nullptr && errno == EINTR);
|
||||
return res;
|
||||
}
|
||||
} // namespace detail
|
||||
#endif
|
||||
|
||||
template <class FdT>
|
||||
|
@ -77,7 +77,7 @@ Status rmrf(CSlice path) {
|
||||
#if TD_PORT_POSIX
|
||||
|
||||
Status mkdir(CSlice dir, int32 mode) {
|
||||
int mkdir_res = skip_eintr([&] { return ::mkdir(dir.c_str(), static_cast<mode_t>(mode)); });
|
||||
int mkdir_res = detail::skip_eintr([&] { return ::mkdir(dir.c_str(), static_cast<mode_t>(mode)); });
|
||||
if (mkdir_res == 0) {
|
||||
return Status::OK();
|
||||
}
|
||||
@ -90,7 +90,7 @@ Status mkdir(CSlice dir, int32 mode) {
|
||||
}
|
||||
|
||||
Status rename(CSlice from, CSlice to) {
|
||||
int rename_res = skip_eintr([&] { return ::rename(from.c_str(), to.c_str()); });
|
||||
int rename_res = detail::skip_eintr([&] { return ::rename(from.c_str(), to.c_str()); });
|
||||
if (rename_res < 0) {
|
||||
return OS_ERROR(PSLICE() << "Can't rename \"" << from << "\" to \"" << to << '\"');
|
||||
}
|
||||
@ -100,7 +100,7 @@ Status rename(CSlice from, CSlice to) {
|
||||
Result<string> realpath(CSlice slice, bool ignore_access_denied) {
|
||||
char full_path[PATH_MAX + 1];
|
||||
string res;
|
||||
char *err = skip_eintr_cstr([&] { return ::realpath(slice.c_str(), full_path); });
|
||||
char *err = detail::skip_eintr_cstr([&] { return ::realpath(slice.c_str(), full_path); });
|
||||
if (err != full_path) {
|
||||
if (ignore_access_denied && (errno == EACCES || errno == EPERM)) {
|
||||
res = slice.str();
|
||||
@ -122,7 +122,7 @@ Result<string> realpath(CSlice slice, bool ignore_access_denied) {
|
||||
}
|
||||
|
||||
Status chdir(CSlice dir) {
|
||||
int chdir_res = skip_eintr([&] { return ::chdir(dir.c_str()); });
|
||||
int chdir_res = detail::skip_eintr([&] { return ::chdir(dir.c_str()); });
|
||||
if (chdir_res) {
|
||||
return OS_ERROR(PSLICE() << "Can't change directory to \"" << dir << '"');
|
||||
}
|
||||
@ -130,7 +130,7 @@ Status chdir(CSlice dir) {
|
||||
}
|
||||
|
||||
Status rmdir(CSlice dir) {
|
||||
int rmdir_res = skip_eintr([&] { return ::rmdir(dir.c_str()); });
|
||||
int rmdir_res = detail::skip_eintr([&] { return ::rmdir(dir.c_str()); });
|
||||
if (rmdir_res) {
|
||||
return OS_ERROR(PSLICE() << "Can't delete directory \"" << dir << '"');
|
||||
}
|
||||
@ -138,7 +138,7 @@ Status rmdir(CSlice dir) {
|
||||
}
|
||||
|
||||
Status unlink(CSlice path) {
|
||||
int unlink_res = skip_eintr([&] { return ::unlink(path.c_str()); });
|
||||
int unlink_res = detail::skip_eintr([&] { return ::unlink(path.c_str()); });
|
||||
if (unlink_res) {
|
||||
return OS_ERROR(PSLICE() << "Can't unlink \"" << path << '"');
|
||||
}
|
||||
@ -185,7 +185,7 @@ Result<std::pair<FileFd, string>> mkstemp(CSlice dir) {
|
||||
}
|
||||
file_pattern += "tmpXXXXXXXXXX";
|
||||
|
||||
int fd = skip_eintr([&] { return ::mkstemp(&file_pattern[0]); });
|
||||
int fd = detail::skip_eintr([&] { return ::mkstemp(&file_pattern[0]); });
|
||||
if (fd == -1) {
|
||||
return OS_ERROR(PSLICE() << "Can't create temporary file \"" << file_pattern << '"');
|
||||
}
|
||||
@ -217,7 +217,7 @@ Result<string> mkdtemp(CSlice dir, Slice prefix) {
|
||||
dir_pattern.append(prefix.begin(), prefix.size());
|
||||
dir_pattern += "XXXXXX";
|
||||
|
||||
char *result = skip_eintr_cstr([&] { return ::mkdtemp(&dir_pattern[0]); });
|
||||
char *result = detail::skip_eintr_cstr([&] { return ::mkdtemp(&dir_pattern[0]); });
|
||||
if (result == nullptr) {
|
||||
return OS_ERROR(PSLICE() << "Can't create temporary directory \"" << dir_pattern << '"');
|
||||
}
|
||||
|
Reference in New Issue
Block a user