On 8/15/17 5:27 PM, Arek wrote:
On Tuesday, 15 August 2017 at 10:37:08 UTC, Kagamin wrote:
Well, no wrapper is actually needed here:

class A
{
    int method() shared;
}

void consumer()
{
    shared a = receiveOnly!(shared A)();
}

void producer()
{
    auto cons = spawn(&consumer);
    send(cons, new shared A());
}

Yes, but this doesn't compile:

import std.stdio;
import std.concurrency;

struct A
{
     int t;
     int r;
     int method() shared
     {
         return 0;
     }
}

void consumer()
{
     shared a = receiveOnly!(shared A)();
}

void main()
{
     auto cons = spawn(&consumer);
     send(cons, shared A());
}

The issue is that send cannot handle shared value types due to a bug in the implementation. In essence, there is no reason to send a shared A -- it's an unrelated copy and not actually shared.

You can send a shared reference to an A just fine:

static shared A a;

send(tid, &a); // works

You *should* be able to send a shared(A). There is no reason to disallow it. But again, it's not super useful.

This very simple code also doesn't compile:

shared struct S
{
     int i;

     ~this()
     {
     }
}

void main()
{
     shared s = shared S();
}

In general, shared structs with postblit and destructor make problems.

postblit should work.

It does look like destructors are a problem. It appears the compiler attempts to call the destructor while unshared.

-Steve

Reply via email to