[dmd-concurrency] draft 7

Andrei Alexandrescu andrei at erdani.com
Mon Feb 1 13:49:27 PST 2010


Michel Fortin wrote:
> Le 2010-02-01 à 15:30, Andrei Alexandrescu a écrit :
> 
>> Michel Fortin wrote:
>>>> The program would compile successfully with the following
>>>> changes to nyukNyuk and sneaky: shared(double)* nyukNyuk; //
>>>> or: shared(double*) nyukNyuk; void sneaky(ref shared(double) r)
>>>> { nyukNyuk = &r; }
>>> How can that be safe? Leaking the reference, even as 'shared', 
>>> doesn't prevent someone from accessing the variable without
>>> acquiring the lock. Are you suggesting that mixing atomic
>>> operations and mutex synchronization for the same variable is
>>> okay? Because it's not.
>> You are making a good point. I thought of banning escapes
>> altogether. After all, if someone has access to a shared data
>> member and the synchronized method assumes it can temporarily
>> optimize access to that member as if it's unshared, things can get
>> messed up.
>> 
>> On the other hand, if you hand out a reference to a member, you're
>> kind of setting yourself up for surprises. Far as the type system
>> is concerned, it's doing the right thing.
> Escaping a value, even as 'shared', breaks the synchronization
> guaranties. If the type system cares about synchronization, then it
> should not allow a variable to escape.

OK, then all escaping from synchronized methods is out. I'm 80% 
convinced myself. Does everybody agree?

>> One related thought: a long time ago, Walter, Bartosz and I briefly
>> coquetted with the idea of using "scope" to denote an unescaping
>> parameter:
>> 
>> void print(scope int[] array) { ... }
>> 
>> With this signature print guarantees it won't escape anything in
>> array. Then synchronized functions can pass (addresses of) members
>> to functions like print.
> 
> That's a simple solution. It's limited, since you can't implement
> something like swap(ref int[], ref int[]) and thus not sorting
> algorithm, but it's better than nothing.

I think swap could be typed as:

swap(scope ref int[], scope ref int[]);

The point of scope parameter typechecking is that swap does not save a 
reference surreptitiously; I think escaping to another scope parameter 
should be fine (if somewhat conservative).

In fact I've had this idea for a while now that "ref" should imply "I 
won't escape it". That would make ref strictly pass-down. Walter is 
mildly favorable to that idea. I think it's worth giving it a closer 
look now.


Andrei


More information about the dmd-concurrency mailing list