November 30, 2019 Referance usage in async function | ||||
---|---|---|---|---|
| ||||
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 Re: Referance usage in async function | ||||
---|---|---|---|---|
| ||||
Posted in reply to kerdemdemir | 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); } |
Copyright © 1999-2021 by the D Language Foundation