Or failed = 1; if ((res1 = lock(A) != 0) if ((res2 = lock(B) != 0) { if ((res3 = lock(C) != 0) { foo(res1, res2, res3); failed = 0; } if (res3 != 0) release(C); if (res2 != 0) release(B); if (res1 != 0) release(A); return failed; avoiding the goto. Further, if release(nil) is implemented as a noop you can have failed = 1; if ((res1 = lock(A) != 0) if ((res2 = lock(B) != 0) { if ((res3 = lock(C) != 0) { foo(res1, res2, res3); failed = 0; } release(C); release(B); release(A); return failed;