[webkit-dev] WebKit memory management?

Maciej Stachowiak mjs at apple.com
Mon Sep 15 15:27:38 PDT 2008


On Sep 15, 2008, at 1:53 PM, Paul Pedriana wrote:

> Regarding purpose:
>
> The primary benefit of being able to override operator new is to be  
> able
> to redirect all allocations for a library to a user-specified heap.  
> With
> global operator new, allocated WebKit memory is mixed in with the rest
> of the application memory and there is no practical way to tell them
> apart or sequester them. This makes it impossible to correctly shut  
> down
> WebKit at runtime, since you don't know where its memory is. A side
> benefit related to this is that this allows for better memory metrics
> gathering.
>
> A related problem is that parts of WebKit currently make the  
> assumption
> that operator new == tcmalloc; this includes using them  
> interchangeably
> in the code (see JSVariableObject for example). tcmalloc is a fine  
> heap
> for some platforms but in most cases is not the best option for  
> embedded
> or console platforms. Currently WebKit heap memory is allocated by at
> least four means: operator new, malloc, fastMalloc, and mmap. We would
> like to see all memory allocation going through a single controllable
> API (such as the proposed operator new), though for Unix platforms I  
> can
> see the benefit of mmap for the JavaScript VM.
>
> Regarding syntax:
>
> The proposal provides for a base class that overrides global operator
> new. So any allocated classes use the same syntax as usual. Most of  
> the
> source code would fall under this.
>
> For the case of non-class-based memory allocations (e.g. raw char
> array), the proposal provides a newObject and newArray template
> function. So instead of 'new int' you would way 'newObject<int>' and
> instead of 'new char[32]' you would say 'newArray<char>(32)'. However,
> there is an alternative approach which is to provide a custom operator
> new type, like so:
>    struct WTF{};
>    void* operator new(size_t size, WTF);
>
> and so 'new char[32]' becomes 'new(WTF()) char[32]'. This is the
> conventional solution to namespacing operator new, where the C++
> standard doesn't allow for operator new being in a C++ namespace.
> Perhaps this syntax is preferable. This can be #defined to simply  
> newWTF
> if desired, then it is practically identical to existing global new  
> syntax.

The problem with this syntax is that you can't do the corresponding  
thing with operator delete, as far as I know.

> FWIW, I have been testing the proposed patch in my copy and so far it
> has been fine, but that of course includes only my uses.

I hope to look at your patch soon. I think we absolutely need to fix  
the broken overriding of the global operator new / operator delete,  
but I want to make sure the syntax we end up with is as friendly as  
possible, since it will be pervasive throughout the code.

Regards,
Maciej

>
>
> Paul
>
>
>
>>> If I understand Mr. Pedriana correctly, you are incorrect in  
>>> assuming that
>>> we would get "reduced syntax readability". You may use the regular  
>>> "new"
>>> syntax that C++ programmers are accustomed to when allocating  
>>> objects and
>>> arrays of objects that inherit from AllocBase. Pedriana proposes  
>>> that we
>>> eventually add AllocBase as the base class of all root classes in  
>>> WebKit,
>>> thus making AllocBase the only root class.
>>>
>>> The only time when you would need to use newObject/newArray is for  
>>> some
>>> stray new/new[] calls when allocating something that does not  
>>> inherit from
>>> AllocBase, i.e. a simple datatype.
>>>
>>
>> I'm personally happy if we won't have the reduced syntax  
>> readability :-)
>>
>> Still, I'm curious to see the use cases where it makes more sense  
>> to do this
>> instead of global new/delete overrides at the application level.  
>> Feel free to
>> enlighten me here...
>>
>> (BTW, no need to CC me. I'm on the list).
>>
>>
>>
>
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev



More information about the webkit-dev mailing list