www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Referance usage in async function

reply kerdemdemir <kerdemdemir gmail.com> writes:
I have simplified my problem which can be seen below.

import std.stdio;
import vibe.core.core;
import vibe.core.concurrency;
import vibe.data.json;

void main()
{
     int[] list;

     bool ListManipulator(ref int[] list)
     {
         list ~= 2;
         list ~= 4;
         return true;
     }

     bool ListManipulatorPointer( int[]* list)
     {
         *list ~= 2;
         *list ~= 4;
         return true;
     }


     auto future = vibe.core.concurrency.async(&ListManipulator, 
list);
     future.getResult();

     writeln(list); ----> prints empty list

     future = vibe.core.concurrency.async(&ListManipulatorPointer, 
&list);
     future.getResult();

     writeln(list); ----> prints [2,4]
}


Why passing the pointer works meanwhile passing as reference does 
nothing? I feel that is more D issue than vibe.d which I can 
learn something I hope.

Erdem
Nov 30 2019
parent aliak <something something.com> writes:
On Saturday, 30 November 2019 at 13:45:00 UTC, kerdemdemir wrote:
 I have simplified my problem which can be seen below.

 import std.stdio;
 import vibe.core.core;
 import vibe.core.concurrency;
 import vibe.data.json;

 void main()
 {
     int[] list;

     bool ListManipulator(ref int[] list)
     {
         list ~= 2;
         list ~= 4;
         return true;
     }

     bool ListManipulatorPointer( int[]* list)
     {
         *list ~= 2;
         *list ~= 4;
         return true;
     }


     auto future = vibe.core.concurrency.async(&ListManipulator, 
 list);
     future.getResult();

     writeln(list); ----> prints empty list

     future = 
 vibe.core.concurrency.async(&ListManipulatorPointer, &list);
     future.getResult();

     writeln(list); ----> prints [2,4]
 }


 Why passing the pointer works meanwhile passing as reference 
 does nothing? I feel that is more D issue than vibe.d which I 
 can learn something I hope.

 Erdem
Looks like a bug in vibe: https://github.com/vibe-d/vibe-core/blob/master/source/vibe/core/concurrency.d#L1141 The function async doesn't use auto ref on ARGS. So the arguments are value copies through. If it used auto ref all the way through then it'd probably work: --- import std; void async(CALLABLE, ARGS...)(CALLABLE callable, auto ref ARGS args) { callable(args); } void main() { int[] list; bool ListManipulator(ref int[] list) { list ~= 2; list ~= 4; return true; } async(&ListManipulator, list); writeln(list); }
Nov 30 2019