diff --git a/stl/CMakeLists.txt b/stl/CMakeLists.txt index 8cc4f64b719..574512db5cb 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/inc/mutex b/stl/inc/mutex index 68d7cb6d582..5db088846cd 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/msbuild/stl_base/libcp.settings.targets b/stl/msbuild/stl_base/libcp.settings.targets index 516e62b1294..fcd73927832 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 @@ -26,7 +25,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 f136b69304b..2d48b09ad3e 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 @@ -40,7 +39,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) diff --git a/stl/src/cond.cpp b/stl/src/cond.cpp index 7545c6805c4..e9eb1c642b7 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 a58090ebefd..dad5b4f7655 100644 --- a/stl/src/mutex.cpp +++ b/stl/src/mutex.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -47,8 +48,13 @@ 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); +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()); diff --git a/stl/src/primitives.hpp b/stl/src/primitives.hpp index f3e2d99920b..a61e7755474 100644 --- a/stl/src/primitives.hpp +++ b/stl/src/primitives.hpp @@ -108,31 +108,18 @@ 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; - 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) - 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) - 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) ^^^ - - // 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); +#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*); +#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*); } // namespace details } // namespace Concurrency