diff options
author | Jonathan Wakely <jwakely.gcc@gmail.com> | 2011-10-26 23:35:26 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2011-10-27 00:35:26 +0100 |
commit | 28c2f60e96a3dd100a85b32a91f7a1c0c408fd39 (patch) | |
tree | 4de7ba84aabea654f1cca3e126a6eb5536cacd38 /libstdc++-v3/include/std/condition_variable | |
parent | e7604cc480cbd0ab46d3e879fbab34a0fc702d7c (diff) | |
download | gcc-28c2f60e96a3dd100a85b32a91f7a1c0c408fd39.zip gcc-28c2f60e96a3dd100a85b32a91f7a1c0c408fd39.tar.gz gcc-28c2f60e96a3dd100a85b32a91f7a1c0c408fd39.tar.bz2 |
re PR libstdc++/50862 (deadlock in std::condition_variable_any)
PR libstdc++/50862
* include/std/condition_variable (condition_variable_any::wait): Avoid
terminating if relocking user mutex throws during stack-unwinding.
* testsuite/30_threads/condition_variable_any/50862.cc: Add dg-require.
From-SVN: r180549
Diffstat (limited to 'libstdc++-v3/include/std/condition_variable')
-rw-r--r-- | libstdc++-v3/include/std/condition_variable | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/condition_variable b/libstdc++-v3/include/std/condition_variable index efc4a64..c4e2080 100644 --- a/libstdc++-v3/include/std/condition_variable +++ b/libstdc++-v3/include/std/condition_variable @@ -205,7 +205,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // scoped unlock - unlocks in ctor, re-locks in dtor struct _Unlock { explicit _Unlock(_Lock& __lk) : _M_lock(__lk) { __lk.unlock(); } - ~_Unlock() { _M_lock.lock(); } + ~_Unlock() noexcept(false) + { + if (uncaught_exception()) + __try { _M_lock.lock(); } __catch(...) { } + else + _M_lock.lock(); + } _Lock& _M_lock; }; |