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;
 	}
     };
 
