implemented dummy mallocBytes etc which; added cabal build system;
[hs-boehmgc.git] / src / Mate / GC / Boehm.hs
diff --git a/src/Mate/GC/Boehm.hs b/src/Mate/GC/Boehm.hs
new file mode 100644 (file)
index 0000000..eb5711b
--- /dev/null
@@ -0,0 +1,36 @@
+{-# 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