module Graphics.UI.SDL.Thread (
createThread,
detachThread,
getThreadID,
getThreadName,
setThreadPriority,
tlsCreate,
tlsGet,
tlsSet,
threadID,
waitThread,
condBroadcast,
condSignal,
condWait,
condWaitTimeout,
createCond,
createMutex,
createSemaphore,
destroyCond,
destroyMutex,
destroySemaphore,
lockMutex,
semPost,
semTryWait,
semValue,
semWait,
semWaitTimeout,
tryLockMutex,
unlockMutex,
atomicAdd,
atomicCAS,
atomicCASPtr,
atomicDecRef,
atomicGet,
atomicGetPtr,
atomicIncRef,
atomicLock,
atomicSet,
atomicSetPtr,
atomicTryLock,
atomicUnlock
) where
import Control.Monad.IO.Class
import Data.Word
import Foreign.C.String
import Foreign.C.Types
import Foreign.Ptr
import Graphics.UI.SDL.Enum
import Graphics.UI.SDL.Types
foreign import ccall "SDL.h SDL_CreateThread" createThread' :: ThreadFunction -> CString -> IO (Ptr ())
foreign import ccall "SDL.h SDL_DetachThread" detachThread' :: Ptr Thread -> IO ()
foreign import ccall "SDL.h SDL_GetThreadID" getThreadID' :: Ptr Thread -> IO ThreadID
foreign import ccall "SDL.h SDL_GetThreadName" getThreadName' :: Ptr Thread -> IO CString
foreign import ccall "SDL.h SDL_SetThreadPriority" setThreadPriority' :: ThreadPriority -> IO CInt
foreign import ccall "SDL.h SDL_TLSCreate" tlsCreate' :: IO TLSID
foreign import ccall "SDL.h SDL_TLSGet" tlsGet' :: TLSID -> IO (Ptr ())
foreign import ccall "SDL.h SDL_TLSSet" tlsSet' :: TLSID -> Ptr () -> FunPtr (Ptr () -> IO ()) -> IO CInt
foreign import ccall "SDL.h SDL_ThreadID" threadID' :: IO ThreadID
foreign import ccall "SDL.h SDL_WaitThread" waitThread' :: Ptr Thread -> Ptr CInt -> IO ()
foreign import ccall "SDL.h SDL_CondBroadcast" condBroadcast' :: Ptr Cond -> IO CInt
foreign import ccall "SDL.h SDL_CondSignal" condSignal' :: Ptr Cond -> IO CInt
foreign import ccall "SDL.h SDL_CondWait" condWait' :: Ptr Cond -> Ptr Mutex -> IO CInt
foreign import ccall "SDL.h SDL_CondWaitTimeout" condWaitTimeout' :: Ptr Cond -> Ptr Mutex -> Word32 -> IO CInt
foreign import ccall "SDL.h SDL_CreateCond" createCond' :: IO (Ptr Cond)
foreign import ccall "SDL.h SDL_CreateMutex" createMutex' :: IO (Ptr Mutex)
foreign import ccall "SDL.h SDL_CreateSemaphore" createSemaphore' :: Word32 -> IO (Ptr Sem)
foreign import ccall "SDL.h SDL_DestroyCond" destroyCond' :: Ptr Cond -> IO ()
foreign import ccall "SDL.h SDL_DestroyMutex" destroyMutex' :: Ptr Mutex -> IO ()
foreign import ccall "SDL.h SDL_DestroySemaphore" destroySemaphore' :: Ptr Sem -> IO ()
foreign import ccall "SDL.h SDL_LockMutex" lockMutex' :: Ptr Mutex -> IO CInt
foreign import ccall "SDL.h SDL_SemPost" semPost' :: Ptr Sem -> IO CInt
foreign import ccall "SDL.h SDL_SemTryWait" semTryWait' :: Ptr Sem -> IO CInt
foreign import ccall "SDL.h SDL_SemValue" semValue' :: Ptr Sem -> IO Word32
foreign import ccall "SDL.h SDL_SemWait" semWait' :: Ptr Sem -> IO CInt
foreign import ccall "SDL.h SDL_SemWaitTimeout" semWaitTimeout' :: Ptr Sem -> Word32 -> IO CInt
foreign import ccall "SDL.h SDL_TryLockMutex" tryLockMutex' :: Ptr Mutex -> IO CInt
foreign import ccall "SDL.h SDL_UnlockMutex" unlockMutex' :: Ptr Mutex -> IO CInt
foreign import ccall "SDL.h SDL_AtomicAdd" atomicAdd' :: Ptr Atomic -> CInt -> IO CInt
foreign import ccall "SDL.h SDL_AtomicCAS" atomicCAS' :: Ptr Atomic -> CInt -> CInt -> IO Bool
foreign import ccall "SDL.h SDL_AtomicCASPtr" atomicCASPtr' :: Ptr (Ptr ()) -> Ptr () -> Ptr () -> IO Bool
foreign import ccall "SDL.h SDL_AtomicGet" atomicGet' :: Ptr Atomic -> IO CInt
foreign import ccall "SDL.h SDL_AtomicGetPtr" atomicGetPtr' :: Ptr (Ptr ()) -> IO (Ptr ())
foreign import ccall "SDL.h SDL_AtomicLock" atomicLock' :: Ptr SpinLock -> IO ()
foreign import ccall "SDL.h SDL_AtomicSet" atomicSet' :: Ptr Atomic -> CInt -> IO CInt
foreign import ccall "SDL.h SDL_AtomicSetPtr" atomicSetPtr' :: Ptr (Ptr ()) -> Ptr () -> IO (Ptr ())
foreign import ccall "SDL.h SDL_AtomicTryLock" atomicTryLock' :: Ptr SpinLock -> IO Bool
foreign import ccall "SDL.h SDL_AtomicUnlock" atomicUnlock' :: Ptr SpinLock -> IO ()
createThread :: MonadIO m => ThreadFunction -> CString -> m (Ptr ())
createThread v1 v2 = liftIO $ createThread' v1 v2
detachThread :: MonadIO m => Ptr Thread -> m ()
detachThread v1 = liftIO $ detachThread' v1
getThreadID :: MonadIO m => Ptr Thread -> m ThreadID
getThreadID v1 = liftIO $ getThreadID' v1
getThreadName :: MonadIO m => Ptr Thread -> m CString
getThreadName v1 = liftIO $ getThreadName' v1
setThreadPriority :: MonadIO m => ThreadPriority -> m CInt
setThreadPriority v1 = liftIO $ setThreadPriority' v1
tlsCreate :: MonadIO m => m TLSID
tlsCreate = liftIO tlsCreate'
tlsGet :: MonadIO m => TLSID -> m (Ptr ())
tlsGet v1 = liftIO $ tlsGet' v1
tlsSet :: MonadIO m => TLSID -> Ptr () -> FunPtr (Ptr () -> IO ()) -> m CInt
tlsSet v1 v2 v3 = liftIO $ tlsSet' v1 v2 v3
threadID :: MonadIO m => m ThreadID
threadID = liftIO threadID'
waitThread :: MonadIO m => Ptr Thread -> Ptr CInt -> m ()
waitThread v1 v2 = liftIO $ waitThread' v1 v2
condBroadcast :: MonadIO m => Ptr Cond -> m CInt
condBroadcast v1 = liftIO $ condBroadcast' v1
condSignal :: MonadIO m => Ptr Cond -> m CInt
condSignal v1 = liftIO $ condSignal' v1
condWait :: MonadIO m => Ptr Cond -> Ptr Mutex -> m CInt
condWait v1 v2 = liftIO $ condWait' v1 v2
condWaitTimeout :: MonadIO m => Ptr Cond -> Ptr Mutex -> Word32 -> m CInt
condWaitTimeout v1 v2 v3 = liftIO $ condWaitTimeout' v1 v2 v3
createCond :: MonadIO m => m (Ptr Cond)
createCond = liftIO createCond'
createMutex :: MonadIO m => m (Ptr Mutex)
createMutex = liftIO createMutex'
createSemaphore :: MonadIO m => Word32 -> m (Ptr Sem)
createSemaphore v1 = liftIO $ createSemaphore' v1
destroyCond :: MonadIO m => Ptr Cond -> m ()
destroyCond v1 = liftIO $ destroyCond' v1
destroyMutex :: MonadIO m => Ptr Mutex -> m ()
destroyMutex v1 = liftIO $ destroyMutex' v1
destroySemaphore :: MonadIO m => Ptr Sem -> m ()
destroySemaphore v1 = liftIO $ destroySemaphore' v1
lockMutex :: MonadIO m => Ptr Mutex -> m CInt
lockMutex v1 = liftIO $ lockMutex' v1
semPost :: MonadIO m => Ptr Sem -> m CInt
semPost v1 = liftIO $ semPost' v1
semTryWait :: MonadIO m => Ptr Sem -> m CInt
semTryWait v1 = liftIO $ semTryWait' v1
semValue :: MonadIO m => Ptr Sem -> m Word32
semValue v1 = liftIO $ semValue' v1
semWait :: MonadIO m => Ptr Sem -> m CInt
semWait v1 = liftIO $ semWait' v1
semWaitTimeout :: MonadIO m => Ptr Sem -> Word32 -> m CInt
semWaitTimeout v1 v2 = liftIO $ semWaitTimeout' v1 v2
tryLockMutex :: MonadIO m => Ptr Mutex -> m CInt
tryLockMutex v1 = liftIO $ tryLockMutex' v1
unlockMutex :: MonadIO m => Ptr Mutex -> m CInt
unlockMutex v1 = liftIO $ unlockMutex' v1
atomicAdd :: MonadIO m => Ptr Atomic -> CInt -> m CInt
atomicAdd v1 v2 = liftIO $ atomicAdd' v1 v2
atomicCAS :: MonadIO m => Ptr Atomic -> CInt -> CInt -> m Bool
atomicCAS v1 v2 v3 = liftIO $ atomicCAS' v1 v2 v3
atomicCASPtr :: MonadIO m => Ptr (Ptr ()) -> Ptr () -> Ptr () -> m Bool
atomicCASPtr v1 v2 v3 = liftIO $ atomicCASPtr' v1 v2 v3
atomicDecRef :: Ptr Atomic -> IO Bool
atomicDecRef a = do
old <- atomicAdd a (1)
return $ old == 1
atomicGet :: MonadIO m => Ptr Atomic -> m CInt
atomicGet v1 = liftIO $ atomicGet' v1
atomicGetPtr :: MonadIO m => Ptr (Ptr ()) -> m (Ptr ())
atomicGetPtr v1 = liftIO $ atomicGetPtr' v1
atomicIncRef :: Ptr Atomic -> IO CInt
atomicIncRef a = atomicAdd a 1
atomicLock :: MonadIO m => Ptr SpinLock -> m ()
atomicLock v1 = liftIO $ atomicLock' v1
atomicSet :: MonadIO m => Ptr Atomic -> CInt -> m CInt
atomicSet v1 v2 = liftIO $ atomicSet' v1 v2
atomicSetPtr :: MonadIO m => Ptr (Ptr ()) -> Ptr () -> m (Ptr ())
atomicSetPtr v1 v2 = liftIO $ atomicSetPtr' v1 v2
atomicTryLock :: MonadIO m => Ptr SpinLock -> m Bool
atomicTryLock v1 = liftIO $ atomicTryLock' v1
atomicUnlock :: MonadIO m => Ptr SpinLock -> m ()
atomicUnlock v1 = liftIO $ atomicUnlock' v1