chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] udp egg on win32


From: Daishi Kato
Subject: Re: [Chicken-users] udp egg on win32
Date: Sun, 05 Feb 2006 13:15:15 +0900
User-agent: Wanderlust/2.15.1 (Almost Unreal) Emacs/21.4 Mule/5.0 (SAKAKI)

Hi Hans,

At Sat, 4 Feb 2006 15:38:48 +0100,
Hans Bulfone wrote:
> > Recently, I'm working on win32, and found one thing.
> > (udp-recvfrom) blocks when it's run in a thread.
> > Of cource, with a non-blocking socket.
> 
> i don't know very much about windows networking stuff, but i hope
> my thoughts might be helpful anyway.
> 
> i may be wrong, but imho the distinction between blocking
> and non-blocking sockets in udp-open-socket/udp-open-socket*
> is not very useful with chicken, because you always need
> non-blocking sockets if you don't want the recv()-calls
> to block all threads. (or you select() before every
> recv() call)
> 
> the udp-recv... procedures always block the current thread
> because of the restart-nonblocking loop.

Yes, I know this. Basically, I first code on linux,
and port it to win32. It works fine on linux.

> > Looking into tcp.scm, I noticed that 
> > some (##sys#thread-block-for-i/o) are commentted out.
> > So the same thing is done in udp.scm,
> > and it worked.
> 
> you mean the (udp-recvfrom) does not block the current thread
> then? or does not block all threads?

All threads, I meant.

> imho, they should not be commented out, because they are
> needed to tell the scheduler that the thread is waiting
> for some socket to be ready for reading or writing.
> 
> the scheduler then only invokes the thread when the
> socket is ready.

So, is it like a select() call?

> without the ##sys#thread-block-for-i/o call, the scheduler
> invokes the thread repeatedly, the thread calls recv(),
> gets EWOULDBLOCK and (yield)s again.  this wastes a lot of
> cpu time, especially when all threads are waiting for i/o.

Ah, you are right. This is why it worked on win32.
I guess ##sys#thread-block-for-i/o does not work correctly
on win32, and without it, the thread is invoked repeatedly,
letting the program work WITH lots of cpu time...

Would there be a piece of code to see if
##sys#thread-block-for-i/o is really working?

> but ihmo, (udp-recvfrom) would still block the current thread,
> calling recv() in a loop, when you remove the
> ##sys#thread-block-for-i/o.

Yeah, but I was talking about the entire process (all threads).
Sorry about my unclear explanation.

Daishi




reply via email to

[Prev in Thread] Current Thread [Next in Thread]