Large (>32 byte) concurrency messages

JR zorael at gmail.com
Fri Aug 9 03:04:08 PDT 2013


On Thursday, 8 August 2013 at 21:11:06 UTC, Ali Çehreli wrote:
> An immutable on the receiving side is a request to the caller 
> that the data must be immutable. If you are casting data with 
> mutable indirection to immutable, anything can happen.
>
> immutable data is by nature not synchronized because it is 
> read-only. (Of course you can synchronize if you know that it 
> is casted data to begin with.)
>
> Have you considered the 'shared' attribute? You are still 
> responsible for dealing with race conditions.

Do you mean declaring the struct instance itself as shared and 
then passing its pointer? If so, I could not get receive() to 
catch it as anything other than a Variant, no matter how I tried.

> shared IrcEvent evt = p.parse(raw);
> tid.send(&evt);
> /* ... elsewhere ... */
> receive(
>     (shared IrcEvent* evt) {
>         writefln("%s: %s", typeof(evt).stringof, evt);
>     },
>     (Variant v) {
>         writefln("Variant: %s", v);  // <-- this is where it 
> goes, as a shared(IrcEvent)*
>     }
> );

Sending it by (shared) value hits the same assertion in 
variant.d; target must be non-null. And if I still have to deal 
with the race if I go with a shared pointer, as you say, then it 
may be semantically more correct but my code will still be as 
broken. :>

I understand that the pointer goes invalid when the scope ends -- 
I just... don't know what other approach to take if I can't pass 
it by value.

I'm using gdc 4.8.1 (which is based on 2.062) and I would upgrade 
in a heartbeat, but this is the latest version available in 
Canonical's saucy repositories. It's not impossible to compile 
and package it myself, and if that's the only solution available 
then that's what I'll have to do. Iain Bucklaw seems to have a 
personal repository[1] but its packages are from 2010, so it 
seems I cannot ride on the success of others'. ;3


[1]: https://launchpad.net/~ibuclaw/+archive/ppa


More information about the Digitalmars-d-learn mailing list