Interrupted System Call

Jarrett Billingsley kb3ctd2 at yahoo.com
Wed Jul 23 05:42:23 PDT 2008


"Peter Neubauer" <peterneubauer2 at gmail.com> wrote in message 
news:g66s1f$120h$1 at digitalmars.com...
> Hello everyone,
>
> I've been getting the error message "Interrupted System Call" a lot 
> lately, ever since I started using threads in D. It appears whenever one 
> of the threads in my application creates and uses an associative array 
> while another thread executes a blocking system call such as readln or 
> receive on sockets. Here is an example:
>
> =====================
>
> import std.stdio;
> import std.thread;
>
> int readlnfunc (void* arg)
> {
> readln();
> return 0;
> }
>
> void main ()
> {
> (new Thread (&readlnfunc, null)).start();
>
> while (true) {
> int[int] aa;
> aa[0] = 0;
> }
> }
>
> =====================
>
> I'm using dmd 1.033 on Ubuntu 8.04.
>
> This looks like a bug to me; I don't know how to fix it or work around it 
> either. Sometimes the error doesn't throw up an exception, but it still 
> prevents me from using some other functions:
>
> =====================
>
> import std.socket;
> import std.stdio;
> import std.thread;
>
> int serverfunc (void* arg)
> {
> Socket listener = new TcpSocket ();
> listener.bind (new InternetAddress(1234));
> listener.listen(10);
> Socket socket = listener.accept ();
> assert (socket.isAlive);
>
> ubyte[512] buf;
> int bytes = socket.receive(buf);
> writefln ("Server: Received %d bytes.", bytes);
>
> socket.shutdown (SocketShutdown.BOTH);
> socket.close;
> listener.close;
> return 0;
> }
>
> int clientfunc (void* arg)
> {
> Socket socket = new TcpSocket(new InternetAddress("127.0.0.1", 1234));
> assert (socket.isAlive);
>
> ubyte[512] buf;
> int bytes = socket.receive(buf);
> writefln ("Client: Received %d bytes.", bytes);
>
> socket.shutdown (SocketShutdown.BOTH);
> socket.close();
> return 0;
> }
>
> void main ()
> {
> (new Thread (&serverfunc, null)).start();
> (new Thread (&clientfunc, null)).start();
>
> for (int i = 0; i < 100000; ++i) {
> int[int] aa;
> aa[0] = 0;
> Thread.yield();
> }
> }
>
> =====================
>
> A simple server-client connection and both call receive(). Both these 
> calls return Socket.ERROR, and the error disappears when I take out the aa 
> in main. Optionally, if I put the aa in another extra thread and let the 
> loop run before the client connects, accept() from the server will spit 
> out an "Interrupted System Call".
>
> Does anyone have any suggestions on how to fix or work around this 
> problem? I couldn't find anyone else who had it.
>
> -Peter

See the "linux system calls are canceled by D GC" thread on 
digitalmars.D.bugs.  I think this is what you're experiencing. 




More information about the Digitalmars-d-learn mailing list