On Saturday, 7 February 2015 at 01:43:01 UTC, Andrei Alexandrescu wrote:
With the system proposal we're looking at something like:

version (Posix) void[] read(in char[] name, size_t upTo = size_t.max) @trusted
{
    import core.memory;
    // A few internal configuration parameters {
    enum size_t
        minInitialAlloc = 1024 * 4,
        maxInitialAlloc = size_t.max / 2,
        sizeIncrement = 1024 * 16,
        maxSlackMemoryAllowed = 1024;
    // }

    @system
    {
immutable fd = core.sys.posix.fcntl.open(name.tempCString(),
            core.sys.posix.fcntl.O_RDONLY);
    }
    cenforce(fd != -1, name);
    scope(exit) core.sys.posix.unistd.close(fd);

    stat_t statbuf = void;
    @system
    {
cenforce(trustedFstat(fd, trustedRef(statbuf)) == 0, name);
    }

    immutable initialAlloc = to!size_t(statbuf.st_size
        ? min(statbuf.st_size + 1, maxInitialAlloc)
        : minInitialAlloc);
    void[] result = uninitializedArray!(ubyte[])(initialAlloc);
    scope(failure) delete result;
    size_t size = 0;

    for (;;)
    {
        @system
        {
immutable actual = core.sys.posix.unistd.read(fd, result.ptr + size),
                min(result.length, upTo) - size);
        }
        cenforce(actual != -1, name);
        if (actual == 0) break;
        size += actual;
        if (size < result.length) continue;
        immutable newAlloc = size + sizeIncrement;
        @system
        {
result = GC.realloc(result.ptr, newAlloc, GC.BlkAttr.NO_SCAN)[0 .. newAlloc];
        }

    @system
    {
        return result.length - size >= maxSlackMemoryAllowed
? GC.realloc(result.ptr, size, GC.BlkAttr.NO_SCAN)[0 .. size]
            : result[0 .. size];
    }
}

We want to move D forward, folks. This is not it.


Andrei

Oh I see. There are three posts, in the latter two of which the little @trusted functions are already removed. I had thought they were all identical, but you obviously realized the little functions should be removed.

Reply via email to