On Tuesday, 28 June 2016 at 19:03:14 UTC, John Colvin wrote:
On my machine (OS X), this program eats up memory with no end in sight

import std.concurrency;
import core.stdc.stdio;

void start()
{
    while(true)
    {
        receive(
            (int msg)
            {
                char[2] s = '\0';
                s[0] = cast(char)msg;
                puts(s.ptr);    // remove this => no memory leak
            }
        );
    }
}


void main()
{
    auto hw_tid = spawn(&start);

    while(true)
    {
        send(hw_tid, 64);
        auto b = new ubyte[](1_000); // 10_000 => no memory leak
    }
}

This is very odd, no? I'm not sure if it's a bug, but it sure is surprising. Why should "puts" cause a GC leak (writeln is the same)? What's so special about small allocations that allows all my memory to get filled up?

Is puts high enough latency that, that main thread can fill the message queue faster then start can exhaust it? If you put a call to sleep for 1ms in the main loop does it have the same result?

Reply via email to