* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180549
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
// 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;
};
// { 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.
//