www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Sending Tid in a struct

reply Nicolas Silva <nical.silva gmail.com> writes:
Hi,

I'm trying to send structs using std.concurrency. the struct contains
a Tid (the id of the sender) so that the receiver can send an answer.

say:

struct Foo
{
  Tid tid;
  string str;
}

// ...

Foo f = {
  tid: thisTid,
  str: "hello!"
};
std.concurrency.send(someThread, f);
// /usr/include/d/dmd/phobos/std/concurrency.d(465): Error: static
assert  "Aliases to mutable thread-local data not allowed."
// hello.d(15):        instantiated from here: send!(Foo)

However, I can send a Tid if I pass it directly as a parameter of the
send function instead of passing it within a struct.

Is this a bug ? It looks like so to me but I guess I could have missed
something.

thanks in advance,

Nicolas
Mar 03 2012
parent Timon Gehr <timon.gehr gmx.ch> writes:
On 03/03/2012 12:09 PM, Nicolas Silva wrote:
 Hi,

 I'm trying to send structs using std.concurrency. the struct contains
 a Tid (the id of the sender) so that the receiver can send an answer.

 say:

 struct Foo
 {
    Tid tid;
    string str;
 }

 // ...

 Foo f = {
    tid: thisTid,
    str: "hello!"
 };
 std.concurrency.send(someThread, f);
 // /usr/include/d/dmd/phobos/std/concurrency.d(465): Error: static
 assert  "Aliases to mutable thread-local data not allowed."
 // hello.d(15):        instantiated from here: send!(Foo)

 However, I can send a Tid if I pass it directly as a parameter of the
 send function instead of passing it within a struct.

 Is this a bug ? It looks like so to me but I guess I could have missed
 something.

 thanks in advance,

 Nicolas

Yes, this seems to be a bug. Workaround: struct Foo{ string s; Tid id; } void foo(){ Foo foo; receive((Tuple!(string,"s",Tid,"id") bar){foo=Foo(bar.s,bar.id);}); } void main(){ auto id = spawn(&foo); id.send("string",id); ... }
Mar 03 2012