Hello,

On linux, in the code below, receive() returns -1 with errno=EINTR if syscall is interrupted by GC (so you can see several "insterrupted") when GC enabled, and prints nothing (this is desired and expected behavior) when GC disabled.

Looks like the reason of the problem is call sigaction(2) without SA_RESTART for SIGUSR2 (used by GC to restart suspended thread) in core.thread.

Is there any recommended workaround for this problem? Is this a bug?

Thanks for your help with this problem

import std.stdio;
import std.format;
import std.socket;
import std.conv: to;
import core.stdc.errno;
import core.memory;
import std.datetime;

auto myRequest(string x)
{
    auto data = new byte[100240];
    ubyte[16*1024] buffer;
    auto timeout = 5.seconds;
    uint delay = to!uint(x) % 5;
    auto addresses = getAddress("httpbin.org", 80);
auto s = new Socket(AddressFamily.INET, SocketType.STREAM, ProtocolType.TCP);
    scope(exit) {
        s.close();
    }
s.setOption(SocketOptionLevel.SOCKET, SocketOption.SNDTIMEO, timeout);
    s.connect(addresses[0]);
s.send("GET /delay/%d HTTP/1.1\r\nHost: httpbin.org\r\n\r\n".format(delay)); s.setOption(SocketOptionLevel.SOCKET, SocketOption.RCVTIMEO, timeout);
    auto r = s.receive(buffer);
    if ( r <= 0 ) {
        if ( errno == EINTR ) {
            writeln("interrupted");
            return "fail";
        }
    }
    return "ok";
};

void main() {
    import std.parallelism;
    import std.range: iota;
    import std.algorithm: map;
    //GC.disable();
    defaultPoolThreads(8);
    auto r = iota(0, 100).map!(to!string);
    auto p = taskPool.map!myRequest(r); // fails
}

Reply via email to