From d71d19731f593d6d09d7cb982f0cde46d07787d1 Mon Sep 17 00:00:00 2001
From: Ian Lynagh <ian@well-typed.com>
Date: Thu, 3 Jan 2013 22:34:21 +0000
Subject: [PATCH] Revert "MERGED: Fix a bug in the handling of nested orElse"

This reverts commit 5ea49271f793ed0f872342bf6a1cb0de10a48d94.
---
 rts/STM.c | 24 +++---------------------
 1 file changed, 3 insertions(+), 21 deletions(-)

diff --git a/rts/STM.c b/rts/STM.c
index b9883589925b..f8f56a29056c 100644
--- a/rts/STM.c
+++ b/rts/STM.c
@@ -1447,28 +1447,10 @@ StgBool stmCommitNestedTransaction(Capability *cap, StgTRecHeader *trec) {
 	
 	StgTVar *s;
 	s = e -> tvar;
-
-    // Careful! We might have a read entry here that we don't want
-    // to spam over the update entry in the enclosing TRec.  e.g. in
-    //
-    //   t <- newTVar 1
-    //   writeTVar t 2
-    //   ((readTVar t >> retry) `orElse` return ()) `orElse` return ()
-    //
-    // - the innermost txn first aborts, giving us a read-only entry
-    //   with e->expected_value == e->new_value == 1
-    // - the inner orElse commits into the outer orElse, which
-    //   lands us here.  If we unconditionally did
-    //   merge_update_into(), then we would overwrite the outer
-    //   TRec's update, so we must check whether the entry is an
-    //   update or not, and if not, just do merge_read_into.
-    //
-    if (entry_is_update(e)) {
+	if (entry_is_update(e)) {
 	  unlock_tvar(trec, s, e -> expected_value, FALSE);
-	  merge_update_into(cap, et, s, e -> expected_value, e -> new_value);
-    } else {
-	  merge_read_into(cap, et, s, e -> expected_value);
-    }
+	}
+	merge_update_into(cap, et, s, e -> expected_value, e -> new_value);
 	ACQ_ASSERT(s -> current_value != (StgClosure *)trec);
       });
     } else {
-- 
GitLab