Persistent list
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Mon Nov 16 17:58:52 PST 2015
On Sunday, 15 November 2015 at 12:56:27 UTC, Andrei Alexandrescu
wrote:
> On 11/14/2015 05:49 PM, Timon Gehr wrote:
>> List uses RC internally. I don't think the UB casts will stay
>> for the
>> final version, unless you are willing to completely dilute the
>> meaning
>> of const in ways that Walter has explicitly expressed will not
>> be done
>> in the past.
>
> As I mentioned, he's okay with changing the language to make
> the casts well defined. -- Andrei
Ok Here is what I propose as a spec. This is rough brain dump,
but that is something I think can be a good start.
There are mutable data that are thread local and immutable data
that are shared. const is a wildcard type qualifier that can
refers to mutable or immutable data.
immutable is supposed to be effectively immutable. This means
that the compiler is allowed to store these data in ro segments
and optimize redundant loads without having to prove that no
aliasing write occur in between.
One can cast away const or immutable. It is a @system operation
and this cast needs to be explicit.
If the underlying data is in ro segment, any write is effectively
undefined behavior (most likely a fault).
If the underlying data is allocated on the head (using the GC or
malloc for instance) then writing to it will effectively update
the underlying memory.
Any read from a const or immutable reference after these write
can is undefined.
Granted the write was not UB :
1/ Any read from a mutable reference in another thread is
undefined behavior unless the writing thread release after write
and the reading one acquire (or any stronger memory barrier).
2/ Any read from a mutable reference in the same thread will see
the updates in a sequentially consistent manner.
Sounds good ? This definitively allow to do RC for
const/immutable without throwing away optimization opportunities.
More information about the Digitalmars-d
mailing list