[webkit-dev] WebKit memory management?

Maciej Stachowiak mjs at apple.com
Tue Sep 16 06:20:27 PDT 2008


On Sep 16, 2008, at 4:56 AM, Ferenc, Rudolf wrote:

> Paul Pedriana wrote:
>>    >> The problem with this syntax is that you can't do the  
>> corresponding thing with operator delete, as far as I know.
>> You are correct; delete would still need to be done differently  
>> (assuming you don't define a deleteWTF macro).
>
> Paul, do you have some idea how to #define such a deleteWTF macro?

This is better done with template functions than macros in my opinion.

  - Maciej

>
>
>> The fact that operator delete cannot be overridden is one of the  
>> limitations of the C++ language. The primary reason why is that the  
>> compiler needs to generate delete calls for objects that throw  
>> during construction, and there isn't an easy means to convey to the  
>> compiler which delete in particular you want it to generate.
>> Paul
>>> 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
>>>
>> _______________________________________________
>> webkit-dev mailing list
>> webkit-dev at lists.webkit.org
>> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
> <ferenc.vcf>_______________________________________________
> 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