David Roundy wrote:
A simple primitive to do this (in combination with a totally
rewritten STM runtime) would be

subatomically :: ReadOnlySTM a -> STM ()

which would run a STM computation that is guaranteed to have no side-effects (i.e. can't write to TVars) and ignore its results (and
let the runtime know that the results have been ignored).

Matthew Brecknell wrote:
Nevertheless, the distinction between read-only and read-write transactions does not necessarily have to occur at the level of
types. STM is fundamentally a dynamic approach to concurrency
control, so I think it would make sense for transactions to
*dynamically* determine whether they are read-only or read-write, as
they compose with each other.

In that case, we can treat subatomic as a "hint" to the STM runtime.

subatomic :: STM a -> STM ()

Concerning this question of whether the argument to  subatomic  should
statically or dynamically be known to be read-only, there is also the
option of collapsing  ReadOnlySTM a  and  STM a  by changing the
semantics of  writeTVar .

I mean,  writeTVar  can be used for two different things:

  1) communicate with other threads, i.e. crossing
       atomically  boundaries
  2) communicating inside a single thread/STM action
     à la mutable state (IORef).

We only want 1), but 2) is expendable, we can always use parameters to
pass state around or wrap the whole thing into a state monad. For 1),
it's enough to have a primitive

  scheduleWriteTVar :: TVar a -> a -> STM ()

that ensures to write the TVar at the very end of the  atomically
block. (This is similar to  scheduleIO :: IO a -> STM ()).


In other words, the current  STM  semantics can be implemented in terms
of  ReadOnlySTM  assuming that the latter has such a primitive for
scheduling.

  type ReadOnlySTM a = StateT TVarEnvironment STM a


Regards,
apfelmus

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to