From d2171a77e13ce8bc38b8f2163086a84958504f44 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 12 Sep 2018 04:53:04 +0300 Subject: [PATCH] Fix StdStreams initialization in UWP. GitOrigin-RevId: 3f916079a8ad17eeec7a02c7caeb2e0f143f2341 --- tdutils/td/utils/port/StdStreams.cpp | 82 ++++++++++++++++------------ 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/tdutils/td/utils/port/StdStreams.cpp b/tdutils/td/utils/port/StdStreams.cpp index 1fc4ad20e..cf3459b0b 100644 --- a/tdutils/td/utils/port/StdStreams.cpp +++ b/tdutils/td/utils/port/StdStreams.cpp @@ -10,50 +10,60 @@ namespace td { -namespace { -template -FileFd create(T handle) { - return FileFd::from_native_fd(NativeFd(handle, true)); -} -} // namespace -FileFd &Stdin() { - static FileFd res = create( #if TD_PORT_POSIX - 0 -#elif TD_PORT_WINDOWS - GetStdHandle(STD_INPUT_HANDLE) -#endif - ); - return res; -} -FileFd &Stdout() { - static FileFd res = create( -#if TD_PORT_POSIX - 1 -#elif TD_PORT_WINDOWS - GetStdHandle(STD_OUTPUT_HANDLE) -#endif - ); - return res; -} -FileFd &Stderr() { - static FileFd res = create( -#if TD_PORT_POSIX - 2 -#elif TD_PORT_WINDOWS - GetStdHandle(STD_ERROR_HANDLE) -#endif - ); - return res; +template +static FileFd &get_file_fd() { + static FileFd result = FileFd::from_native_fd(NativeFd(id, true)); + return result; } -#if TD_WINDOWS +FileFd &Stdin() { + return get_file_fd<0>(); +} +FileFd &Stdout() { + return get_file_fd<1>(); +} +FileFd &Stderr() { + return get_file_fd<2>(); +} +#elif TD_PORT_WINDOWS +template +static FileFd &get_file_fd() { +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) + static auto handle = GetStdHandle(id); + LOG_IF(FATAL, handle == INVALID_HANDLE_VALUE) << "Failed to GetStdHandle " << id; + static FileFd result = FileFd::from_native_fd(NativeFd(handle, true)); +#else + static FileFd result; + result = FileFd(); +#endif + return result; +} + +FileFd &Stdin() { + return get_file_fd(); +} +FileFd &Stdout() { + return get_file_fd(); +} +FileFd &Stderr() { + return get_file_fd(); +} +#endif + +#if TD_PORT_WINDOWS namespace detail { class BufferedStdinImpl { public: +#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) BufferedStdinImpl() : info_(NativeFd(GetStdHandle(STD_INPUT_HANDLE), true)) { read_thread_ = td::thread([this] { this->read_loop(); }); } +#else + BufferedStdinImpl() { + close(); + } +#endif BufferedStdinImpl(const BufferedStdinImpl &) = delete; BufferedStdinImpl &operator=(const BufferedStdinImpl &) = delete; BufferedStdinImpl(BufferedStdinImpl &&) = delete; @@ -118,7 +128,7 @@ void BufferedStdinImplDeleter::operator()(BufferedStdinImpl *impl) { impl->close(); } } // namespace detail -#else +#elif TD_PORT_POSIX namespace detail { class BufferedStdinImpl { public: