[dmd-concurrency] is shared going to be a type modifier?
Sean Kelly
sean at invisibleduck.org
Thu Jan 7 15:26:11 PST 2010
I think the per-thread gc thing will still work but it would require
some compile-time magic to look for shared references. Seems feasible
if "new" were in the library.
Sent from my iPhone
On Jan 7, 2010, at 3:15 PM, Sean Kelly <sean at invisibleduck.org> wrote:
> On Jan 7, 2010, at 1:57 PM, Steve Schveighoffer wrote:
>>
>
>>> I'd think it would be pretty common to want a local reference to
>>> shared data.
>>> Then you wouldn't have to pay for the atomic read required if the
>>> reference
>>> itself is shared.
>>
>> I think more than const, we need something like this for shared.
>
> Yes. If it can be done with a wrapper like Rebindable then great.
> But not having any way around this would really stink.
>
>>> Yeah, a fully shared field inside a non-shared class doesn't sound
>>> right. The
>>> smoke test for me is that I think about whether it would work with
>>> per-thread
>>> GCs. If one thread has a reference to "shared" data that actually
>>> lives in
>>> another thread's heap or stack, there's a dangling reference issue
>>> if the thread
>>> terminates (at least in theory--the heap data could easily be
>>> handed off to the
>>> shared GC instead, but let's pretend this is impossible).
>>
>> Yeah, allowing this seems to imply that the global heap will have
>> to be scanned for local heap collections:
>>
>> class C
>> {
>> shared(int)* ptr1;
>> int *ptr2;
>> }
>>
>> I assume that marking a single member shared makes C get allocated
>> on the global heap.
>>
>> If ptr1 points to a global-heap variable, and ptr2 points to a
>> thread-local-heap variable, then you have to scan the global heap
>> in order to collect the memory ptr2 is pointing to.
>
> Until I learned that shared(x) doesn't actually work I didn't think
> this would be an issue. Maybe it won't anyway? With shared(int)*
> the type constructor behavior does kick in, right? So you should
> have a local pointer to a shared int. Classes are where this gets
> weird, and I guess you could have:
>
> class C
> {
> shared C ptr1;
> }
>
> shared C* x = &c.ptr1;
>
> Pointers to handles are legal, right?
>
>>>> Hm... this brings up an interesting point. If you want to say
>>>> that a
>>> reference to a shared class is a thread-local, how do you do
>>> that? For
>>> instance, in your struct A, you are most likely not going to share
>>> the actual
>>> reference lst (i.e. &a.lst), just what lst points to. However,
>>> the compiler is
>>> going to assume you are sharing lst because that's what you
>>> declared. So every
>>> access to lst is going to require special memory barriers (and
>>> technically
>>> wasted cycles). Is there going to be a way around this? With
>>> const it was not
>>> as important because const is a compile-time concept, but now the
>>> syntax
>>> deficiency is creeping into runtime and hurting performance. I.e.
>>> are we going
>>> to get an equivalent "Rebindable" type constructor?
>>>
>>> See my example of "shared (Something) p" above. This is
>>> consistent with how
>>> const and such work anyway.
>>
>> No it is not. If you have const(T) x, you can never rebind x, no
>> matter what type is inside the parens.
>
> Lame. Oh well. With const it isn't as big an issue.
> _______________________________________________
> dmd-concurrency mailing list
> dmd-concurrency at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-concurrency
More information about the dmd-concurrency
mailing list