
You would need the NOINLINE pragma:
{-# NOINLINE eventObj_ #-}
eventObj_ :: Ptr Event
eventObj_ = unsafePerformIO malloc
I would avoid this sort of global state in general. It isn't clear that
this will give an improvement in performance and what could otherwise
possible be a thread safe API is no longer thread safe. Global TVars and
MVars are much more compelling as they are thread safe and represent some
global synchronization in your program.
On Wed, Jan 29, 2014 at 10:03 AM, Ömer Sinan Ağacan
I was also wondering a similar thing. I'm writing FFI for a C library. Library has a function like:
int pollEvent(EventType* event);
Instead of malloc'ing a new EventType in a FFI call for this functions:
pollEvent :: IO Event pollEvent = do ev <- malloc ret <- cPollEvent ev -- check if ret is 0 etc. peek ev
I was wondering if something like this is also safe:
eventObj_ :: Ptr Event eventObj_ = unsafePerformIO malloc
pollEvent :: IO Event pollEvent = do ret <- cPollEvent eventObj_ -- check if ret is 0 etc. peek eventObj_
This is one malloc cheaper for every call, and differences are not visible from user side. Still, I did not use this in my FFI bindings because I was not sure how safe is this approach. Any ideas on this?
--- Ömer Sinan Ağacan http://osa1.net _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe