Issue 10740 - std.concurrency send() fails with structs over 32 bytes
Summary: std.concurrency send() fails with structs over 32 bytes
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: x86_64 Linux
: P2 major
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-07-31 21:44 UTC by David Eagen
Modified: 2024-12-01 16:18 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description David Eagen 2013-07-31 21:44:11 UTC
Using 2.063.2 and 2.064-devel-333c6dd:

import std.concurrency : receiveOnly, send, thisTid;
import std.exception : assumeUnique;
import std.variant;

struct JustRight
{
    byte[32] j;
}

struct TooBig
{
    byte[33] t;
}

void main()
{
    JustRight[1] jArray;
    TooBig[1]    tArray;

    Variant vj = jArray[];
    Variant vt = tArray[];

    thisTid.send(vj);
    thisTid.send(vt);

    thisTid.send(assumeUnique(jArray[]));
    //thisTid.send(assumeUnique(tArray[])); // Fails to compile

    auto received = receiveOnly!((JustRight)[]);
}

If the send of tArray is commented out the compilation fails with:

src/phobos/std/variant.d(558): Error: cannot modify immutable expression *p

So, 32-byte structs can be sent (as arrays) using send or if you first wrap it in an Variant object. Greater than 32-byte structs can be sent ONLY if they are pre-wrapped in a Variant. The size of the data shouldn't limit it from being sent using send().
Comment 1 David Eagen 2013-08-01 04:33:47 UTC
Should have said:

"If the send of tArray is uncommented the compilation fails with:"
Comment 2 Johannes Pfau 2013-08-24 06:08:34 UTC
There recently was a bug report for GDC/ARM regarding this. As variants max size is determined by creal which is only 16 bytes on most non-x86 architectures this error already happens with structs > 16 bytes on these architectures.

Another test case with different error message:
---------
struct Big
{
	int[10] a;
}

import std.concurrency, std.variant, core.thread;

void loop()
{
	while(true)
	{
		Thread.sleep(seconds(10));
	}
}

void main()
{
	auto x = spawn(&loop);
	x.send(Big());
}
---------
http://dpaste.dzfl.pl/f103dbac

core.exception.AssertError@/opt/compilers/dmd2/include/std/variant.d(280): target must be non-null
Comment 3 Martin Krejcirik 2014-01-07 18:45:32 UTC
Comment #2 is bug 9122. Comment #0 still open (the limit is 24 bytes for me).
Comment 4 secondaryAccount 2015-09-02 18:43:20 UTC
still valid with dmd 2.068, but the location of the error changed:
 dmd/phobos/std/variant.d(634): Error: cannot modify immutable expression *p
 dmd/phobos/std/variant.d(420): Error: template instance std.variant.VariantN!32LU.VariantN.opAssign!(immutable(TooBig)) error instantiating
[...]
Comment 5 dlangBugzillaToGithub 2024-12-01 16:18:29 UTC
THIS ISSUE HAS BEEN MOVED TO GITHUB

https://github.com/dlang/phobos/issues/9612

DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB