std.allocator ready for some abuse

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Fri Nov 1 14:00:36 PDT 2013


On 10/30/13 1:02 PM, Martin Nowak wrote:
> This looks really promising.
> There are a lot of building blocks and the way different capabilities
> are modelled by optional methods nicely solves the biggest difficulty
> with allocators.
> I think it's important to put this in it's own github repo and add a dub
> package for it on code.dlang.org so that it's easy to test the
> implementation and to contribute improvements.

Tried to register github package andralex/phobos, and:

============================
500 - Internal Server Error

Internal Server Error

Internal error information:
object.Exception at source/dubregistry/repositories/repository.d(43): 
Failed to read JSON from 
https://raw.github.com/andralex/phobos/master/package.json: Unexpected 
reply for 'https://raw.github.com/andralex/phobos/master/package.json': 
Not Found
----------------
./dub-registry(dubregistry.repositories.repository.PackageVersionInfo 
dubregistry.repositories.github.GithubRepository.getVersionInfo(immutable(char)[])+0x3b5) 
[0x6e8ec1]
./dub-registry(void 
dubregistry.registry.DubRegistry.addPackage(vibe.data.json.Json, 
vibe.data.bson.BsonObjectID)+0xa6) [0x62d372]
./dub-registry(void 
dubregistry.web.DubRegistryWebFrontend.addPackage(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse, userman.controller.User)+0x222) 
[0x6e4406]
./dub-registry(void delegate(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse) 
userman.web.UserManWebInterface.auth(void 
delegate(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse, userman.controller.User)).void 
requestHandler(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse)+0x10d) [0x800181]
./dub-registry(void 
vibe.http.router.URLRouter.handleRequest(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse)+0x179) [0x6fb8b5]
./dub-registry(bool 
vibe.http.server.handleRequest(vibe.core.stream.Stream, 
immutable(char)[], vibe.http.server.HTTPServerListener, ref 
vibe.http.server.HTTPServerSettings, ref bool)+0x16c8) [0x6f0344]
./dub-registry(void 
vibe.http.server.handleHTTPConnection(vibe.core.net.TCPConnection, 
vibe.http.server.HTTPServerListener)+0x143) [0x6eebb7]
./dub-registry(void 
vibe.http.server.listenHTTPPlain(vibe.http.server.HTTPServerSettings, 
void delegate(vibe.http.server.HTTPServerRequest, 
vibe.http.server.HTTPServerResponse)).void 
doListen(vibe.http.server.HTTPServerSettings, 
vibe.http.server.HTTPServerListener, immutable(char)[]).void 
__lambda54(vibe.core.net.TCPConnection)+0x2c) [0x6eb160]
./dub-registry(extern (C) nothrow void 
vibe.core.drivers.libevent2_tcp.onConnect(int, short, void*).void 
ClientTask.execute()+0x2d6) [0x70939a]
./dub-registry(void vibe.core.core.CoreTask.run()+0xf2) [0x7172fe]
./dub-registry(void core.thread.Fiber.run()+0x2a) [0x83eae2]
./dub-registry(fiber_entryPoint+0x61) [0x83e9ed]
[(nil)]
============================

This is obviously because package.json is absent from the repo, but I'd 
say it shouldn't cause such an error.

That makes me think probably Phobos should have a package.json so people 
can install updates via code.dlang.org.

> That said it failed my litmus test.
> I previously used David Simcha's RegionAllocator
> https://github.com/dsimcha/TempAlloc/blob/master/std/allocators/region.d.

Let's see!

> The pattern is to allocate some metadata followed by allocating many
> fixed size tree nodes. When the tree is constructed it is used to render
> an image which is the result of that operation.
> The tree and all metadata is freed and the region allocator is reused
> for the next method invocation (it keeps the memory).
>
> I think the closest would be to use CascadingAllocator with Region but
> there are two issues.
>
> CascadingAllocator successively tries all allocators and if that fails
> creates a new region. So this runs in O(N) complexity even though most
> of the time only the last allocator will have memory available.

Yah, I'd left a TODO in there when I first wrote the code:

https://github.com/andralex/phobos/blob/allocator/std/allocator.d#L3723

The newly-added allocator should come to the front of the list.

My suspicion, however, is that you won't be able to measure a 
difference. A well-dimensioned cascade of regions will have a high 
ration of allocations within a regions to number of regions.

> There is no simple way to deallocateAll without freeing the regions.
> What I need is something similar to clear in appender.

Hm, interesting. But then again - do you think it makes a difference? 
Allocation of regions is a very small fraction of the work done on using 
the regions.

> I also can't relinquish the memory from the inner regions because they
> are private.

How do we formalize that?

> So for my use-case the only way that I found to use this module
> is to compute the upper bound of memory needed when the renderer is
> invoked. Then I have to relinquish the buffer from a region, reallocate
> it using Mallocator.it and construct a new region with the reallocated
> buffer.

I'd say just plow ahead with a straight region as implemented. If you 
measure any difference, let's talk.


Andrei


More information about the Digitalmars-d mailing list