Index: include/std/mutex =================================================================== --- include/std/mutex (revision 167396) +++ include/std/mutex (working copy) @@ -663,16 +663,19 @@ _GLIBCXX_BEGIN_NAMESPACE(std) static int __do_try_lock(tuple<_Lock&...>& __locks) { - if(std::get<_Idx>(__locks).try_lock()) - { - return __try_lock_impl<_Idx + 1, - _Idx + 2 < sizeof...(_Lock)>::__do_try_lock(__locks); - } - else - { - __unlock_impl<_Idx>::__do_unlock(__locks); - return _Idx; - } + __try + { + if(std::get<_Idx>(__locks).try_lock()) + { + return __try_lock_impl<_Idx + 1, + _Idx + 2 < sizeof...(_Lock)>::__do_try_lock(__locks); + } + } + __catch(...) + { + } + __unlock_impl<_Idx - 1>::__do_unlock(__locks); + return _Idx; } }; @@ -683,13 +686,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std) static int __do_try_lock(tuple<_Lock&...>& __locks) { - if(std::get<_Idx>(__locks).try_lock()) - return -1; - else + __try + { + if(std::get<_Idx>(__locks).try_lock()) + return -1; + } + __catch(...) { - __unlock_impl<_Idx>::__do_unlock(__locks); - return _Idx; } + __unlock_impl<_Idx - 1>::__do_unlock(__locks); + return _Idx; } };