GC free Writer

David d at dav1d.de
Fri Feb 8 14:05:49 PST 2013


> Does your IO layer require one call per log line or can you do multiple writes followed by an "end log line" terminator? 
> Assuming the former, the most obvious approach would be for the writer to have a static array equal to the max log line size,
> accumulate until done and then issue one write to the output layer.

I don't understand, you mean I should pass `args` directly to the
writer? I tried it, ended up with linker errors, since writer is an
interface:

----
interface IWriter {
    void log(LogLevel level, string name, const(char)[] message);
    @property bool bubbles();
    @property void bubbles(bool);
}
----

So I have to pass a string around, which isn't a big deal, until the
runtime shuts down.


jA_cOp pointed me to std.string.sformat on IRC, I tried it with a
stack-allocated buffer, unfortunatly it seems to allocate somewhere:

----
#0  0x00000000015cc4dc in onInvalidMemoryOperationError ()
#1  0x00000000015b53d2 in gc.gcx.GC.mallocNoSync() ()
#2  0x00000000015b534b in gc.gcx.GC.malloc() ()
#3  0x000000000157d569 in gc_malloc ()
#4  0x000000000157fcbb in _d_allocmemory ()
#5  0x00000000008f0f7b in char[] std.string.sformat!(char, void*,
immutable(char)[], uint).sformat(char[], const(char[]), void*,
immutable(char)[], uint)
----

So this is also no solution, since I wasn't able to find the origin of
this allocation (it's not because an error is thrown, well very
unlikely, formatting with the same arguments at "runtime" works)


More information about the Digitalmars-d-learn mailing list