On Sunday, 19 July 2015 at 17:12:07 UTC, rsw0x wrote:

a pointer to a pointer(or in this case, a reference) does not keep it alive.

Interesting. If you de-reference the pointer and assign it back, do you get back the keep-alive? Like, in the receiving thread:

void threadFunc()
{
    receive((Tid cli, immutable(Message) *m) {
        immutable(Message) msg = *m;           // <---
        int retCode = do_something_with(msg);
        send(cli, retCode);
    });
}

I assume that even if so, there is a race condition there. You would need to keep the original reference alive until at least the "msg = *m" assignment happened, right?

Or... could you tell the GC to leave the memory alone until the thread gets it? Like in the sending thread:

  Tid tid = spawn(&threadFunc);
  auto p = cast(void*) &msg;
  GC.addRoot(p);
  GC.setAttr(p, GC.BlkAttr.NO_MOVE);
  send(tid, thisTid(), &msg);
  //...

Is that possible? Is it efficient enough to do if you're sending lots and lots of messages?

Thanks.

Reply via email to