From f286e3c8286714ac5c9053693f6d9a9fe86a4e15 Mon Sep 17 00:00:00 2001 From: cpplearner Date: Sat, 6 Dec 2025 08:37:15 +0800 Subject: [PATCH] ``: Use `if constexpr` for `std::lock`&`std::try_lock` --- stl/inc/mutex | 65 +++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/stl/inc/mutex b/stl/inc/mutex index bebb43c264e..dfb23158dc4 100644 --- a/stl/inc/mutex +++ b/stl/inc/mutex @@ -343,30 +343,25 @@ int _Try_lock_range(const int _First, const int _Last, _LockN&... _LkN) { return -1; } -template -int _Try_lock1(_Lock0& _Lk0, _Lock1& _Lk1, _Lock2& _Lk2, _LockN&... _LkN) { // try to lock 3 or more locks - return _Try_lock_range(0, sizeof...(_LockN) + 3, _Lk0, _Lk1, _Lk2, _LkN...); -} +_EXPORT_STD template +_NODISCARD_TRY_CHANGE_STATE int try_lock(_Lock0& _Lk0, _Lock1& _Lk1, _LockN&... _LkN) { // try to lock multiple locks + if constexpr (sizeof...(_LockN) == 0) { + // try to lock 2 locks, special case for better codegen and reduced metaprogramming for common case + if (!_Lk0.try_lock()) { + return 0; + } -template -int _Try_lock1(_Lock0& _Lk0, _Lock1& _Lk1) { - // try to lock 2 locks, special case for better codegen and reduced metaprogramming for common case - if (!_Lk0.try_lock()) { - return 0; - } + _Unlock_one_guard<_Lock0> _Guard{_Lk0}; + if (!_Lk1.try_lock()) { + return 1; + } - _Unlock_one_guard<_Lock0> _Guard{_Lk0}; - if (!_Lk1.try_lock()) { - return 1; + _Guard._Lk_ptr = nullptr; + return -1; + } else { + // try to lock 3 or more locks + return _Try_lock_range(0, sizeof...(_LockN) + 2, _Lk0, _Lk1, _LkN...); } - - _Guard._Lk_ptr = nullptr; - return -1; -} - -_EXPORT_STD template -_NODISCARD_TRY_CHANGE_STATE int try_lock(_Lock0& _Lk0, _Lock1& _Lk1, _LockN&... _LkN) { // try to lock multiple locks - return _Try_lock1(_Lk0, _Lk1, _LkN...); } template @@ -399,15 +394,6 @@ int _Lock_attempt(const int _Hard_lock, _LockN&... _LkN) { return _Failed; } -template -void _Lock_nonmember1(_Lock0& _Lk0, _Lock1& _Lk1, _Lock2& _Lk2, _LockN&... _LkN) { - // lock 3 or more locks, without deadlock - int _Hard_lock = 0; - while (_Hard_lock != -1) { - _Hard_lock = _Lock_attempt(_Hard_lock, _Lk0, _Lk1, _Lk2, _LkN...); - } -} - template bool _Lock_attempt_small(_Lock0& _Lk0, _Lock1& _Lk1) { // attempt to lock 2 locks, by first locking _Lk0, and then trying to lock _Lk1 returns whether to try again @@ -424,16 +410,19 @@ bool _Lock_attempt_small(_Lock0& _Lk0, _Lock1& _Lk1) { return true; } -template -void _Lock_nonmember1(_Lock0& _Lk0, _Lock1& _Lk1) { - // lock 2 locks, without deadlock, special case for better codegen and reduced metaprogramming for common case - while (_Lock_attempt_small(_Lk0, _Lk1) && _Lock_attempt_small(_Lk1, _Lk0)) { // keep trying - } -} - _EXPORT_STD template void lock(_Lock0& _Lk0, _Lock1& _Lk1, _LockN&... _LkN) { // lock multiple locks, without deadlock - _Lock_nonmember1(_Lk0, _Lk1, _LkN...); + if constexpr (sizeof...(_LockN) == 0) { + // lock 2 locks, without deadlock, special case for better codegen and reduced metaprogramming for common case + while (_Lock_attempt_small(_Lk0, _Lk1) && _Lock_attempt_small(_Lk1, _Lk0)) { // keep trying + } + } else { + // lock 3 or more locks, without deadlock + int _Hard_lock = 0; + while (_Hard_lock != -1) { + _Hard_lock = _Lock_attempt(_Hard_lock, _Lk0, _Lk1, _LkN...); + } + } } _EXPORT_STD template