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.