Hs2lib-0.5.0: WinDll/Debug/Records.xhs
-----------------------------------------------------------------------------
-- |
-- Module : Windll
-- Copyright : (c) Tamar Christina 2009 - 2010
-- License : BSD3
--
-- Maintainer : tamar@zhox.com
-- Stability : experimental
-- Portability : portable
--
-- Contains the structures to hold allocation information
-- used when debugging.
--
-----------------------------------------------------------------------------
module WinDll.Debug.Records
( MemAlloc(..)
, Caller(..)
, fileName
, writeMemAlloc
) where
import WinDll.Debug.Stack ( Stack )
import System.Directory ( doesFileExist, createDirectoryIfMissing )
import Control.Monad ( when )
import Control.Concurrent.MVar
import System.FilePath
import System.IO.Unsafe
type PtrLocation = Int -- 32bit signed integer, like the rest of hs2lib we assume x86
type MemSize = Int
-- | Identifier which shows which function was invoked to do allocations
data Caller = Malloc
| Alloc
| ReAlloc
| Other
| Record
deriving (Show, Read)
-- | The allocation structure/record that is used to keep track of allocations
data MemAlloc = MemAlloc { memFun :: Caller
, memStack :: Stack
, memStart :: PtrLocation
, memStop :: Maybe PtrLocation
, memSize :: Maybe MemSize
, memTime :: String
}
| MemFree { memStack :: Stack
, memStart :: PtrLocation
, memSize :: Maybe MemSize
, memTime :: String
}
deriving (Show, Read)
-- | The directory in which to write the results to.
directory :: String
directory = "MemDumps"
-- | The file to write the results too
fileName :: IO String
fileName = do let path = "Memory.dump"
createDirectoryIfMissing True directory
return $ directory </> path
-- | Synchronization variable between threads.
fileLock :: MVar Int
{-# NOINLINE fileLock #-}
fileLock = unsafePerformIO $ newMVar 0
-- | Write out a single allocation structure out to file.
writeMemAlloc :: MemAlloc -> IO ()
writeMemAlloc mem = do takeMVar fileLock
fn <- fileName
exists <- doesFileExist fn
when (not exists) $ writeFile fn []
appendFile fn (show mem ++ "\n")
putMVar fileLock 0