[GHC] #7930: Nested STM Invariants are lost

GHC cvs-ghc at haskell.org
Mon May 27 19:30:10 CEST 2013


#7930: Nested STM Invariants are lost
---------------------------------+------------------------------------------
    Reporter:  fryguybob         |       Owner:  fryguybob                  
        Type:  bug               |      Status:  new                        
    Priority:  normal            |   Milestone:                             
   Component:  Runtime System    |     Version:  7.6.3                      
    Keywords:  STM               |          Os:  Unknown/Multiple           
Architecture:  Unknown/Multiple  |     Failure:  Incorrect result at runtime
  Difficulty:  Unknown           |    Testcase:                             
   Blockedby:                    |    Blocking:                             
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by timharris):

 Hi -- here are some comments I sent Simon earlier.  I do not usually use
 Trac, but feel free to contact me on e-mail, tim.harris at gmail.com

  --Tim



 The initial comment re invariants_to_check sounds correct.  I think we
 added nested transactions after adding invariants.  I don't remember
 thinking about the interaction before, but retaining the invariants
 from within a nested transactions sounds correct (since, in the
 absence of exceptions in X, I would expect catch X Y to behave like
 X).

 The other cases are more complex.  I don't think the descriptions I
 wrote for the functions are very clear.  e.g., for alwaysSucceeds,
 exactly what it means for an invariant to be true (Returns true?  Does
 not throw?  Does not retry?  What if it loops?)

 I think the bug report's authors understand all these problems.  I'd
 probably go back to the semantics in Fig 4 of
 http://timharris.co.uk/papers/2006-transact.pdf and write the
 functions descriptions again based on that, and then fix up the code
 as necessary.  "check X" in the semantics is intended to be "always X"
 in the code.  "check X" will throw if X throws, and retry if X
 retries.  It tests X in this way immediately, and then again on the
 commit of each transaction (including the current one).  I don't think
 the current code implements this correctly.

 With "always X" fixed, I'd then define "alwaysSucceeds X" in terms of
 "always" rather than vice-versa.  (I think it should just be always (
 X >> return true).)

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7930#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list