On Sat, 9 Nov 2013 14:45:30 -0500, Shammah Chancellor wrote:

Sönke,

Alright. I've tried using shared classes, Isolated classes, and
immutable classes. None of them work for a variety of reasons:

shared classes <-- Don't work because of external dependencies.
Making every member variable shared, breaks too much stuff.
Isolated classes <-- I need to be able to send the same reference to
multiple threads, so .move() is out of the question.
Immutable classes <-- Can't even get them to instantiate since the
constructors have to be strongly pure. Also, I can't deserialize into
an immutable class!

How am I supposed to send complex class messages?

R/
Shammah

You should try the lock() function in vibe.core.concurrency! It uses a scheme if shared usage that Walter Bright once proposed in a discussion and it makes shared with classes actually bearable.

Basically you just define a normal class without any shared annotations, but create the instance using auto c = cast(shared)new C. You will then not be able to use any methods of that class, but calling c.lock() will give you back scoped access while the instance's monitor is locked. Beware though that only access to pure methods is allowed to guarantee safety (no unshared references must escape), but this is currently not enforced due to compiler issues I had some time ago (not sure how DMD 2.064 behaves now).