Does anyone understand how to use "shared" types with concurrency send/receive functions?
    Arek via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Sat Aug 12 11:57:44 PDT 2017
    
    
  
I have the folowing problem:
I like to envelope the class object in struct to control the 
destruction moment and then send this object to another 
thread/fiber (or task, cause I use vibe-d).
I can't find any method to make it working. Any ideas?
dmd (version 075) gives so stupid results, I belive it's broken 
(I've created the issue 
https://issues.dlang.org/show_bug.cgi?id=17749 )
ldc2 returns some errors:
.../import/std/variant.d(610,27): Error: function 
core.stdc.string.memcpy (void* s1, const(void*) s2, ulong n) is 
not callable using argument types (ubyte[32]*, 
shared(Env!(shared(A)))*, ulong)
.../import/std/conv.d(4186,9): Error: static assert  "Cannot 
emplace a Env!(shared(A)) because Env!(shared(A)).this(this) is 
annotated with @disable."
.../import/std/conv.d(4198,24):        instantiated from here: 
emplaceRef!(Env!(shared(A)), Env!(shared(A)), Env!(shared(A)))
.../import/std/variant.d(301,35):        instantiated from here: 
emplaceRef!(Env!(shared(A)), Env!(shared(A)))
.../import/std/variant.d(630,21):        instantiated from here: 
handler!(shared(Env!(shared(A))))
.../import/std/variant.d(544,17):        ... (5 instantiations, 
-v to show) ...
../../../.dub/packages/vibe-core-1.1.1/vibe-core/source/vibe/core/concurrency.d(1223,64):        instantiated from here: send!(shared(Env!(shared(A))))
app.d(74,7):        instantiated from here: 
send!(shared(Env!(shared(A))))
The code may be complied like this: dub --single --compiler=ldc2 
./app.d   (assuming it's saved in app.d file).
/+
dub.sdl:
name "simple"
dependency "vibe-core" version="~>1.1.0"
+/
import std.stdio;
import std.format;
import vibe.core.core;
import vibe.core.task;
import vibe.core.concurrency;
// simple class with destructor
shared class A
{
	int i;
	this(int i)
	{
		this.i = i;
	}
	~this()
	{
		writeln("destruct ", i);
	}
}
shared struct Env(T) if (is(T == class) && is(T == shared))
{
	T obj;
	this(T o)
	{
		obj = obj;
	}
	this(this)
	{
		// some magic here
	}
	auto opAssign(shared(Env!T) other)
	{
		obj = other.obj;
		return this;
	}
	auto opAssign(ref shared(Env!T) other)
	{
		obj = other.obj;
		return this;
	}
	~this()
	{
		if (obj !is null)
			destroy(obj);
		obj = null;
	}
}
void main()
{
	auto consumer = runTask({
		auto got = receiveOnly!(shared Env!(shared A))();
		writeln(typeof(got).stringof);
	});
	auto producer = runTask({
		auto a = new shared A(1);
		shared b = shared Env!(shared A)(a);
		writeln(typeof(b).stringof);
		send(consumer, b);
	});
	runApplication();
}
    
    
More information about the Digitalmars-d-learn
mailing list