digitalmars.D.learn - Am I missing with ref in this code?
- Suliman (10/10) Jan 24 2019 I am doing very small link-checker. Here is' code
- Paul Backus (10/20) Jan 24 2019 It's because runWorkerTask internally passes its arguments along
- Suliman (6/15) Jan 24 2019 void getServiceStatus(MyUrl* url)
- Paul Backus (6/8) Jan 24 2019 You've forgotten to change the call site to pass a pointer.
- Jesse Phillips (5/15) Jan 26 2019 You're writing asynchronous code and expecting it to process
I am doing very small link-checker. Here is' code https://run.dlang.io/is/p8whrA I am expecting that on line: writefln("url: %s, status: %s", url.url, url.status); I will print link and it's status. But I am getting only: url: http://127.0.0.1:8081/hck, status: url: http://127.0.0.1:8081/hck2, status: url: http://127.0.0.1:8081/hck3, status: It's seems that I missed something with refs? Could you help me find error?
Jan 24 2019
On Thursday, 24 January 2019 at 15:28:19 UTC, Suliman wrote:I am doing very small link-checker. Here is' code https://run.dlang.io/is/p8whrA I am expecting that on line: writefln("url: %s, status: %s", url.url, url.status); I will print link and it's status. But I am getting only: url: http://127.0.0.1:8081/hck, status: url: http://127.0.0.1:8081/hck2, status: url: http://127.0.0.1:8081/hck3, status: It's seems that I missed something with refs? Could you help me find error?It's because runWorkerTask internally passes its arguments along to the function by value: https://github.com/vibe-d/vibe.d/blob/master/core/vibe/core/core.d#L364 The workaround is to pass a pointer instead: void getServiceStatus(MyUrl* url) { // ... } // ... runWorkerTask(&getServiceStatus, &url);
Jan 24 2019
It's because runWorkerTask internally passes its arguments along to the function by value: https://github.com/vibe-d/vibe.d/blob/master/core/vibe/core/core.d#L364 The workaround is to pass a pointer instead: void getServiceStatus(MyUrl* url) { // ... } // ... runWorkerTask(&getServiceStatus, &url);void getServiceStatus(MyUrl* url) { ... } Error: static assert: "Cannot convert arguments '(MyUrl)' to function arguments '(MyUrl*)'."
Jan 24 2019
On Thursday, 24 January 2019 at 16:04:06 UTC, Suliman wrote:Error: static assert: "Cannot convert arguments '(MyUrl)' to function arguments '(MyUrl*)'."You've forgotten to change the call site to pass a pointer. However, it turns out that even if you do that, vibe will not allow you to pass a pointer in this situation: .dub/packages/vibe-core-1.5.0/vibe-core/source/vibe/core/taskpool.d(114,21): Error: static assert: "Argument type MyUrl* is not safe to pass between threads." So, I'm not sure what the best solution here is.
Jan 24 2019
On Thursday, 24 January 2019 at 21:25:45 UTC, Paul Backus wrote:So, I'm not sure what the best solution here is.The best solution is just to pass a copy since there's no absolute need for a reference to be passed.
Jan 24 2019
On Thursday, 24 January 2019 at 22:02:36 UTC, bauss wrote:On Thursday, 24 January 2019 at 21:25:45 UTC, Paul Backus wrote:But if I will pass copy how I can create array of structures with correct response status? Create new structures?So, I'm not sure what the best solution here is.The best solution is just to pass a copy since there's no absolute need for a reference to be passed.
Jan 24 2019
Do I need in my code `ref`s ? https://run.dlang.io/is/8dtkC7 Or if vibed doing copy under the hood `ref`s useless?
Jan 25 2019
On Thursday, 24 January 2019 at 15:28:19 UTC, Suliman wrote:I am doing very small link-checker. Here is' code https://run.dlang.io/is/p8whrA I am expecting that on line: writefln("url: %s, status: %s", url.url, url.status); I will print link and it's status. But I am getting only: url: http://127.0.0.1:8081/hck, status: url: http://127.0.0.1:8081/hck2, status: url: http://127.0.0.1:8081/hck3, status: It's seems that I missed something with refs? Could you help me find error?You're writing asynchronous code and expecting it to process synchronized. Just make a synchronous call. If you need async use message passing with concurrency, probability on each call to the url so you can do the slow operations in parallel.
Jan 26 2019









Suliman <evermind live.ru> 