From f2633d382b91564a0c4442c997fd1ff439b976d1 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 7 Mar 2023 11:46:05 -0800 Subject: [PATCH] Cleanups: Simplify `thread` and `condition_variable`, identify unused dllexports (#3532) --- stl/inc/condition_variable | 17 +++-------------- stl/inc/mutex | 8 +++----- stl/inc/thread | 5 ++++- stl/inc/xthreads.h | 9 --------- stl/inc/xtimec.h | 1 - stl/src/thread0.cpp | 1 + stl/src/xtime.cpp | 1 + 7 files changed, 12 insertions(+), 30 deletions(-) diff --git a/stl/inc/condition_variable b/stl/inc/condition_variable index e4304da8d..e5b917a87 100644 --- a/stl/inc/condition_variable +++ b/stl/inc/condition_variable @@ -224,16 +224,8 @@ public: // but unfortunately our ABI speaks struct xtime, which is relative to the system clock. _CSTD xtime _Tgt; (void) _To_xtime_10_day_clamped(_Tgt, _Rel_time); - const int _Res = _Cnd_timedwait(_Mycnd(), _Myptr->_Mymtx(), &_Tgt); + (void) _Cnd_timedwait(_Mycnd(), _Myptr->_Mymtx(), &_Tgt); _Guard_unlocks_before_locking_outer.unlock(); - - switch (_Res) { - case _Thrd_timedout: - case _Thrd_success: - break; - default: - _Throw_C_error(_Res); - } } // relock return _Pred(); @@ -262,13 +254,10 @@ private: const int _Res = _Cnd_timedwait(_Mycnd(), _Ptr->_Mymtx(), _Abs_time); _Guard.unlock(); - switch (_Res) { - case _Thrd_success: + if (_Res == _Thrd_success) { return cv_status::no_timeout; - case _Thrd_timedout: + } else { return cv_status::timeout; - default: - _Throw_C_error(_Res); } } }; diff --git a/stl/inc/mutex b/stl/inc/mutex index 46a754475..393d9dff2 100644 --- a/stl/inc/mutex +++ b/stl/inc/mutex @@ -746,13 +746,11 @@ public: // Nothing to do to comply with LWG-2135 because std::mutex lock/unlock are nothrow const int _Res = _Cnd_timedwait(_Mycnd(), _Lck.mutex()->_Mymtx(), _Abs_time); - switch (_Res) { - case _Thrd_success: + + if (_Res == _Thrd_success) { return cv_status::no_timeout; - case _Thrd_timedout: + } else { return cv_status::timeout; - default: - _Throw_C_error(_Res); } } diff --git a/stl/inc/thread b/stl/inc/thread index 70cd8fb6e..18f862c5f 100644 --- a/stl/inc/thread +++ b/stl/inc/thread @@ -137,7 +137,10 @@ public: _Throw_Cpp_error(_INVALID_ARGUMENT); } - _Check_C_return(_Thrd_detach(_Thr)); + if (_Thrd_detach(_Thr) != _Thrd_success) { + _Throw_Cpp_error(_INVALID_ARGUMENT); + } + _Thr = {}; } diff --git a/stl/inc/xthreads.h b/stl/inc/xthreads.h index 815768509..83c04c3fb 100644 --- a/stl/inc/xthreads.h +++ b/stl/inc/xthreads.h @@ -129,16 +129,7 @@ enum { // constants for error codes _RESOURCE_UNAVAILABLE_TRY_AGAIN }; -extern "C++" [[noreturn]] _CRTIMP2_PURE void __cdecl _Throw_C_error(int _Code); extern "C++" [[noreturn]] _CRTIMP2_PURE void __cdecl _Throw_Cpp_error(int _Code); - -inline int _Check_C_return(int _Res) { // throw exception on failure - if (_Res != _Thrd_success) { - _Throw_C_error(_Res); - } - - return _Res; -} _STD_END #pragma pop_macro("new") _STL_RESTORE_CLANG_WARNINGS diff --git a/stl/inc/xtimec.h b/stl/inc/xtimec.h index 64741469d..124193597 100644 --- a/stl/inc/xtimec.h +++ b/stl/inc/xtimec.h @@ -27,7 +27,6 @@ struct xtime { // store time with nanosecond resolution _CRTIMP2_PURE int __cdecl xtime_get(xtime*, int); -_CRTIMP2_PURE long __cdecl _Xtime_diff_to_millis(const xtime*); _CRTIMP2_PURE long __cdecl _Xtime_diff_to_millis2(const xtime*, const xtime*); _CRTIMP2_PURE long long __cdecl _Xtime_get_ticks(); diff --git a/stl/src/thread0.cpp b/stl/src/thread0.cpp index bffe7faf6..d3c8bbecf 100644 --- a/stl/src/thread0.cpp +++ b/stl/src/thread0.cpp @@ -35,6 +35,7 @@ static constexpr errc codes[] = { _THROW(system_error(static_cast(codes[code]), _STD generic_category(), msgs[code])); } +// TRANSITION, ABI: preserved for binary compatibility [[noreturn]] _CRTIMP2_PURE void __cdecl _Throw_C_error(int code) { // throw error object for C error switch (code) { // select the exception case _Thrd_nomem: diff --git a/stl/src/xtime.cpp b/stl/src/xtime.cpp index 2c0e7847b..a6139b686 100644 --- a/stl/src/xtime.cpp +++ b/stl/src/xtime.cpp @@ -64,6 +64,7 @@ _CRTIMP2_PURE long __cdecl _Xtime_diff_to_millis2(const xtime* xt1, const xtime* return static_cast(diff.sec * _Msec_per_sec + (diff.nsec + _Nsec_per_msec - 1) / _Nsec_per_msec); } +// TRANSITION, ABI: preserved for binary compatibility _CRTIMP2_PURE long __cdecl _Xtime_diff_to_millis(const xtime* xt) { // convert time to milliseconds xtime now; xtime_get(&now, TIME_UTC);