www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Compiling shared example.

reply "Peter Sommerfeld" <noreply rubrica.at> writes:
To learn about shared attribute I've copied nearly verbatim an
example from Andreis book. The code:

import core.atomic;

struct Data{
   int value;
}

shared struct SharedStack(T) {

   private shared struct Node{
     T data;
     Node* next;
     this(T value){data = value;};
   }
   private Node* root;

   // push

   void push(T value){
     auto n = new Node(value);
     shared(Node)* oldRoot;
     do {
       oldRoot = root;
       n.next = oldRoot;
     } while(!cas(&root,oldRoot,n)); // line 30
   }
   // ...
}

SharedStack!(Data) q;

void main(string[] args){

   Data m;
   q.push(m); // line 40
}

I got the following error (dmd 2.060 win):

(40) Error function main.SharedStack!(Data).SharedStack.push(Data value)
shared is not callable using argument types (Data)

(30) template core.atomic.cas does not match any function template  
declaration

What is wrong here ?

Peter
Oct 26 2012
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 10/26/2012 02:22 PM, Peter Sommerfeld wrote:
 To learn about shared attribute I've copied nearly verbatim an
 example from Andreis book. The code:

 import core.atomic;

 struct Data{
 int value;
 }

 shared struct SharedStack(T) {

 private shared struct Node{
 T data;
 Node* next;
 this(T value){data = value;};
 }
 private Node* root;

 // push

 void push(T value){
 auto n = new Node(value);
 shared(Node)* oldRoot;
 do {
 oldRoot = root;
 n.next = oldRoot;
 } while(!cas(&root,oldRoot,n)); // line 30
 }
 // ...
 }

 SharedStack!(Data) q;

 void main(string[] args){

 Data m;
 q.push(m); // line 40
 }

 I got the following error (dmd 2.060 win):

 (40) Error function main.SharedStack!(Data).SharedStack.push(Data value)
 shared is not callable using argument types (Data)

 (30) template core.atomic.cas does not match any function template
 declaration

 What is wrong here ?

 Peter
The following two changes are the workaround at least for compilation: auto n = cast(shared)new Node(value); // ... shared SharedStack!(Data) q; Ali
Oct 28 2012
parent reply "Peter Sommerfeld" <noreply rubrica.at> writes:
Am 28.10.2012, 08:06 Uhr, schrieb Ali =C7ehreli <acehreli yahoo.com>:

 On 10/26/2012 02:22 PM, Peter Sommerfeld wrote:
 To learn about shared attribute I've copied nearly verbatim an
 example from Andreis book. The code:

 import core.atomic;

 struct Data{
 int value;
 }

 shared struct SharedStack(T) {

 private shared struct Node{
 T data;
 Node* next;
 this(T value){data =3D value;};
 }
 private Node* root;

 // push

 void push(T value){
 auto n =3D new Node(value);
 shared(Node)* oldRoot;
 do {
 oldRoot =3D root;
 n.next =3D oldRoot;
 } while(!cas(&root,oldRoot,n)); // line 30
 }
 // ...
 }

 SharedStack!(Data) q;

 void main(string[] args){

 Data m;
 q.push(m); // line 40
 }

 I got the following error (dmd 2.060 win):

 (40) Error function main.SharedStack!(Data).SharedStack.push(Data val=
ue)
 shared is not callable using argument types (Data)

 (30) template core.atomic.cas does not match any function template
 declaration

 What is wrong here ?

 Peter
The following two changes are the workaround at least for compilation:=
          auto n =3D cast(shared)new Node(value);
 // ...

 shared SharedStack!(Data) q;

 Ali
Thanks Ali, that keeps me going for now. But I wonder why I have do declare the variables shared if the data are declared to be shared. Is that a shortcoming of the current compiler ? Anyway, I can continue ... BTW: Thanks for your book! It is of great help for beginners like me! Peter
Oct 28 2012
parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 10/28/2012 02:46 AM, Peter Sommerfeld wrote:
 But I wonder why I
 have do declare the variables shared if the data are declared
 to be shared. Is that a shortcoming of the current compiler ?
I had to look this one up. According to the spec, a shared struct does not mean that the variables of that struct are automatically shared. It means that the members of the struct are shared: http://dlang.org/struct.html#ConstStruct Here is a test: import std.stdio; shared struct S { int i; int[] a; } void main() { auto s = S(); writeln(typeid(s)); writeln(typeid(s.i)); writeln(typeid(s.a)); } According to the output, the members are shared, not the struct: deneme.S shared(int) shared(shared(int)[])
 BTW: Thanks for your book! It is of great help for beginners
 like me!

 Peter
Thank you very much. It is really great to hear. :) Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.html
Oct 28 2012