Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
June 07, 2008 GC Bug? Error: Unable to accept socket connection: Interrupted system call | ||||
---|---|---|---|---|
| ||||
I got this error under Linux while I didn't find it under Windows. This is the code: private import std.thread, std.stdio, std.gc, std.c.time, std.socket; Socket s; int test(void* arg){ s.bind( new InternetAddress( 8888 ) ); s.listen(10); Socket a = s.accept(); // never reach return 0; } int main() { s = new TcpSocket(); Thread th = new Thread( &test, null, 0 ); th.start(); sleep(1); std.gc.genCollect(); //raise error. return 0; } Obviously this problem occurred in std.gc.genCollect( or std.gc.fullCollect ). I am writing a server program and I met this problem and I am very sad now!! My server runs under Windows well on some machines but it always raises errors under Linux unless I disable gc!!! Became a little hate phobos :-( Help me please!! |
June 08, 2008 Re: GC Bug? Error: Unable to accept socket connection: Interrupted system call | ||||
---|---|---|---|---|
| ||||
Posted in reply to Huang Guan | == Quote from Huang Guan (gdxxhg@gmail.com)'s article
> I got this error under Linux while I didn't find it under Windows.
> This is the code:
> private import std.thread, std.stdio, std.gc, std.c.time, std.socket;
> Socket s;
> int test(void* arg){
> s.bind( new InternetAddress( 8888 ) );
> s.listen(10);
> Socket a = s.accept();
> // never reach
Are you saying the thread never completes? I might expect s.accept() to return prematurely if a GC cycle occurs, but I wouldn't expect it to lock up. But then I've never looked at std.socket, so perhaps there's a bug in the code. I can assure you that Tango doesn't have this problem :p
Sean
|
June 08, 2008 Re: GC Bug? Error: Unable to accept socket connection: Interrupted system call | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Sean Kelly Wrote:
> == Quote from Huang Guan (gdxxhg@gmail.com)'s article
> > I got this error under Linux while I didn't find it under Windows.
> > This is the code:
> > private import std.thread, std.stdio, std.gc, std.c.time, std.socket;
> > Socket s;
> > int test(void* arg){
> > s.bind( new InternetAddress( 8888 ) );
> > s.listen(10);
> > Socket a = s.accept();
> > // never reach
>
> Are you saying the thread never completes? I might expect s.accept() to return prematurely if a GC cycle occurs, but I wouldn't expect it to lock up. But then I've never looked at std.socket, so perhaps there's a bug in the code. I can assure you that Tango doesn't have this problem :p
>
>
> Sean
Yes, Tango doesn't have this problem and I am using it now.
I found there is a bug in class Stdout( Tango ). Once Stdout accessed by many threads, it raised some strange error such as exited without any warning.
|
June 08, 2008 Re: GC Bug? Error: Unable to accept socket connection: Interrupted system call | ||||
---|---|---|---|---|
| ||||
Posted in reply to Huang Guan | Huang Guan schrieb:
> Sean Kelly Wrote:
>
>> == Quote from Huang Guan (gdxxhg@gmail.com)'s article
>>> I got this error under Linux while I didn't find it under Windows.
>>> This is the code:
>>> private import std.thread, std.stdio, std.gc, std.c.time, std.socket;
>>> Socket s;
>>> int test(void* arg){
>>> s.bind( new InternetAddress( 8888 ) );
>>> s.listen(10);
>>> Socket a = s.accept();
>>> // never reach
>> Are you saying the thread never completes? I might expect s.accept()
>> to return prematurely if a GC cycle occurs, but I wouldn't expect it to
>> lock up. But then I've never looked at std.socket, so perhaps there's
>> a bug in the code. I can assure you that Tango doesn't have this
>> problem :p
>>
>>
>> Sean
>
> Yes, Tango doesn't have this problem and I am using it now.
> I found there is a bug in class Stdout( Tango ). Once Stdout accessed by many threads, it raised some strange error such as exited without any warning.
>
Stdout is not synchronized.
Since nomally you do not want to mix the output of multiple threads, this is ok.
If you want to do "printf debugging" from many threads, use the synchronized Trace.
import tango.util.log.Trace;
Trace.formatln( .... );
|
June 08, 2008 Re: GC Bug? Error: Unable to accept socket connection: Interrupted system call | ||||
---|---|---|---|---|
| ||||
Posted in reply to Huang Guan | == Quote from Huang Guan (gdxxhg@gmail.com)'s article
> Sean Kelly Wrote:
> > == Quote from Huang Guan (gdxxhg@gmail.com)'s article
> > > I got this error under Linux while I didn't find it under Windows.
> > > This is the code:
> > > private import std.thread, std.stdio, std.gc, std.c.time, std.socket;
> > > Socket s;
> > > int test(void* arg){
> > > s.bind( new InternetAddress( 8888 ) );
> > > s.listen(10);
> > > Socket a = s.accept();
> > > // never reach
> >
> > Are you saying the thread never completes? I might expect s.accept() to return prematurely if a GC cycle occurs, but I wouldn't expect it to lock up. But then I've never looked at std.socket, so perhaps there's a bug in the code. I can assure you that Tango doesn't have this problem :p
> >
> >
> > Sean
> Yes, Tango doesn't have this problem and I am using it now.
> I found there is a bug in class Stdout( Tango ). Once Stdout accessed by many threads, it raised some
strange error such as exited without any warning.
Stdout is not thread-safe. This is intentional, as adding thread safety
incurs a performance cost that the user may not want. If you must
write to Stdout from multiple threads, I suggest either looking at
the logging facilities (which are thread-safe), or synchronizing in
some other way, this being the simplest:
synchroized(Stdout) Stdout( "blah" );
Sean
|
Copyright © 1999-2021 by the D Language Foundation