module Foreign.CUDA.Driver.Stream (
Stream(..), StreamFlag,
create, destroy, finished, block
) where
import Foreign.CUDA.Driver.Error
import Foreign.CUDA.Internal.C2HS
import Foreign
import Foreign.C
import Control.Monad (liftM)
newtype Stream = Stream { useStream :: ((Ptr ()))}
deriving (Eq, Show)
data StreamFlag
instance Enum StreamFlag where
create :: [StreamFlag] -> IO Stream
create !flags = resultIfOk =<< cuStreamCreate flags
cuStreamCreate :: ([StreamFlag]) -> IO ((Status), (Stream))
cuStreamCreate a2 =
alloca $ \a1' ->
let {a2' = combineBitMasks a2} in
cuStreamCreate'_ a1' a2' >>= \res ->
let {res' = cToEnum res} in
peekStream a1'>>= \a1'' ->
return (res', a1'')
where peekStream = liftM Stream . peek
destroy :: Stream -> IO ()
destroy !st = nothingIfOk =<< cuStreamDestroy st
cuStreamDestroy :: (Stream) -> IO ((Status))
cuStreamDestroy a1 =
let {a1' = useStream a1} in
cuStreamDestroy'_ a1' >>= \res ->
let {res' = cToEnum res} in
return (res')
finished :: Stream -> IO Bool
finished !st =
cuStreamQuery st >>= \rv ->
case rv of
Success -> return True
NotReady -> return False
_ -> resultIfOk (rv,undefined)
cuStreamQuery :: (Stream) -> IO ((Status))
cuStreamQuery a1 =
let {a1' = useStream a1} in
cuStreamQuery'_ a1' >>= \res ->
let {res' = cToEnum res} in
return (res')
block :: Stream -> IO ()
block !st = nothingIfOk =<< cuStreamSynchronize st
cuStreamSynchronize :: (Stream) -> IO ((Status))
cuStreamSynchronize a1 =
let {a1' = useStream a1} in
cuStreamSynchronize'_ a1' >>= \res ->
let {res' = cToEnum res} in
return (res')
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamCreate"
cuStreamCreate'_ :: ((Ptr (Ptr ())) -> (CUInt -> (IO CInt)))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamDestroy"
cuStreamDestroy'_ :: ((Ptr ()) -> (IO CInt))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamQuery"
cuStreamQuery'_ :: ((Ptr ()) -> (IO CInt))
foreign import ccall unsafe "Foreign/CUDA/Driver/Stream.chs.h cuStreamSynchronize"
cuStreamSynchronize'_ :: ((Ptr ()) -> (IO CInt))