rcu 0.2.2 → 0.2.3
raw patch · 6 files changed
+41/−11 lines, 6 filesdep +fail
Dependencies added: fail
Files
- CHANGELOG.markdown +7/−0
- README.markdown +1/−1
- rcu.cabal +9/−4
- src/Control/Concurrent/RCU/GC/Internal.hs +9/−3
- src/Control/Concurrent/RCU/QSBR/Internal.hs +9/−2
- unstable/Control/Concurrent/RCU/STM/Internal.hs +6/−1
CHANGELOG.markdown view
@@ -1,16 +1,23 @@+## 0.2.3 [2018.08.01]+---------------------+* Add `MonadFail` instances for `ReadingRCU` and `WritingRCU`.+ ## 0.2.2 [2018.02.06] --------------------- * Include `HLint.hs` with the tarball distribution, fixing the `hlint` test suite. ## 0.2.1+-------- * Support `doctest-0.12` ## 0.2+------ * Revamp `Setup.hs` to use `cabal-doctest`. This makes it build with `Cabal-2.0`, and makes the `doctest`s work with `cabal new-build` and sandboxes. ## 0+---- * Initial version
README.markdown view
@@ -2,7 +2,7 @@ [](https://hackage.haskell.org/package/rcu) [](http://travis-ci.org/ekmett/rcu) -This package is an exploration of Read-Copy Update in Haskell based on [Relativistic Programming in Haskell](http://web.cecs.pdx.edu/~walpole/papers/haskell2015.pdf) by Cooper and Walpole. It includes a sound QSBR-based implementation and an attempt at an STM-based implementation.+This package is an exploration of Read-Copy Update in Haskell based on [Relativistic Programming in Haskell](http://web.cecs.pdx.edu/~theod/papers/haskell2015.pdf) by Cooper and Walpole. It includes a sound QSBR-based implementation and an attempt at an STM-based implementation. In the spirit of [A Relativistic Enhancement to Software Transactional Memory](https://www.usenix.org/legacy/events/hotpar11/tech/final_files/Howard.pdf) by Howard and Walpole, we could extend the STM implementation to allow reads and writes on the same data in parallel, writes to disjoint data in parallel, and force readers to agree that writes before a `synchronize` happened before writes after it.
rcu.cabal view
@@ -1,6 +1,6 @@ name: rcu category: Data-version: 0.2.2+version: 0.2.3 license: BSD3 cabal-version: >= 1.22 license-file: LICENSE@@ -11,7 +11,11 @@ bug-reports: http://github.com/ekmett/rcu/issues copyright: Copyright (C) 2015 Edward A. Kmett, Theodore Rhys Cooper build-type: Custom-tested-with: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1+tested-with: GHC == 7.10.3+ , GHC == 8.0.2+ , GHC == 8.2.2+ , GHC == 8.4.3+ , GHC == 8.6.1 synopsis: Read-Copy-Update for Haskell description: Read-Copy-Update for Haskell. @@ -57,6 +61,7 @@ build-depends: atomic-primops >= 0.8, base >= 4.8 && < 5,+ fail == 4.9.*, ghc-prim >= 0.3, parallel >= 3.2 && < 3.3, primitive >= 0.6,@@ -80,7 +85,7 @@ if flag(unstable) hs-source-dirs: unstable- build-depends: stm >= 2.4.4 && < 2.5+ build-depends: stm >= 2.4.4 && < 2.6 exposed-modules: Control.Concurrent.RCU.STM Control.Concurrent.RCU.STM.Internal@@ -463,7 +468,7 @@ else build-depends: base >= 4.8,- doctest >= 0.11.1 && < 0.14,+ doctest >= 0.11.1 && < 0.17, parallel, rcu
src/Control/Concurrent/RCU/GC/Internal.hs view
@@ -52,7 +52,7 @@ import Data.Primitive import Prelude hiding (Read(..)) import System.Mem-+import qualified Control.Monad.Fail as Fail -------------------------------------------------------------------------------- -- * Shared References@@ -140,8 +140,11 @@ ReadingRCU m >>= f = ReadingRCU $ \ s -> do a <- m s runReadingRCU (f a) s- fail s = ReadingRCU $ \ _ -> fail s+ fail = Fail.fail +instance Fail.MonadFail (ReadingRCU s) where+ fail s = ReadingRCU $ \ _ -> Fail.fail s+ instance Alternative (ReadingRCU s) where empty = ReadingRCU $ \ _ -> empty ReadingRCU ma <|> ReadingRCU mb = ReadingRCU $ \s -> ma s <|> mb s@@ -174,7 +177,10 @@ WritingRCU m >>= f = WritingRCU $ \ s -> do a <- m s runWritingRCU (f a) s- fail s = WritingRCU $ \ _ -> fail s+ fail = Fail.fail++instance Fail.MonadFail (WritingRCU s) where+ fail s = WritingRCU $ \ _ -> Fail.fail s instance Alternative (WritingRCU s) where empty = WritingRCU $ \ _ -> empty
src/Control/Concurrent/RCU/QSBR/Internal.hs view
@@ -53,6 +53,7 @@ import Data.List import Data.Primitive import Foreign+import qualified Control.Monad.Fail as Fail import Prelude hiding (Read(..)) @@ -149,8 +150,11 @@ ReadingRCU m >>= f = ReadingRCU $ \ s -> do a <- m s runReadingRCU (f a) s- fail s = ReadingRCU $ \ _ -> fail s+ fail = Fail.fail +instance Fail.MonadFail (ReadingRCU s) where+ fail s = ReadingRCU $ \ _ -> Fail.fail s+ instance Alternative (ReadingRCU s) where empty = ReadingRCU $ \ _ -> empty ReadingRCU ma <|> ReadingRCU mb = ReadingRCU $ \s -> ma s <|> mb s@@ -183,7 +187,10 @@ WritingRCU m >>= f = WritingRCU $ \ s -> do a <- m s runWritingRCU (f a) s- fail s = WritingRCU $ \ _ -> fail s+ fail = Fail.fail++instance Fail.MonadFail (WritingRCU s) where+ fail s = WritingRCU $ \ _ -> Fail.fail s instance Alternative (WritingRCU s) where empty = WritingRCU $ \ _ -> empty
unstable/Control/Concurrent/RCU/STM/Internal.hs view
@@ -38,6 +38,7 @@ import Data.Coerce import Data.Int import Prelude hiding (read, Read)+import qualified Control.Monad.Fail as Fail -------------------------------------------------------------------------------- -- * Shared References@@ -52,7 +53,8 @@ -------------------------------------------------------------------------------- -- | This is the basic read-side critical section for an RCU computation-newtype ReadingRCU s a = ReadingRCU { runReadingRCU :: IO a } deriving (Functor, Applicative, Monad)+newtype ReadingRCU s a = ReadingRCU { runReadingRCU :: IO a }+ deriving (Functor, Applicative, Monad, Fail.MonadFail) instance MonadNew (SRef s) (ReadingRCU s) where newSRef = r where@@ -82,6 +84,9 @@ WritingRCU m >>= f = WritingRCU $ \ c -> do a <- m c runWritingRCU (f a) c+ fail = Fail.fail++instance Fail.MonadFail (WritingRCU s) where fail s = WritingRCU $ \ _ -> fail s instance Alternative (WritingRCU s) where