[Haskell-cafe] Re: Real-time garbage collection for Haskell

Neil Davies semanticphilosopher at googlemail.com
Wed Mar 3 03:43:37 EST 2010


On 2 Mar 2010, at 21:38, Simon Marlow wrote:

> On 02/03/10 20:37, Luke Palmer wrote:
>> On Tue, Mar 2, 2010 at 7:17 AM, Simon Marlow<marlowsd at gmail.com>   
>> wrote:
>>>> For games,
>>>> though, we have a very good point that occurs regularly where we  
>>>> know
>>>> that all/most short-lived objects will no longer be referenced -  
>>>> at the
>>>> start of a fresh frame.
>>>
>>> System.Mem.performGC is your friend, but if you're unlucky it  
>>> might do a
>>> major GC and then you'll get more pause than you bargained for.
>>
>> Some fine-grained control might be nice here.  Eg. I could do a major
>> GC as a player is opening a menu, on a loading screen, when the game
>> is paused, or some other key points, and it might still be annoying,
>> but at least it wouldn't interfere with gameplay.  There is of course
>> the question of what happens if one of these key points doesn't  
>> happen
>> when we need to do an allocation, but... oh well.  Perhaps that could
>> be mitigated by saying "I would rather you allocate than major GC
>> right now".  Are any of these options impossible, or be unreasonably
>> difficult to implement (I don't suspect so)?
>
> Actually that's one thing we can do relatively easily, i.e. defer  
> major GC for a while.  Due to the way GHC has a two-layer memory  
> manager, the heap is a list of discontiguous blocks, so we can  
> always allocate some more memory.
>
> So it would be pretty easy to provide something like
>
>  disableMajorGC, enableMajorGC :: IO ()
>
> Of course leaving it disabled too long could be bad, but that's your  
> responsibility.
>
> Oh, I just checked and System.Mem.performGC actually performs a  
> major GC, here's its implementation:
>
> foreign import ccall {-safe-} "performMajorGC" performGC :: IO ()
>
> to perform a minor GC (or possibly a major GC if one is due), you  
> want this:
>
> foreign import ccall {-safe-} "performGC" performMinorGC :: IO ()
>
> Cheers,
> 	Simon
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

Is there a similar set of runes to be able to see how much mutation  
has occurred, how much was live last GC, etc?

Neil



More information about the Haskell-Cafe mailing list