[Haskell-cafe] Re: Real-time garbage collection for Haskell
Simon Marlow
marlowsd at gmail.com
Tue Mar 2 16:38:52 EST 2010
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
More information about the Haskell-Cafe
mailing list