Revert "Fix a bug in the handling of nested orElse"
authorSimon Marlow <marlowsd@gmail.com>
Tue, 18 Dec 2012 08:43:29 +0000 (08:43 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 18 Dec 2012 08:43:29 +0000 (08:43 +0000)
This reverts commit f184d9caffa09750ef6a374a7987b9213d6db28e.

The next commit will fix it in a better way.

rts/STM.c

index e7232b7..0a4d0b2 100644 (file)
--- a/rts/STM.c
+++ b/rts/STM.c
@@ -1460,28 +1460,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(cap, 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 {