From a4199b808fd678f74935d540490eae9dc78a9ffe Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 13 Dec 2016 16:39:58 +0200 Subject: Fix thread safety issue --- butl/diagnostics | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'butl/diagnostics') diff --git a/butl/diagnostics b/butl/diagnostics index b56ef10..b76e384 100644 --- a/butl/diagnostics +++ b/butl/diagnostics @@ -9,7 +9,7 @@ #include #include #include // move(), forward() -#include // uncaught_exception() +#include // uncaught_exception(s)() #include #include @@ -36,17 +36,21 @@ namespace butl return r; } - diag_record (): empty_ (true), epilogue_ (nullptr) {} + diag_record () + : +#ifdef BUTL_CXX17_UNCAUGHT_EXCEPTIONS + uncaught_ (std::uncaught_exceptions ()), +#endif + empty_ (true), + epilogue_ (nullptr) {} template explicit - diag_record (const diag_prologue& p) - : empty_ (true), epilogue_ (nullptr) { *this << p;} + diag_record (const diag_prologue& p): diag_record () { *this << p;} template explicit - diag_record (const diag_mark& m) - : empty_ (true), epilogue_ (nullptr) { *this << m;} + diag_record (const diag_mark& m): diag_record () { *this << m;} ~diag_record () noexcept (false); @@ -85,19 +89,16 @@ namespace butl diag_record (diag_record&&); #else diag_record (diag_record&& r) -#ifndef __GLIBCXX__ - : os (std::move (r.os)) + : +#ifdef BUTL_CXX17_UNCAUGHT_EXCEPTIONS + uncaught_ (r.uncaught_), #endif + empty_ (r.empty_), + epilogue_ (r.epilogue_), + os (std::move (r.os)) { - empty_ = r.empty_; - epilogue_ = r.epilogue_; - if (!empty_) { -#ifdef __GLIBCXX__ - // os << r.os.str (); - assert (false); // No way to copy extra stream data? -#endif r.empty_ = true; r.epilogue_ = nullptr; } @@ -109,12 +110,15 @@ namespace butl diag_record (const diag_record&) = delete; diag_record& operator= (const diag_record&) = delete; - public: - mutable std::ostringstream os; - protected: +#ifdef BUTL_CXX17_UNCAUGHT_EXCEPTIONS + const int uncaught_; +#endif mutable bool empty_; mutable diag_epilogue* epilogue_; + + public: + mutable std::ostringstream os; }; template -- cgit v1.1