{-# LANGUAGE CPP #-}

{- |

   Module      :  System.Win32.Thread

   Copyright   :  2013 shelarcy

   License     :  BSD-style



   Maintainer  :  shelarcy@gmail.com

   Stability   :  Provisional

   Portability :  Non-portable (Win32 API)



   This modules provides just thread control APIs.

   This modules doesn't provide thread register control APIs. Because these APIs are used for Debugging.

-}

module System.Win32.Thread

  ( THANDLE, TID

  , getCurrentThread

  , suspendThread

  , c_SuspendThread

  , resumeThread

  , c_ResumeThread

  , withSuspendedThread

  , getThreadId

  , c_GetThreadId

  , getCurrentThreadId

  , c_GetCurrentThreadId

  ) where



import System.Win32.DebugApi

import System.Win32.Types ( failIfZero )



#include "windows_cconv.h"



getThreadId :: THANDLE -> IO TID

getThreadId = failIfZero "GetThreadId" . c_GetThreadId



getCurrentThreadId :: IO TID

getCurrentThreadId = failIfZero "GetThreadId" c_GetCurrentThreadId



foreign import WINDOWS_CCONV "windows.h GetCurrentThread"

    getCurrentThread :: IO THANDLE



foreign import WINDOWS_CCONV "windows.h GetThreadId"

    c_GetThreadId :: THANDLE -> IO TID



foreign import WINDOWS_CCONV "windows.h GetCurrentThreadId"

    c_GetCurrentThreadId :: IO TID