December 07, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9122

           Summary: std.concurrency send() fails with multiple arrays
           Product: D
           Version: D2
          Platform: x86_64
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody@puremagic.com
        ReportedBy: john.loughran.colvin@gmail.com


--- Comment #0 from John Colvin <john.loughran.colvin@gmail.com> 2012-12-07 06:04:25 PST ---
import std.concurrency;
import std.stdio;

void foo() {
    bool running  = true;
    while(running) {
         receive(
        (immutable(double)[] a, immutable(double)[] b, int i) {
        writeln(a, b, i);
        },
        (OwnerTerminated e) {
        running = false;
        }
    );
    }
}

void main() {
    double[] a,b;
    a = [1.1];
    b = [2.2];
    int i= 3;

    auto tid = spawn(&foo);

    tid.send(a.idup, b.idup, i);
}

I get: core.exception.AssertError@ std/variant.d(277): target must be non-null

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 03, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


David Eagen <david@eagen.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |david@eagen.com


--- Comment #1 from David Eagen <david@eagen.com> 2013-01-03 04:44:21 PST ---
This is probably related to issue 7069.

The problem also occurs on structs like this:

import std.concurrency, std.exception, std.stdio;

struct Combined
{
  string str1;
  string str2;
  bool status;
}

void main() {
   auto tid = spawn(&worker);
   Combined c = Combined("one", "two", false);
   tid.send(c);
}

void worker() {
  for (bool running = true; running; )
  {
    receive(
        (Combined c)
        {
          writeln("Got ", c.str1, "\t", c.str2, "\t", c.status);
        },

    (OwnerTerminated unused)
    {
      running = false;
    }
    );
  }
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 03, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


David Eagen <david@eagen.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |major


--- Comment #2 from David Eagen <david@eagen.com> 2013-01-03 05:51:35 PST ---
Bumping importance. This issue makes it impossible for me to move to 2.061 because it breaks all my applications that use message passing for concurrency.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 05, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


David Eagen <david@eagen.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|major                       |regression


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 31, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


Martin Krejcirik <mk@krej.cz> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mk@krej.cz


--- Comment #3 from Martin Krejcirik <mk@krej.cz> 2013-03-31 15:59:08 PDT ---
Code from comment #1 works for me in 32 bit, but I get the same error message
("target must be non-null") when the size of a message (Combined.sizeof)
exceeds 24 bytes.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 19, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


Zhenya Chapovsky <zheny@list.ru> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |zheny@list.ru


--- Comment #4 from Zhenya Chapovsky <zheny@list.ru> 2013-04-19 10:02:44 PDT ---
Is anyone working on this issue?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 23, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


Tavi Cacina <octavian.cacina@outlook.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |octavian.cacina@outlook.com


--- Comment #5 from Tavi Cacina <octavian.cacina@outlook.com> 2013-04-23 11:45:43 PDT ---
I hit this bug too as I wanted to send a structure. Martin Krejcirik was right about the size of the structure. As soon as the message to be sent exceeds 20 bytes (win32) it comes to the assert. I see that the problem is with the default generated opAssign for the struct Message in std.concurrency. This Message has a "Variant data" attribute that needs to be copied.

I could reproduce the error like this:
---
struct S { int p1, p2, p3, p4, p5, p6; }
Variant v1 = S();
Variant v2;
v2 = v1; // assert
---

The Variant is defined like:
alias VariantN!(maxSize!(creal, char[], void delegate())) Variant;
so it has already a fixed size. The constructor can cope with the bigger size
and will adjust, but the opAssign does not. I do not know if it is a bug that
the constructor allows it or that the opAssign does not.

A possible fix would be to add an opAssign operator to the Message structure:

---
ref Message opAssign(Message rhs)
{
    type = rhs.type;
    swap(data, rhs.data);
    return this;
}
---

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 15, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


Martin Nowak <code@dawg.eu> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |code@dawg.eu


--- Comment #6 from Martin Nowak <code@dawg.eu> 2013-05-14 20:07:55 PDT ---
(In reply to comment #5)
> The Variant is defined like:
> alias VariantN!(maxSize!(creal, char[], void delegate())) Variant;
> so it has already a fixed size. The constructor can cope with the bigger size
> and will adjust, but the opAssign does not.

OpAssign moves the assigned value onto the heap so this is not the problem. https://github.com/D-Programming-Language/phobos/blob/c319b1578f28e00124d2f0c2a492790d01ca5159/std/variant.d#L545

Also the following code works correctly for me on 2.062.
---
import std.variant, std.stdio;

struct S { int p1, p2, p3, p4, p5, p6; }

void main()
{
    Variant v1 = S(1, 2, 3, 4, 5, 6);
    writeln(v1);
    Variant v2;
    writeln(v2);
    v2 = v1; // assert
    writeln(v2);
}
---

The bug seems to be in the handler for OpID.copyOut.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 15, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122


Tavi Cacina <octavian.cacina@outlook.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           See Also|                            |http://d.puremagic.com/issu
                   |                            |es/show_bug.cgi?id=10017


--- Comment #7 from Tavi Cacina <octavian.cacina@outlook.com> 2013-05-14 23:54:37 PDT ---
(In reply to comment #6)
> 
> Also the following code works correctly for me on 2.062.

yes, here I have a wrong sample, the structure size must exceed 32bytes. The S should be: struct S { int[9] s; }

See #10017 - Can not assign to a Variant another Variant holding a bigger
structure
I also made a pull request for it (
https://github.com/D-Programming-Language/phobos/pull/1281 ) but David
Nadlinger wants to fix the fact that these Variant assignments trigger a
reallocation even if there already is a heap value (comments in pull).

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 28, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9122



--- Comment #8 from David Eagen <david@eagen.com> 2013-05-27 18:10:07 PDT ---
This is now resolved after the fix for 10017 (https://github.com/D-Programming-Language/phobos/commit/5ddf3bc19a240b77255c9583aee3d35a9157cd8c) on x86_64 Linux.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home