----------------------------------------------------------------------------- -- | -- Module : Control.Concurrent.SHFSTM.Internal.TransactionLog -- Copyright : (c) D. Sabel, Goethe-University, Frankfurt a.M., Germany -- License : BSD-style -- -- Maintainer : sabel ki.cs.uni-frankfurt.de -- Stability : experimental -- Portability : non-portable (needs GHC and extensions) -- -- -- This module implements the transaction log ----------------------------------------------------------------------------- module Control.Concurrent.STM.Internal.TransactionLog ( TLOG(..), Log(..), emptyTLOG ) where import Control.Concurrent.STM.Internal.TVar import Control.Concurrent.STM.Internal.Set as Set import Data.IORef -- | The transaction log 'TLOG' of a thread -- for easy updates it is packed into a pointer newtype TLOG = TLOG (IORef Log) -- | The 'Log' stores several lists -- it only stores 'TVarAny's data Log = Log { -- | List T, the read TVars readTVars :: Set TVarAny -- | A stack of tripels (La,Ln,Lw) where -- -- La = all local tvars, -- -- Ln = new local tvars, -- -- Lw = locally written TVars , tripelStack :: [(Set TVarAny, Set TVarAny,Set TVarAny)] -- | List K , lockingSet :: Set TVarAny } -- | 'emptyTLOG' constructs an empty transaction log of type 'TLOG' emptyTLOG :: IO TLOG emptyTLOG = do p <- newIORef (Log Set.empty [(Set.empty,Set.empty,Set.empty)] Set.empty) return (TLOG p)