View mode: basic / threaded / horizontal-split · Log in · Help
October 26, 2012
Compiling shared example.
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
October 28, 2012
Re: Compiling shared example.
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
October 28, 2012
Re: Compiling shared example.
Am 28.10.2012, 08:06 Uhr, schrieb Ali Çehreli <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 = 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

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
October 29, 2012
Re: Compiling shared example.
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
Top | Discussion index | About this forum | D home