From 4ea132c73110f371ecdfbeb5b285562b16fe6cbd Mon Sep 17 00:00:00 2001 From: cpplearner Date: Mon, 12 Jun 2023 12:28:51 +0800 Subject: [PATCH 1/7] Make `_Mtx_internal_imp_mirror` more closely match `_Mtx_internal_imp_t` --- stl/inc/mutex | 16 +++++++--------- stl/src/mutex.cpp | 6 ++++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/stl/inc/mutex b/stl/inc/mutex index 68d7cb6d58..5db088846c 100644 --- a/stl/inc/mutex +++ b/stl/inc/mutex @@ -34,24 +34,22 @@ _EXPORT_STD class condition_variable_any; struct _Mtx_internal_imp_mirror { #ifdef _CRT_WINDOWS #ifdef _WIN64 - static constexpr size_t _Critical_section_size = 8; + static constexpr size_t _Critical_section_size = 16; #else // _WIN64 - static constexpr size_t _Critical_section_size = 4; + static constexpr size_t _Critical_section_size = 8; #endif // _WIN64 #else // _CRT_WINDOWS #ifdef _WIN64 - static constexpr size_t _Critical_section_size = 56; + static constexpr size_t _Critical_section_size = 64; #else // _WIN64 - static constexpr size_t _Critical_section_size = 32; + static constexpr size_t _Critical_section_size = 36; #endif // _WIN64 #endif // _CRT_WINDOWS + static constexpr size_t _Critical_section_align = alignof(void*); + int _Type; - const void* _Vptr; - union { - void* _Srw_lock_placeholder; - unsigned char _Padding[_Critical_section_size]; - }; + _Aligned_storage_t<_Critical_section_size, _Critical_section_align> _Cs; long _Thread_id; int _Count; }; diff --git a/stl/src/mutex.cpp b/stl/src/mutex.cpp index a58090ebef..5f1f4859d4 100644 --- a/stl/src/mutex.cpp +++ b/stl/src/mutex.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,11 @@ struct _Mtx_internal_imp_t { // ConcRT mutex static_assert(sizeof(_Mtx_internal_imp_t) <= _Mtx_internal_imp_size, "incorrect _Mtx_internal_imp_size"); static_assert(alignof(_Mtx_internal_imp_t) <= _Mtx_internal_imp_alignment, "incorrect _Mtx_internal_imp_alignment"); +static_assert( + std::_Mtx_internal_imp_mirror::_Critical_section_size == Concurrency::details::stl_critical_section_max_size); +static_assert( + std::_Mtx_internal_imp_mirror::_Critical_section_align == Concurrency::details::stl_critical_section_max_alignment); + void _Mtx_init_in_situ(_Mtx_t mtx, int type) { // initialize mutex in situ Concurrency::details::create_stl_critical_section(mtx->_get_cs()); mtx->thread_id = -1; From 8c339e1196d939e67c8bf19cc4d94a1cf8335255 Mon Sep 17 00:00:00 2001 From: cpplearner Date: Wed, 14 Jun 2023 01:13:00 +0800 Subject: [PATCH 2/7] Stop depending on `_STL_CONCRT_SUPPORT` --- stl/src/cond.cpp | 4 ++-- stl/src/mutex.cpp | 4 ++-- stl/src/primitives.hpp | 7 ++----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/stl/src/cond.cpp b/stl/src/cond.cpp index 7545c6805c..e9eb1c642b 100644 --- a/stl/src/cond.cpp +++ b/stl/src/cond.cpp @@ -21,8 +21,8 @@ struct _Cnd_internal_imp_t { // condition variable implementation for ConcRT } }; -static_assert(sizeof(_Cnd_internal_imp_t) <= _Cnd_internal_imp_size, "incorrect _Cnd_internal_imp_size"); -static_assert(alignof(_Cnd_internal_imp_t) <= _Cnd_internal_imp_alignment, "incorrect _Cnd_internal_imp_alignment"); +static_assert(sizeof(_Cnd_internal_imp_t) == _Cnd_internal_imp_size, "incorrect _Cnd_internal_imp_size"); +static_assert(alignof(_Cnd_internal_imp_t) == _Cnd_internal_imp_alignment, "incorrect _Cnd_internal_imp_alignment"); void _Cnd_init_in_situ(const _Cnd_t cond) { // initialize condition variable in situ Concurrency::details::create_stl_condition_variable(cond->_get_cv()); diff --git a/stl/src/mutex.cpp b/stl/src/mutex.cpp index 5f1f4859d4..dad5b4f765 100644 --- a/stl/src/mutex.cpp +++ b/stl/src/mutex.cpp @@ -48,8 +48,8 @@ struct _Mtx_internal_imp_t { // ConcRT mutex } }; -static_assert(sizeof(_Mtx_internal_imp_t) <= _Mtx_internal_imp_size, "incorrect _Mtx_internal_imp_size"); -static_assert(alignof(_Mtx_internal_imp_t) <= _Mtx_internal_imp_alignment, "incorrect _Mtx_internal_imp_alignment"); +static_assert(sizeof(_Mtx_internal_imp_t) == _Mtx_internal_imp_size, "incorrect _Mtx_internal_imp_size"); +static_assert(alignof(_Mtx_internal_imp_t) == _Mtx_internal_imp_alignment, "incorrect _Mtx_internal_imp_alignment"); static_assert( std::_Mtx_internal_imp_mirror::_Critical_section_size == Concurrency::details::stl_critical_section_max_size); diff --git a/stl/src/primitives.hpp b/stl/src/primitives.hpp index f3e2d99920..e2d2c5099a 100644 --- a/stl/src/primitives.hpp +++ b/stl/src/primitives.hpp @@ -123,13 +123,10 @@ namespace Concurrency { #if defined(_CRT_WINDOWS) const size_t stl_critical_section_max_size = sizeof(stl_critical_section_win7); const size_t stl_condition_variable_max_size = sizeof(stl_condition_variable_win7); -#elif defined(_STL_CONCRT_SUPPORT) +#else // vvv !defined(_CRT_WINDOWS) vvv const size_t stl_critical_section_max_size = sizeof_stl_critical_section_concrt; const size_t stl_condition_variable_max_size = sizeof_stl_condition_variable_concrt; -#else // vvv !defined(_CRT_WINDOWS) && !defined(_STL_CONCRT_SUPPORT) vvv - const size_t stl_critical_section_max_size = sizeof_stl_critical_section_vista; - const size_t stl_condition_variable_max_size = sizeof_stl_condition_variable_vista; -#endif // ^^^ !defined(_CRT_WINDOWS) && !defined(_STL_CONCRT_SUPPORT) ^^^ +#endif // ^^^ !defined(_CRT_WINDOWS) ^^^ // concrt, vista, and win7 alignments are all identical to alignof(void*) const size_t stl_critical_section_max_alignment = alignof(stl_critical_section_win7); From e3fcbba16204a614ecea32f9cc28e80d23dbea42 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jun 2023 11:07:39 -0700 Subject: [PATCH 3/7] `sizeof_stl_MEOW_vista` is now dead. --- stl/src/primitives.hpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/stl/src/primitives.hpp b/stl/src/primitives.hpp index e2d2c5099a..04cdf0fa20 100644 --- a/stl/src/primitives.hpp +++ b/stl/src/primitives.hpp @@ -111,13 +111,9 @@ namespace Concurrency { #ifdef _WIN64 const size_t sizeof_stl_critical_section_concrt = 64; const size_t sizeof_stl_condition_variable_concrt = 72; - const size_t sizeof_stl_critical_section_vista = 48; - const size_t sizeof_stl_condition_variable_vista = 16; #else // ^^^ 64-bit / 32-bit vvv const size_t sizeof_stl_critical_section_concrt = 36; const size_t sizeof_stl_condition_variable_concrt = 40; - const size_t sizeof_stl_critical_section_vista = 28; - const size_t sizeof_stl_condition_variable_vista = 8; #endif // ^^^ 32-bit ^^^ #if defined(_CRT_WINDOWS) From 6f1a6f6dcf85c19465ecab266c8228d1766d26be Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jun 2023 11:14:59 -0700 Subject: [PATCH 4/7] Hardcode size/align, verified via static_assert. --- stl/src/primitives.hpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/stl/src/primitives.hpp b/stl/src/primitives.hpp index 04cdf0fa20..e754635be5 100644 --- a/stl/src/primitives.hpp +++ b/stl/src/primitives.hpp @@ -117,15 +117,14 @@ namespace Concurrency { #endif // ^^^ 32-bit ^^^ #if defined(_CRT_WINDOWS) - const size_t stl_critical_section_max_size = sizeof(stl_critical_section_win7); - const size_t stl_condition_variable_max_size = sizeof(stl_condition_variable_win7); + const size_t stl_critical_section_max_size = 2 * sizeof(void*); + const size_t stl_condition_variable_max_size = 2 * sizeof(void*); #else // vvv !defined(_CRT_WINDOWS) vvv const size_t stl_critical_section_max_size = sizeof_stl_critical_section_concrt; const size_t stl_condition_variable_max_size = sizeof_stl_condition_variable_concrt; #endif // ^^^ !defined(_CRT_WINDOWS) ^^^ - // concrt, vista, and win7 alignments are all identical to alignof(void*) - const size_t stl_critical_section_max_alignment = alignof(stl_critical_section_win7); - const size_t stl_condition_variable_max_alignment = alignof(stl_condition_variable_win7); + const size_t stl_critical_section_max_alignment = alignof(void*); + const size_t stl_condition_variable_max_alignment = alignof(void*); } // namespace details } // namespace Concurrency From f1fc6261f2a144c98db5f534ab51a3c9448491f5 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jun 2023 11:31:28 -0700 Subject: [PATCH 5/7] Fuse `sizeof_stl_MEOW_concrt` for simplicity. --- stl/src/primitives.hpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/stl/src/primitives.hpp b/stl/src/primitives.hpp index e754635be5..a61e775547 100644 --- a/stl/src/primitives.hpp +++ b/stl/src/primitives.hpp @@ -108,21 +108,16 @@ namespace Concurrency { new (p) stl_condition_variable_win7; } -#ifdef _WIN64 - const size_t sizeof_stl_critical_section_concrt = 64; - const size_t sizeof_stl_condition_variable_concrt = 72; -#else // ^^^ 64-bit / 32-bit vvv - const size_t sizeof_stl_critical_section_concrt = 36; - const size_t sizeof_stl_condition_variable_concrt = 40; -#endif // ^^^ 32-bit ^^^ - -#if defined(_CRT_WINDOWS) +#if defined(_CRT_WINDOWS) // for Windows-internal code const size_t stl_critical_section_max_size = 2 * sizeof(void*); const size_t stl_condition_variable_max_size = 2 * sizeof(void*); -#else // vvv !defined(_CRT_WINDOWS) vvv - const size_t stl_critical_section_max_size = sizeof_stl_critical_section_concrt; - const size_t stl_condition_variable_max_size = sizeof_stl_condition_variable_concrt; -#endif // ^^^ !defined(_CRT_WINDOWS) ^^^ +#elif defined(_WIN64) // ordinary 64-bit code + const size_t stl_critical_section_max_size = 64; + const size_t stl_condition_variable_max_size = 72; +#else // vvv ordinary 32-bit code vvv + const size_t stl_critical_section_max_size = 36; + const size_t stl_condition_variable_max_size = 40; +#endif // ^^^ ordinary 32-bit code ^^^ const size_t stl_critical_section_max_alignment = alignof(void*); const size_t stl_condition_variable_max_alignment = alignof(void*); From bc8714b8987582add3041ec8fe125aebf22ac757 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jun 2023 11:42:43 -0700 Subject: [PATCH 6/7] `_STL_CONCRT_SUPPORT` is now dead. --- stl/CMakeLists.txt | 2 +- stl/msbuild/stl_base/libcp.settings.targets | 1 - stl/msbuild/stl_base/msvcp.settings.targets | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/stl/CMakeLists.txt b/stl/CMakeLists.txt index 8cc4f64b71..574512db5c 100644 --- a/stl/CMakeLists.txt +++ b/stl/CMakeLists.txt @@ -494,7 +494,7 @@ set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "") # Toolset options must appear before add_library() for the options to take effect. -add_compile_definitions(_CRTBLD _VCRT_ALLOW_INTERNALS _HAS_OLD_IOSTREAMS_MEMBERS=1 _STL_CONCRT_SUPPORT) +add_compile_definitions(_CRTBLD _VCRT_ALLOW_INTERNALS _HAS_OLD_IOSTREAMS_MEMBERS=1) # /Z7 for MSVC, /Zi for MASM set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "Embedded") diff --git a/stl/msbuild/stl_base/libcp.settings.targets b/stl/msbuild/stl_base/libcp.settings.targets index 516e62b129..a686a9928d 100644 --- a/stl/msbuild/stl_base/libcp.settings.targets +++ b/stl/msbuild/stl_base/libcp.settings.targets @@ -26,7 +26,6 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception $(OutputLibPdbPath)$(OutputName)$(PdbVerName).pdb - $(ClDefines);_STL_CONCRT_SUPPORT $(ClDefines);_VCRT_ALLOW_INTERNALS;_ANNOTATE_VECTOR;_ANNOTATE_STRING diff --git a/stl/msbuild/stl_base/msvcp.settings.targets b/stl/msbuild/stl_base/msvcp.settings.targets index f136b69304..d834db23bd 100644 --- a/stl/msbuild/stl_base/msvcp.settings.targets +++ b/stl/msbuild/stl_base/msvcp.settings.targets @@ -40,7 +40,6 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception $(CrtBuildDir)\msvcprt_base$(BuildSuffix).$(MsvcpFlavor).import_only.lib $(LibOutputFileName).$(MsvcpFlavor) $(IntermediateOutputDirectory)\$(DllDefName).def - $(ClDefines);_STL_CONCRT_SUPPORT true $(OutputPath)\$(OutputName)$(_PDB_VER_NAME_)$(DllPdbFlavorSuffix) From 536d5a3adf6bcbda74f87f4cc942cbf25b6efdf2 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jun 2023 11:45:12 -0700 Subject: [PATCH 7/7] `DependsOnConcRT` is now dead. --- stl/msbuild/stl_base/libcp.settings.targets | 1 - stl/msbuild/stl_base/msvcp.settings.targets | 1 - 2 files changed, 2 deletions(-) diff --git a/stl/msbuild/stl_base/libcp.settings.targets b/stl/msbuild/stl_base/libcp.settings.targets index a686a9928d..fcd7392783 100644 --- a/stl/msbuild/stl_base/libcp.settings.targets +++ b/stl/msbuild/stl_base/libcp.settings.targets @@ -10,7 +10,6 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception LIBRARY true true - true true diff --git a/stl/msbuild/stl_base/msvcp.settings.targets b/stl/msbuild/stl_base/msvcp.settings.targets index d834db23bd..2d48b09ad3 100644 --- a/stl/msbuild/stl_base/msvcp.settings.targets +++ b/stl/msbuild/stl_base/msvcp.settings.targets @@ -10,7 +10,6 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception $(MsvcpFlavor) $(MsvcpFlavor) - true true true