aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2011-10-26 23:35:26 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2011-10-27 00:35:26 +0100
commit28c2f60e96a3dd100a85b32a91f7a1c0c408fd39 (patch)
tree4de7ba84aabea654f1cca3e126a6eb5536cacd38
parente7604cc480cbd0ab46d3e879fbab34a0fc702d7c (diff)
downloadgcc-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
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/std/condition_variable8
-rw-r--r--libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc1
3 files changed, 15 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 1a7d157..b7d9618 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-27 Jonathan Wakely <jwakely.gcc@gmail.com>
+
+ 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.
+
2011-10-25 Jonathan Wakely <jwakely.gcc@gmail.com>
* include/std/condition_variable (condition_variable_any): Remove
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;
};
diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc b/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc
index db2a5eb..9ca0086 100644
--- a/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc
+++ b/libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc
@@ -4,6 +4,7 @@
// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } }
// { dg-require-cstdint "" }
// { dg-require-gthreads "" }
+// { dg-require-sched-yield "" }
// Copyright (C) 2011 Free Software Foundation, Inc.
//