acid-state 0.8.0 → 0.8.1
raw patch · 3 files changed
+15/−20 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- acid-state.cabal +1/−1
- examples/RemoteServer.hs +1/−7
- src/Data/Acid/Memory.hs +13/−12
acid-state.cabal view
@@ -7,7 +7,7 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented.-Version: 0.8.0+Version: 0.8.1 -- A short (one-line) description of the package. Synopsis: Add ACID guarantees to any serializable Haskell data structure.
examples/RemoteServer.hs view
@@ -2,7 +2,6 @@ module Main (main) where import Data.Acid-import Data.Acid.Local import Data.Acid.Remote (acidServer) import Control.Exception (bracket)@@ -17,11 +16,6 @@ main :: IO () main = bracket- (do putStrLn "Loading checkpoint"- mkAcid <- prepareLocalState $ StressState 0- putStrLn "Waiting for lock/replaying events"- acid <- mkAcid- putStrLn "Done."- return acid)+ (openLocalState $ StressState 0) closeAcidState (\s -> acidServer s (PortNumber 8080))
src/Data/Acid/Memory.hs view
@@ -7,7 +7,7 @@ -- Maintainer : lemmih@gmail.com -- Portability : non-portable (uses GHC extensions) ----- AcidState container without a transaction log. Mostly used for testing. +-- AcidState container without a transaction log. Mostly used for testing. -- module Data.Acid.Memory@@ -22,6 +22,7 @@ import Control.Monad.State ( runState ) import Data.ByteString.Lazy ( ByteString ) import Data.Typeable ( Typeable )+import Data.IORef ( IORef, newIORef, readIORef, writeIORef ) import Data.SafeCopy ( SafeCopy(..) ) @@ -41,6 +42,7 @@ -} data MemoryState st = MemoryState { localCore :: Core st+ , localCopy :: IORef st } deriving (Typeable) -- | Create an AcidState given an initial value.@@ -49,7 +51,8 @@ -> IO (AcidState st) openMemoryState initialState = do core <- mkCore (eventsToMethods acidEvents) initialState- return $ toAcidState MemoryState { localCore = core }+ ref <- newIORef initialState+ return $ toAcidState MemoryState { localCore = core, localCopy = ref } -- | Issue an Update event and return immediately. The event is not durable@@ -67,6 +70,7 @@ = do mvar <- newEmptyMVar modifyCoreState_ (localCore acidState) $ \st -> do let !(result, !st') = runState hotMethod st+ writeIORef (localCopy acidState) st' putMVar mvar result return st' return mvar@@ -77,6 +81,7 @@ = do mvar <- newEmptyMVar modifyCoreState_ (localCore acidState) $ \st -> do let !(result, !st') = runState coldMethod st+ writeIORef (localCopy acidState) st' putMVar mvar result return st' return mvar@@ -85,20 +90,16 @@ -- | Issue a Query event and wait for its result. Events may be issued in parallel. memoryQuery :: QueryEvent event => MemoryState (EventState event) -> event -> IO (EventResult event) memoryQuery acidState event- = do mvar <- newEmptyMVar- withCoreState (localCore acidState) $ \st ->- do let (result, _st) = runState hotMethod st- putMVar mvar result- takeMVar mvar+ = do st <- readIORef (localCopy acidState)+ let (result, _st) = runState hotMethod st+ return result where hotMethod = lookupHotMethod (coreMethods (localCore acidState)) event memoryQueryCold :: MemoryState st -> Tagged ByteString -> IO ByteString memoryQueryCold acidState event- = do mvar <- newEmptyMVar- withCoreState (localCore acidState) $ \st ->- do let (result, _st) = runState coldMethod st- putMVar mvar result- takeMVar mvar+ = do st <- readIORef (localCopy acidState)+ let (result, _st) = runState coldMethod st+ return result where coldMethod = lookupColdMethod (localCore acidState) event -- | This is a nop with the memory backend.