www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - vibe.d requestHTTP in static this causes infinite loop?

reply Vijay Nayar <madric gmail.com> writes:
I've encountered an unusual behavior that I have no good 
explanation for. Consider the following code example:

```d
import vibe.core.log : logInfo;
import vibe.http.client : requestHTTP, HTTPClientRequest, 
HTTPClientResponse;
import vibe.http.common : HTTPMethod;
import vibe.stream.operations : readAllUTF8;

void doThing() {
   requestHTTP("http://example.com/",
       (scope HTTPClientRequest req) {
         logInfo("Setting request method.");
         req.method = HTTPMethod.GET;
       },
       (scope HTTPClientResponse res) {
         logInfo("Log point 1");
         string data = res.bodyReader.readAllUTF8();
         logInfo("Log point 2: %s", data);
       });
}

static this() {
   logInfo("--- static this() ---");
   doThing();
}

void main(string[] args) {
   logInfo("--- main() ---");
   doThing();
}
```

The output of this program is actually an infinite loop with 
output of the form:
```
[Eventcore DNS Lookup(----) INF] --- static this() ---
[Eventcore DNS Lookup(----) INF] --- static this() ---
```

If I remove the call from `static this()`, then the web call 
works as normal. Any idea why calling vibe.d's `requestHTTP` 
function inside of a module's static construction would cause an 
infinite loop?
May 19 2022
parent reply =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 5/19/22 16:44, Vijay Nayar wrote:

 If I remove the call from `static this()`, then the web call works as
 normal. Any idea why calling vibe.d's `requestHTTP` function inside of a
 module's static construction would cause an infinite loop?
I am not experienced with vibe.d. 'static this' is executed per thread. If requestHTTP starts a new thread, then I can see how you would be in an infinite loop. I wonder whether it should be 'shared static this' (which is executed once per program, not per thread). Ali
May 19 2022
next sibling parent bauss <jj_1337 live.dk> writes:
On Friday, 20 May 2022 at 01:41:59 UTC, Ali Çehreli wrote:
 On 5/19/22 16:44, Vijay Nayar wrote:

 If I remove the call from `static this()`, then the web call
works as
 normal. Any idea why calling vibe.d's `requestHTTP` function
inside of a
 module's static construction would cause an infinite loop?
I am not experienced with vibe.d. 'static this' is executed per thread. If requestHTTP starts a new thread, then I can see how you would be in an infinite loop. I wonder whether it should be 'shared static this' (which is executed once per program, not per thread). Ali
Static constructor shouldn't be there at all in this case, since it's not constructing anything. He shouldn't really use anything but main in this case.
May 19 2022
prev sibling parent Vijay Nayar <madric gmail.com> writes:
On Friday, 20 May 2022 at 01:41:59 UTC, Ali Çehreli wrote:
 On 5/19/22 16:44, Vijay Nayar wrote:

 If I remove the call from `static this()`, then the web call
works as
 normal. Any idea why calling vibe.d's `requestHTTP` function
inside of a
 module's static construction would cause an infinite loop?
I am not experienced with vibe.d. 'static this' is executed per thread. If requestHTTP starts a new thread, then I can see how you would be in an infinite loop. I wonder whether it should be 'shared static this' (which is executed once per program, not per thread). Ali
Very clever, you were exactly right. I had not thought of that, but that is indeed what was happening.
May 20 2022