November 30, 2019
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



November 30, 2019
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);
}