diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-04 18:50:20 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-08-04 18:50:20 +0000 |
| commit | c8c43ed8f2731f8c5334d78fb5b8ab96d6300fc6 (patch) | |
| tree | f187eda81aac142b82cbbc16224c74c511baee72 /libstdc++-v3/include/std/condition_variable | |
| parent | 690caa23c800e0f2cae97cec7af937f29f1e2d63 (diff) | |
| download | ppe42-gcc-c8c43ed8f2731f8c5334d78fb5b8ab96d6300fc6.tar.gz ppe42-gcc-c8c43ed8f2731f8c5334d78fb5b8ab96d6300fc6.zip | |
Backported from mainline
2014-06-02 Jonathan Wakely <jwakely@redhat.com>
* include/std/condition_variable (condition_variable_any::_Unlock): Do
not swallow __forced_unwind.
* include/std/future (__future_base::_Task_setter): Likewise.
(__future_base::_Async_state_impl): Turn __forced_unwind into broken
promise and rethrow.
* include/std/mutex (try_lock): Likewise.
* testsuite/30_threads/async/forced_unwind.cc: New.
* testsuite/30_threads/packaged_task/forced_unwind.cc: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@213602 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/std/condition_variable')
| -rw-r--r-- | libstdc++-v3/include/std/condition_variable | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libstdc++-v3/include/std/condition_variable b/libstdc++-v3/include/std/condition_variable index fc111dd3d37..921cb837de9 100644 --- a/libstdc++-v3/include/std/condition_variable +++ b/libstdc++-v3/include/std/condition_variable @@ -189,7 +189,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ~_Unlock() noexcept(false) { if (uncaught_exception()) - __try { _M_lock.lock(); } __catch(...) { } + { + __try + { _M_lock.lock(); } + __catch(const __cxxabiv1::__forced_unwind&) + { __throw_exception_again; } + __catch(...) + { } + } else _M_lock.lock(); } |

