diff options
author | Nicolas Frisby <nicolas.frisby@gmail.com> | 2013-08-22 15:00:41 -0500 |
---|---|---|
committer | Nicolas Frisby <nicolas.frisby@gmail.com> | 2013-08-22 15:00:54 -0500 |
commit | 84f9927c1a04b8e35b97101771d8f6d625643d9b (patch) | |
tree | 050d7265a24fa1ff9aecc4081bb01bc444520587 /rts/STM.c | |
parent | 2eaf46fb1bb8c661c03f3e5e80622207ef2509d9 (diff) | |
parent | c24be4b761df558d9edc9c0b1554bb558c261b14 (diff) | |
download | haskell-late-dmd.tar.gz |
merged master into late-dmdlate-dmd
Diffstat (limited to 'rts/STM.c')
-rw-r--r-- | rts/STM.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -905,8 +905,12 @@ static StgBool check_read_only(StgTRecHeader *trec STG_UNUSED) { s = e -> tvar; if (entry_is_read_only(e)) { TRACE("%p : check_read_only for TVar %p, saw %ld", trec, s, e -> num_updates); - if (s -> num_updates != e -> num_updates) { - // ||s -> current_value != e -> expected_value) { + + // Note we need both checks and in this order as the TVar could be + // locked by another transaction that is committing but has not yet + // incremented `num_updates` (See #7815). + if (s -> current_value != e -> expected_value || + s -> num_updates != e -> num_updates) { TRACE("%p : mismatch", trec); result = FALSE; BREAK_FOR_EACH; |