From: Marshall Clow Date: Fri, 13 Sep 2019 15:28:06 +0000 (+0000) Subject: Only initialize the streams cout/wcout/cerr/wcerr etc once, rather than any time... X-Git-Tag: llvmorg-11-init~9242 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b81a13bfcd1d92f478109f1c87971dafba639d2;p=platform%2Fupstream%2Fllvm.git Only initialize the streams cout/wcout/cerr/wcerr etc once, rather than any time Init::Init is called. Fixes PR#43300 llvm-svn: 371864 --- diff --git a/libcxx/src/iostream.cpp b/libcxx/src/iostream.cpp index 0a5d6e8..ad1920a 100644 --- a/libcxx/src/iostream.cpp +++ b/libcxx/src/iostream.cpp @@ -97,7 +97,13 @@ static void force_locale_initialization() { #endif } -ios_base::Init::Init() +class DoIOSInit { +public: + DoIOSInit(); + ~DoIOSInit(); +}; + +DoIOSInit::DoIOSInit() { force_locale_initialization(); @@ -126,7 +132,7 @@ ios_base::Init::Init() #endif } -ios_base::Init::~Init() +DoIOSInit::~DoIOSInit() { #ifndef _LIBCPP_HAS_NO_STDOUT ostream* cout_ptr = reinterpret_cast(cout); @@ -141,4 +147,13 @@ ios_base::Init::~Init() wclog_ptr->flush(); } +ios_base::Init::Init() +{ + static DoIOSInit init_the_streams; // gets initialized once +} + +ios_base::Init::~Init() +{ +} + _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/test/std/input.output/iostreams.base/ios.base/ios.types/ios_Init/ios_Init.multiple.pass.cpp b/libcxx/test/std/input.output/iostreams.base/ios.base/ios.types/ios_Init/ios_Init.multiple.pass.cpp new file mode 100644 index 0000000..37b4de9d --- /dev/null +++ b/libcxx/test/std/input.output/iostreams.base/ios.base/ios.types/ios_Init/ios_Init.multiple.pass.cpp @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include +#include + +#include "test_macros.h" + +// Test to make sure that the streams only get initialized once +// Taken from https://bugs.llvm.org/show_bug.cgi?id=43300 + +int main(int, char**) +{ + + std::cout << "Hello!"; + std::ios_base::fmtflags stock_flags = std::cout.flags(); + + std::cout << std::boolalpha << true; + std::ios_base::fmtflags ba_flags = std::cout.flags(); + assert(stock_flags != ba_flags); + + std::ios_base::Init init_streams; + std::ios_base::fmtflags after_init = std::cout.flags(); + assert(after_init == ba_flags); + + return 0; +}