From 6265e1f0d45e517f24765ac8cd89237ae178be15 Mon Sep 17 00:00:00 2001 From: Charlie Barto Date: Wed, 3 Jan 2024 16:19:06 -0800 Subject: [PATCH 1/3] use the windows specific mutex sizes when UNDOCKED_WINDOWS_UCRT is defined _CRT_WINDOWS is only defined when _building_ the crt in windows mode. --- stl/inc/xthreads.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/stl/inc/xthreads.h b/stl/inc/xthreads.h index 8eddb38e0f3..939fe92c76c 100644 --- a/stl/inc/xthreads.h +++ b/stl/inc/xthreads.h @@ -33,19 +33,20 @@ struct _Stl_critical_section { }; struct _Mtx_internal_imp_t { -#ifdef _CRT_WINDOWS +#if defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) #ifdef _WIN64 static constexpr size_t _Critical_section_size = 16; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 8; #endif // ^^^ !defined(_WIN64) ^^^ -#else // ^^^ defined(_CRT_WINDOWS) / !defined(_CRT_WINDOWS) vvv +#else // ^^^ defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) / !defined(_CRT_WINDOWS) || + // defined(UNDOCKED_WINDOWS_UCRT) vvv #ifdef _WIN64 static constexpr size_t _Critical_section_size = 64; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 36; #endif // ^^^ !defined(_WIN64) ^^^ -#endif // ^^^ !defined(_CRT_WINDOWS) ^^^ +#endif // ^^^ !defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) ^^^ static constexpr size_t _Critical_section_align = alignof(void*); From 8b9c211a2b4490cb5b78a7252161ca8f0fcd9bfb Mon Sep 17 00:00:00 2001 From: Charlie Barto Date: Wed, 3 Jan 2024 16:23:42 -0800 Subject: [PATCH 2/3] add a pragma detect_mismatch for the mutex size in the windows build. --- stl/inc/xthreads.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stl/inc/xthreads.h b/stl/inc/xthreads.h index 939fe92c76c..1becadb17a7 100644 --- a/stl/inc/xthreads.h +++ b/stl/inc/xthreads.h @@ -34,6 +34,7 @@ struct _Stl_critical_section { struct _Mtx_internal_imp_t { #if defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) +#pragma detect_mismatch("_CRT_WINDOWS_mutex_size", "1") #ifdef _WIN64 static constexpr size_t _Critical_section_size = 16; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv @@ -41,6 +42,7 @@ struct _Mtx_internal_imp_t { #endif // ^^^ !defined(_WIN64) ^^^ #else // ^^^ defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) / !defined(_CRT_WINDOWS) || // defined(UNDOCKED_WINDOWS_UCRT) vvv +#pragma detect_mismatch("_CRT_WINDOWS_mutex_size", "0") #ifdef _WIN64 static constexpr size_t _Critical_section_size = 64; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv @@ -48,6 +50,7 @@ struct _Mtx_internal_imp_t { #endif // ^^^ !defined(_WIN64) ^^^ #endif // ^^^ !defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) ^^^ + static constexpr size_t _Critical_section_align = alignof(void*); int _Type{}; From 2b173a999917776781bc9459a4f1292d20eda386 Mon Sep 17 00:00:00 2001 From: Charlie Barto Date: Fri, 5 Jan 2024 12:39:56 -0800 Subject: [PATCH 3/3] review comments --- stl/inc/xthreads.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/stl/inc/xthreads.h b/stl/inc/xthreads.h index 1becadb17a7..e0c05e459c5 100644 --- a/stl/inc/xthreads.h +++ b/stl/inc/xthreads.h @@ -32,23 +32,26 @@ struct _Stl_critical_section { _Smtx_t _M_srw_lock = nullptr; }; +#if defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) +#pragma detect_mismatch("windows_mutex", "1") +#else // ^^^ Windows private STL / public STL vvv +#pragma detect_mismatch("windows_mutex", "0") +#endif // ^^^ public STL ^^^ + struct _Mtx_internal_imp_t { #if defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) -#pragma detect_mismatch("_CRT_WINDOWS_mutex_size", "1") #ifdef _WIN64 static constexpr size_t _Critical_section_size = 16; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 8; #endif // ^^^ !defined(_WIN64) ^^^ -#else // ^^^ defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) / !defined(_CRT_WINDOWS) || - // defined(UNDOCKED_WINDOWS_UCRT) vvv -#pragma detect_mismatch("_CRT_WINDOWS_mutex_size", "0") +#else // ^^^ Windows private STL / public STL vvv #ifdef _WIN64 static constexpr size_t _Critical_section_size = 64; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 36; #endif // ^^^ !defined(_WIN64) ^^^ -#endif // ^^^ !defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) ^^^ +#endif // ^^^ public STL ^^^ static constexpr size_t _Critical_section_align = alignof(void*);