GHC/Prim/Ext.hs

    {-# LANGUAGE CPP #-}
    {-# LANGUAGE MagicHash #-}
    {-# LANGUAGE UnboxedTuples #-}
    {-# LANGUAGE NoImplicitPrelude #-}
    {-# LANGUAGE GHCForeignImportPrim #-}
    {-# LANGUAGE UnliftedFFITypes #-}

    -- We need platform defines (tests for mingw32 below).
    #include "ghcplatform.h"
    #include "MachDeps.h"

    -- See note [When do out-of-line primops go in primops.txt.pp]. More primops
    -- there are elgible according to the description below, but cannot yet be moved
    -- here because of superficial restrictions to `foreign import prim`. Hopefully
    -- that is fixed soon.

    -- | Extra C-- routines exposed from the RTS
    --
    -- Actual primops are emitted by the compiler itself. They are special bits of
    -- code with backend support. The foreign functions in this module aren't actual
    -- primops because the compiler doesn't care about them at all: they just are
    -- extra foreign C-- calls libraries can make into the RTS.
    --
    -- Note that 'GHC.Prim' has the same haddock section names as this module, but
    -- with descriptions. Consult that module's documentation for what each section means.
    -- are described over there.
    module GHC.Prim.Ext
      (
      -- 64-bit bit aliases
        INT64
      , WORD64
      -- * Delay\/wait operations
    #if defined(mingw32_HOST_OS)
      , asyncRead#
      , asyncWrite#
      , asyncDoProc#
    #endif
      -- * Misc
      , getThreadAllocationCounter#
      ) where

    import GHC.Prim
    import GHC.Types () -- Make implicit dependency known to build system

    default () -- Double and Integer aren't available yet

    ------------------------------------------------------------------------
    -- 64-bit bit aliases
    ------------------------------------------------------------------------

    type INT64 =
    #if WORD_SIZE_IN_BITS < 64
      Int64#
    #else
      Int#
    #endif

    type WORD64 =
    #if WORD_SIZE_IN_BITS < 64
      Word64#
    #else
      Word#
    #endif

    ------------------------------------------------------------------------
    -- Delay/wait operations
    ------------------------------------------------------------------------

    #if defined(mingw32_HOST_OS)

    -- | Asynchronously read bytes from specified file descriptor.
    foreign import prim "stg_asyncReadzh" asyncRead#
      :: Int#
      -> Int#
      -> Int#
      -> Addr#
      -> State# RealWorld
      -> (# State# RealWorld, Int#, Int# #)

    -- | Asynchronously write bytes from specified file descriptor.
    foreign import prim "stg_asyncWritezh" asyncWrite#
      :: Int#
      -> Int#
      -> Int#
      -> Addr#
      -> State# RealWorld
      -> (# State# RealWorld, Int#, Int# #)

    -- | Asynchronously perform procedure (first arg), passing it 2nd arg.
    foreign import prim "stg_asyncDoProczh" asyncDoProc#
      :: Addr#
      -> Addr#
      -> State# RealWorld
      -> (# State# RealWorld, Int#, Int# #)

    #endif

    ------------------------------------------------------------------------
    -- Misc
    ------------------------------------------------------------------------

    -- | Retrieves the allocation counter for the current thread.
    foreign import prim "stg_getThreadAllocationCounterzh" getThreadAllocationCounter#
      :: State# RealWorld
      -> (# State# RealWorld, INT64 #)