Vote on region allocator

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sat Sep 24 00:08:25 PDT 2011


On 9/24/11 1:19 CDT, Jonathan M Davis wrote:
> On Saturday, September 24, 2011 01:10:44 Andrei Alexandrescu wrote:
>> On 9/23/11 22:30 CDT, dsimcha wrote:
>>> On 9/23/2011 11:25 PM, Robert Jacques wrote:
>>>> On Fri, 23 Sep 2011 15:53:46 -0400, Jonathan M Davis
>>>> <jmdavisProg at gmx.com>  wrote:
>>>>
>>>> No. I cannot build an efficient and safe appender on this API.
>>>
>>> The resize() fix you requested is going to get implemented. I just
>>> haven't actually added it yet.
>>
>> Then we might be hasty to vote this in. Ideally Phobos should be
>> integrating tried and true APIs.
>>
>> I wish we voted allocator in once it's used throughout std.container to
>> great effect.
>
> So, do you think that we should cease the vote then?

At the risk of annoying David and others, allow me to vote against 
inclusion of the current proposal. There are three main reasons:

1. The proposal has been changed mid-review.

2. There are hints of further changes post-review.

3. Only the scoped allocator has been used, but not the others.

These threes are basis enough for a negative vote. That being said, this 
is excellent progress towards solving a very difficult problem.

Below are some more thoughts about steps that could be taken to improve 
the design and its implementation.

Fundamentally we want to make sure we cover the following allocators:

1. Classic malloc/realloc/free, unsafe
2. Scoped allocators of various flavors (simple/expanding/etc.)
3. Full-fledged garbage collectors, conservative and not
4. Stacked combinations (e.g. freelist over region over malloc etc.)
(5. It would be awesome if we could somehow catch allocators that use 
reference counting, or at least not prevent their definition. I'm just 
mentioning this because it's been buzzing in my mind forever, but any 
design I can think of is fraught with issues.)

Of these, the garbage-collected allocators need type information about 
the data, so we can only assume that any allocator needs it. There is 
some design in that direction, but it lacks the dynamic component. 
Generally the relationship between the structural/static interface and 
the dynamic interface is tenuous (when should one use one vs. the other? 
how does one pass type information about an allocation through the 
dynamic interface?)

Currently the low-level interface traffics in void* (not even void[] or 
ubyte[] which may be better) and does not offer any way to e.g. set the 
type of a chunk after it's been allocated. This makes e.g. a precise 
garbage collector difficult to integrate (and impossible with the 
dynamic interface).

I think the interface should offer a bool freeAll() that frees all 
memory allocated by the given allocator. That would only work with 
scoped allocators and would return false for the others. Speaking of 
which, there's no property that says "free() is inoperant", which is the 
case for certain region-based allocators.

Finally, it would be great if some validation was available. There's no 
use of the dynamic interface with e.g. containers, which would have 
readily revealed e.g. the fact that a container can't pass type 
information to the allocator through the dynamic interface.

We should also have some more examples of stacked allocators, e.g. that 
use free lists on top of regions etc. The current static design seems to 
be almost adequate. The way I see this all working is that allocators 
define the static interface for maximum performance and are stackable in 
infinite ways. Once the user decides on a stacking configuration, they 
simply wrap the entire stack in the dynamic interface and use that with 
e.g. a container.


Thanks,

Andrei


More information about the Digitalmars-d mailing list