-module Mate.GarbageAlloc where
+{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE CPP #-}
+#include "debug.h"
+module Mate.GarbageAlloc(
+ mallocClassData,
+ mallocString,
+ mallocObject,
+ getHeapMemory,
+ printMemoryUsage,
+ mallocStringVM,
+ mallocObjectVM) where
import Foreign
import Foreign.C
+import Mate.GC.Boehm
+
+import Text.Printf
+import Mate.Debug
+
-- unified place for allocating Memory
-- TODO: implement GC stuff ;-)
mallocClassData :: Int -> IO (Ptr a)
-mallocClassData = mallocBytes
+mallocClassData size = do
+ printfStr "mallocClassData: %d\n" size
+ mem <- mallocBytes size
+ addRootGC mem (plusPtr mem size)
+ return mem
mallocString :: Int -> IO (Ptr a)
-mallocString = mallocBytes
+mallocString size = do
+ printfStr "mallocString: %d\n" size
+ mallocBytesGC size
+
+mallocStringVM :: Int -> IO (Ptr a)
+mallocStringVM = mallocBytes
-foreign export ccall mallocObject :: Int -> IO CUInt
-mallocObject :: Int -> IO CUInt
+foreign export ccall mallocObject :: Int -> IO CPtrdiff
+mallocObject :: Int -> IO CPtrdiff
mallocObject size = do
+ ptr <- mallocBytesGC size
+ printfStr "mallocObject: %d\n" size
+ return $ fromIntegral $ ptrToIntPtr ptr
+
+mallocObjectVM :: Int -> IO CPtrdiff
+mallocObjectVM size = do
ptr <- mallocBytes size
+ printfStr "mallocObject VM: %d\n" size
return $ fromIntegral $ ptrToIntPtr ptr
+
+-- TODO: delete me
+foreign export ccall demoInterfaceCall :: CUInt -> IO ()
+demoInterfaceCall :: CUInt -> IO ()
+demoInterfaceCall val = do
+ printf "demoInterfaceCall: 0x%08x\n" (fromIntegral val :: Word32)
+ return ()
+
+getHeapMemory :: IO Int
+getHeapMemory = getHeapSizeGC
+
+
+foreign export ccall printMemoryUsage :: IO ()
+printMemoryUsage :: IO ()
+printMemoryUsage = getHeapMemory >>= print