bug-gnulib
[Top][All Lists]
Advanced

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

Re: blocking socket is nonblocking after calling gnulib select() in wind


From: Ray Satiro
Subject: Re: blocking socket is nonblocking after calling gnulib select() in windows
Date: Wed, 20 Apr 2011 23:59:08 -0700 (PDT)

> On Wed, Apr 20, 2011 at 7:17 PM, Bastien ROUCARIES
> <address@hidden>  wrote:
> >> Is the gnulib select() only intended to be used with  nonblocking sockets 
on
> >> windows?
> >
> > I have just tested  the program at the end of the file, it thread is
> > blocked when enable =0  (block socket) and enable=1 it fail with
> > WSAEWOULDBLOCK
> >
> >  So i possible stragegy will be:
> > 1. createathread TID from parent
> >  2. in TID do WSAIoctl(sock, SIO_ADDRESS_LIST_CHANGE,NULL, 0, NULL,
> >  0,&bytes,NULL,NULL);
> > 3. in  parent: if TID returned with  WSAEWOULDBLOCK tag socket non blocking
> > 4. query running state of TID, if  suspended socket is blocking, kill
> > thread and mark socket  blocking
> 
> It will not work using a thread (thread are not cancelable  under
> windows), but using a new process with inherited socket it will  work
> slow but a little bit as the projected openat function using  fork
> 

Hi, thanks for your replies guys. 

Bastien, The problem with sending io control codes is there will likely be 
unintended consequences if used as you theorize. From what I've seen so far 
there is no way to determine the blocking state without sending a control code, 
or in other words, actually making the request. If the socket is blocking then 
it will block. If blocking, killing the thread that's waiting on the event 
you'd 
be killing the waiting not the pending operation, although I haven't tested 
that 
so I can't say for certain.

api monitor shows:
Either SIO_ADDRESS_LIST_CHANGE or SIO_ROUTING_INTERFACE_CHANGE will result in 
ntdeviceiocontrol(socket, event, ...
If the socket is nonblocking the immediate return is STATUS_DEVICE_NOT_READY. 
If 
it is blocking then the immediate return is   STATUS_PENDING and wsaioctl waits 
for a signal which is set when the operation completes.

I think for now I will submit code for Wget that will disable NBIO immediately 
after rpl_select() returns or instead use ms select() with FD_TO_SOCKET.


Thanks,

Jay




reply via email to

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