Consider implementing atomicModifyMutVar# in Haskell
I believe we could implement atomicModifyMutVar#
in Haskell, rather than making it a primop. This seems like a simpler/cleaner approach (among other things, it gets a perfectly legitimate type signature!), but we'd have to see how it affects performance. I think something like this should work:
atomicModifyMutVar# :: MutVar# s a -> (a -> (a,b)) -> State# s -> (# State# s, b #)
atomicModifyMutVar# mv f s =
case readMutVar# mv s of { (# s', old #) ->
let f_old = f old in
case casMutVar# mv old (fst $ f_old) s of { (# s', unchanged, new #) ->
case unchanged of
0# -> (# s', snd f_old #)
_ -> atomicModifyMutVar# mv f s' }}
Trac metadata
Trac field | Value |
---|---|
Version | 8.2.1-rc2 |
Type | Task |
TypeOfFailure | OtherFailure |
Priority | low |
Resolution | Unresolved |
Component | Runtime System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |