dejafu/README.markdown

72 lines
2.7 KiB
Markdown
Raw Normal View History

2015-01-31 18:50:54 +03:00
dejafu [![Build Status][build-status]][build-log]
======
2014-12-20 20:32:35 +03:00
2015-08-27 15:33:48 +03:00
> [Déjà Fu is] A martial art in which the user's limbs move in time as
> well as space, […] It is best described as "the feeling that you
> have been kicked in the head this way before"
>
> -- Terry Pratchett, Thief of Time
2014-12-20 20:32:35 +03:00
Concurrency is nice, deadlocks and race conditions not so much. The
`Par` monad family, as defined in [abstract-par][] provides
deterministic parallelism, but sometimes we can tolerate a bit of
nondeterminism.
2015-01-31 18:50:54 +03:00
This package provides a class of monads for potentially
2015-08-26 13:56:26 +03:00
nondeterministic concurrency, with an interface in the spirit of GHC's
normal concurrency abstraction.
2014-12-20 20:32:35 +03:00
2014-12-20 21:17:43 +03:00
The documentation of the latest developmental version is
[available online][docs].
2015-01-31 18:50:54 +03:00
`MonadConc` and `IO`
--------------------
2015-01-12 17:24:12 +03:00
2015-01-31 18:50:54 +03:00
The intention of the `MonadConc` class is to provide concurrency where
any apparent nondeterminism arises purely from the scheduling
behaviour. To put it another way, a given computation, parametrised
with a fixed set of scheduling decisions, is deterministic. This
assumption is used by the testing functionality provided by
Control.Monad.Conc.SCT.
2015-01-12 17:24:12 +03:00
Whilst this assumption may not hold in general when `IO` is involved,
you should strive to produce test cases where it does.
2015-10-01 18:40:31 +03:00
Memory Model
------------
The testing functionality supports a few different memory models, for
computations which use non-synchronised `CRef` operations. The
supported models are:
- **Sequential Consistency:** A program behaves as a simple
interleaving of the actions in different threads. When a CRef is
written to, that write is immediately visible to all threads.
- **Total Store Order (TSO):** Each thread has a write buffer. A
thread sees its writes immediately, but other threads will only
see writes when they are committed, which may happen later. Writes
are committed in the same order that they are created.
- **Partial Store Order (PSO):** Each CRef has a write buffer. A
thread sees its writes immediately, but other threads will only
see writes when they are committed, which may happen later. Writes
to different CRefs are not necessarily committed in the same order
that they are created.
If a testing function does not take the memory model as a parameter,
it uses sequential consistency.
2014-12-20 20:32:35 +03:00
Contributing
------------
Bug reports, pull requests, and comments are very welcome!
Feel free to contact me on GitHub, through IRC (#haskell on freenode),
or email (mike@barrucadu.co.uk).
2015-08-16 02:19:05 +03:00
[build-status]: http://ci.barrucadu.co.uk/job/(dejafu)/job/dejafu/badge/icon?style=plastic
[build-log]: http://ci.barrucadu.co.uk/job/(dejafu)/job/dejafu/
2015-01-31 18:50:54 +03:00
[docs]: https://barrucadu.github.io/dejafu
2015-07-19 06:39:48 +03:00
[abstract-par]: https://hackage.haskell.org/package/abstract-par/docs/Control-Monad-Par-Class.html