[Haskell-cafe] what does "atomically#" mean?

Don Stewart dons at galois.com
Mon Dec 8 01:48:23 EST 2008


dmehrtash:
>    Any idea was the atomically# mean in the following code?
> 
>    atomically :: STM a -> IO a
>    atomically (STM m) = IO (\s -> (atomically# m) s )
> 
>    Code is from GHC.Conc module
>    [1]http://www.haskell.org/ghc/docs/6.6/html/libraries/base/GHC-Conc.html

It is a primitive hook into the runtime, where transactional memory is
implemented. 

It is documented in the primops module in the GHC source,

    $ cd ghc/compiler/prelude/

    ------------------------------------------------------------------------
    section "STM-accessible Mutable Variables"
    ------------------------------------------------------------------------

    primtype TVar# s a

    primop  AtomicallyOp "atomically#" GenPrimOp
          (State# RealWorld -> (# State# RealWorld, a #) )
       -> State# RealWorld -> (# State# RealWorld, a #)
       with
       out_of_line = True
       has_side_effects = True

    primop  RetryOp "retry#" GenPrimOp
       State# RealWorld -> (# State# RealWorld, a #)
       with 
       out_of_line = True
       has_side_effects = True


Along with other primitives like:

------------------------------------------------------------------------
section "Parallelism"
------------------------------------------------------------------------

    primop  ParOp "par#" GenPrimOp
       a -> Int#
       with
          -- Note that Par is lazy to avoid that the sparked thing
          -- gets evaluted strictly, which it should *not* be
       has_side_effects = True

-- Don


More information about the Haskell-Cafe mailing list