From: Jonathan Wakely Date: Mon, 5 Dec 2022 12:39:23 +0000 (+0000) Subject: libstdc++: Add nodiscard attribute to mutex try_lock functions X-Git-Tag: basepoints/gcc-14~2683 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af177d7280668e5b21560165dc828754618e6621;p=thirdparty%2Fgcc.git libstdc++: Add nodiscard attribute to mutex try_lock functions libstdc++-v3/ChangeLog: * include/bits/std_mutex.h (mutex): Add nodiscard attribute to try_lock member function. * include/bits/unique_lock.h (unique_lock): Likewise for try_lock, try_lock_until, try_lock_for member functions, and owns_lock and mutex member functions. * include/std/mutex (recursive_mutex): Likewise for try_lock member function. (timed_mutex, recursive_timed_mutex, try_lock): Likewise for try_lock, try_lock_until, try_lock_for member functions. (try_lock): Likewise for non-member function. * include/std/shared_mutex (shared_mutex): Likewise for try_lock and try_lock_shared member functions. (shared_timed_mutex): Likewise for try_lock, try_lock_for, try_lock_shared, try_lock_shared_for, try_lock_until, and try_lock_shared_until member functions. (shared_lock): Likewise for try_lock, try_lock, try_lock_for, try_lock_until, owns_lock, and mutex member functions. * testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc: Cast discarded value expression to void. * testsuite/30_threads/shared_lock/locking/3.cc: Likewise. * testsuite/30_threads/shared_lock/locking/4.cc: Likewise. * testsuite/30_threads/shared_lock/locking/clock_neg.cc: Likewise. * testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc: Likewise. * testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc: Likewise. * testsuite/30_threads/try_lock/4.cc: Likewise. * testsuite/30_threads/unique_lock/cons/60497.cc: Likewise. * testsuite/30_threads/unique_lock/locking/3.cc: Likewise. * testsuite/30_threads/unique_lock/locking/clock_neg.cc: Likewise. --- diff --git a/libstdc++-v3/include/bits/std_mutex.h b/libstdc++-v3/include/bits/std_mutex.h index b22e0e127937..68f5fb9ed65b 100644 --- a/libstdc++-v3/include/bits/std_mutex.h +++ b/libstdc++-v3/include/bits/std_mutex.h @@ -117,6 +117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { diff --git a/libstdc++-v3/include/bits/unique_lock.h b/libstdc++-v3/include/bits/unique_lock.h index 9ed7ba257667..c6402d94e857 100644 --- a/libstdc++-v3/include/bits/unique_lock.h +++ b/libstdc++-v3/include/bits/unique_lock.h @@ -143,6 +143,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } } + _GLIBCXX_NODISCARD bool try_lock() { @@ -158,6 +159,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -173,6 +175,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -215,6 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __ret; } + _GLIBCXX_NODISCARD bool owns_lock() const noexcept { return _M_owns; } @@ -222,6 +226,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION explicit operator bool() const noexcept { return owns_lock(); } + _GLIBCXX_NODISCARD mutex_type* mutex() const noexcept { return _M_device; } diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index b310c15687d3..aca5f91e03c6 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -124,6 +124,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -253,6 +254,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -261,11 +263,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { return _M_try_lock_for(__rtime); } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { return _M_try_lock_until(__atime); } @@ -328,6 +332,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_system_error(__e); } + _GLIBCXX_NODISCARD bool try_lock() noexcept { @@ -336,11 +341,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { return _M_try_lock_for(__rtime); } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { return _M_try_lock_until(__atime); } @@ -395,6 +402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_locked = true; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -406,6 +414,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -417,6 +426,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -478,6 +488,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ++_M_count; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -494,6 +505,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -510,6 +522,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -616,6 +629,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * Sequentially calls try_lock() on each argument. */ template + _GLIBCXX_NODISCARD inline int try_lock(_L1& __l1, _L2& __l2, _L3&... __l3) { diff --git a/libstdc++-v3/include/std/shared_mutex b/libstdc++-v3/include/std/shared_mutex index cf74b32f1851..7b70697f1785 100644 --- a/libstdc++-v3/include/std/shared_mutex +++ b/libstdc++-v3/include/std/shared_mutex @@ -420,13 +420,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership void lock() { _M_impl.lock(); } - bool try_lock() { return _M_impl.try_lock(); } + [[nodiscard]] bool try_lock() { return _M_impl.try_lock(); } void unlock() { _M_impl.unlock(); } // Shared ownership void lock_shared() { _M_impl.lock_shared(); } - bool try_lock_shared() { return _M_impl.try_lock_shared(); } + [[nodiscard]] bool try_lock_shared() { return _M_impl.try_lock_shared(); } void unlock_shared() { _M_impl.unlock_shared(); } #if _GLIBCXX_USE_PTHREAD_RWLOCK_T @@ -473,10 +473,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership void lock() { _Base::lock(); } - bool try_lock() { return _Base::try_lock(); } + _GLIBCXX_NODISCARD bool try_lock() { return _Base::try_lock(); } void unlock() { _Base::unlock(); } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -489,10 +490,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership void lock_shared() { _Base::lock_shared(); } + _GLIBCXX_NODISCARD bool try_lock_shared() { return _Base::try_lock_shared(); } void unlock_shared() { _Base::unlock_shared(); } template + _GLIBCXX_NODISCARD bool try_lock_shared_for(const chrono::duration<_Rep, _Period>& __rtime) { @@ -507,6 +510,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point& __atime) @@ -532,6 +536,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef _GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point& __atime) @@ -558,6 +563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __atime) { @@ -580,6 +586,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point& __atime) @@ -619,6 +626,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef _GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point& __atime) @@ -645,6 +653,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #endif template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __atime) @@ -670,6 +679,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Exclusive ownership template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time) { @@ -694,6 +704,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Shared ownership template + _GLIBCXX_NODISCARD bool try_lock_shared_until(const chrono::time_point<_Clock, _Duration>& __abs_time) @@ -776,6 +787,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_owns = true; } + _GLIBCXX_NODISCARD bool try_lock() { @@ -784,6 +796,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_for(const chrono::duration<_Rep, _Period>& __rel_time) { @@ -792,6 +805,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } template + _GLIBCXX_NODISCARD bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __abs_time) { @@ -826,10 +840,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Getters + _GLIBCXX_NODISCARD bool owns_lock() const noexcept { return _M_owns; } explicit operator bool() const noexcept { return _M_owns; } + _GLIBCXX_NODISCARD mutex_type* mutex() const noexcept { return _M_pm; } private: diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc index 541bd19f3cfb..91f2c83be0d5 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::recursive_timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::recursive_timed_mutex m; - m.try_lock_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc index c7637d219930..8ad962baec3e 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/3.cc @@ -38,7 +38,7 @@ int main() try { - l.try_lock_for(std::chrono::milliseconds(100)); + (void) l.try_lock_for(std::chrono::milliseconds(100)); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc index 126098dfeac1..96388a1689dd 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/4.cc @@ -40,7 +40,7 @@ int main() try { - l.try_lock_until(t); + (void) l.try_lock_until(t); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc index 3a6373b59261..d6df66efb175 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_lock/locking/clock_neg.cc @@ -34,7 +34,7 @@ test01() { std::shared_timed_mutex m; std::shared_lock l(m, std::defer_lock); - l.try_lock_until(clok::now()); // { dg-error "here" } + (void) l.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -53,7 +53,7 @@ test02() { std::shared_timed_mutex m; std::shared_lock l(m, std::defer_lock); - l.try_lock_until(cloc::now()); // { dg-error "here" } + (void) l.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc index ac401235f6c1..f948101a884d 100644 --- a/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/shared_timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::shared_timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::shared_timed_mutex m; - m.try_lock_shared_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_shared_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc index 36424747b4dc..71c83c514bce 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/clock_neg.cc @@ -33,7 +33,7 @@ void test01() { std::timed_mutex m; - m.try_lock_until(clok::now()); // { dg-error "here" } + (void) m.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -51,7 +51,7 @@ void test02() { std::timed_mutex m; - m.try_lock_until(cloc::now()); // { dg-error "here" } + (void) m.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/30_threads/try_lock/4.cc b/libstdc++-v3/testsuite/30_threads/try_lock/4.cc index cfb5a74734fe..96afa55a68d8 100644 --- a/libstdc++-v3/testsuite/30_threads/try_lock/4.cc +++ b/libstdc++-v3/testsuite/30_threads/try_lock/4.cc @@ -125,7 +125,7 @@ void test03() unreliable_lock::count = 0; try { - std::try_lock(l1, l2, l3); + (void) std::try_lock(l1, l2, l3); VERIFY( false ); } catch (int e) diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc index c3cb6214d639..a8a8db4318a4 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/cons/60497.cc @@ -50,5 +50,5 @@ void test02() void test03() { test_type l1, l2, l3; - std::try_lock(l1, l2, l3); + (void) std::try_lock(l1, l2, l3); } diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc index 3cb787b31542..ecc5b82f1c16 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc @@ -38,7 +38,7 @@ int main() try { - l.try_lock_for(std::chrono::milliseconds(100)); + (void) l.try_lock_for(std::chrono::milliseconds(100)); } catch(const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc index 68157f6ad263..b633e5fcc583 100644 --- a/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/unique_lock/locking/clock_neg.cc @@ -34,7 +34,7 @@ test01() { std::timed_mutex m; std::unique_lock l(m, std::defer_lock); - l.try_lock_until(clok::now()); // { dg-error "here" } + (void) l.try_lock_until(clok::now()); // { dg-error "here" } } struct cloc @@ -53,7 +53,7 @@ test02() { std::recursive_timed_mutex m; std::unique_lock l(m, std::defer_lock); - l.try_lock_until(cloc::now()); // { dg-error "here" } + (void) l.try_lock_until(cloc::now()); // { dg-error "here" } } // { dg-error "static assertion failed" "" { target *-*-* } 0 }