On Thursday, 17 April 2014 at 15:39:38 UTC, Ola Fosheim Grøstad
wrote:
On Thursday, 17 April 2014 at 15:02:27 UTC, Dicebot wrote:
void foo(OutputRange buffer)
{
buffer.put(42);
}
`foo` can't be @nogc here if OutputRange uses GC as backing
allocator. However I'd really like to use it to verify that no
Can't you write foo as a template? Then if "buffer" is a ring
buffer the memory might be allocated by GC, which is ok if
put() does not call the GC and is marked as such.
put() may call GC to grow the buffer, this is the very point.
What is desired is to check if anything _else_ does call GC, thus
the "weak @nogc" parallel.
Where this falls apart is when you introduce a compacting GC
and the @nogc code is run in a real time priority thread. Then
you need both @nogc_function_calls and @nogc_memory .
True hard real-time is always special, I am speaking about
"softer" but still performance-demanding code (like one that is
used in Sociomantic).
Of course, resorting to templates requires some thinking-ahead,
and makes reuse more difficult.
I don't see how templates can help here right now.
You'll probably end up with the @nogc crowd creating their own
NoGCOutputRange… :-P
Ola.