[Haskell-cafe] Re: Real-time garbage collection for Haskell
Simon Marlow
marlowsd at gmail.com
Wed Mar 3 05:51:50 EST 2010
On 03/03/2010 08:43, Neil Davies wrote:
>
> 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?
No, but there could be - the information is collected by the RTS, it
just isn't made available via a public API right now.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list