ghc-prim-0.8.0: 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 eligible 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 #)