+{-# LANGUAGE CPP #-}
+module Mate.GC.Boehm (
+ mallocBytesGC,
+ unsafeFreeGC,
+ getHeapSize,
+ ) where
+
+#define DEBUG
+
+import Foreign.Marshal.Alloc
+import Foreign.Ptr
+import Data.IORef
+import System.IO.Unsafe
+
+-- counts allocated memory in heap
+{-# NOINLINE globalBytesAllocated #-}
+globalBytesAllocated :: IORef Int
+globalBytesAllocated = unsafePerformIO (newIORef 0)
+
+#ifdef DEBUG
+-- |Allocates size bytes in managed memory
+mallocBytesGC :: Int -> IO (Ptr a)
+mallocBytesGC size = modifyIORef globalBytesAllocated (+ size) >> mallocBytes size
+#else
+-- |Allocates size bytes in managed memory
+mallocBytesGC :: Int -> IO (Ptr a)
+mallocBytesGC = mallocBytes
+#endif
+
+-- |Explicitely deallocate an object. Not required and dangerous.
+unsafeFreeGC :: Ptr a -> IO ()
+unsafeFreeGC _ = print "not implemented"
+
+-- |Returns currently allocated memory in bytes
+getHeapSize :: IO Int
+getHeapSize = readIORef globalBytesAllocated