forcing weak purity

Don Clugston dac at nospam.com
Wed May 23 08:29:49 PDT 2012


On 23/05/12 15:56, Alex Rønne Petersen wrote:
> On 23-05-2012 15:17, Don Clugston wrote:
>> On 23/05/12 05:22, Steven Schveighoffer wrote:
>>> I have come across a dilemma.
>>>
>>> Alex Rønne Petersen has a pull request changing some things in the GC to
>>> pure. I think gc_collect() should be weak-pure, because it could
>>> technically run on any memory allocation (which is already allowed in
>>> pure functions), and it runs in a context that doesn't really affect
>>> execution of the pure function.
>>>
>>> So I think it should be able to be run inside a strong pure function.
>>
>> I am almost certain it should not.
>>
>> And I think this is quite important. A strongly pure function should be
>> considered to have its own gc, and should not be able to collect any
>> memory it did not allocate itself.
>>
>> Memory allocation from a pure function might trigger a gc cycle, but it
>> would ONLY look at the memory allocated inside that pure function.
>
> Implementing this on a per-function basis is not very realistic. Some
> programs have hundreds (if not thousands) of pure functions.

No, it's not realistic for every function. But it's extremely easy for 
others. In particular, if you have a pure function which has no 
reference parameters, you just need a pointer to the last point a 
strongly pure function was entered. This partitions the heap into two 
parts. Each can be gc'd independently.

And, in the non-pure part, nothing is happening. Once you've done a GC 
there, you NEVER need to do it again.

> Not to mention, we'd need some mechanism akin to critical regions to
> figure out when a thread is in a pure function during stop-the-world.
> Further, data allocated in a pure function f() in thread A must not be
> touched by a collection triggered by an allocation inside f() in thread
> B. It'd be a huge mess.

Not so. It's impossible for anything outside of a strongly pure function 
to hold a pointer to memory allocated by the pure function.
In my view, this is the single most interesting feature of purity.

> And, frankly, if my program dies from an OOME due to pure functions
> being unable to do full collection cycles, I'd just stop using pure
> permanently. It's not a very realistic approach to automatic memory
> management; at that point, manual memory management would work better.

Of course. But I don't see how that's relevant. How the pure function 
actually obtains its memory is an implementation detail.

There's a huge difference between "a global collection *may* be 
performed from a pure function" vs "it *must* be possible to force a 
global collection from a pure function".

The difficulty in expressing the latter is a simple consequence of the 
fact that it is intrinsically impure.


More information about the Digitalmars-d mailing list