bug-gnulib
[Top][All Lists]
Advanced

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

Re: [PATCH v2] implement full-blown select(2) for winsock


From: Bruno Haible
Subject: Re: [PATCH v2] implement full-blown select(2) for winsock
Date: Tue, 30 Sep 2008 23:46:58 +0200
User-agent: KMail/1.5.4

Hello Paolo,

> > How about adding an assertion like this?
> >
> > +   if (!timeout && rc == 0)
> > +     abort ();
> 
> But wouldn't this trigger in your case, thus aborting select() and poll()?

Yes it would currently abort in select(). But it would force us to fix the
problem in a way that does not violate the assumptions programs make about
select(). POSIX says:

  "If none of the selected descriptors are ready for the requested operation,
   the pselect() or select() function shall block until at least one of the
   requested operations becomes ready, until the timeout occurs, or until
   interrupted by a signal."

I have an abort() when my code calls select without timeout and select()
returns 0. It's better if this abort() is in the implementation of select(),
so that we can see the problem earlier.

> > The code above fails (or rather, WaitForSingleObject fails) when the 
> > above is run by two threads, not two processes. I originally tested it 
> > in two completely separate executables. Now that I want to run this 
> > within two threads in the same Windows DLL, WaitForSingleObject doesn't 
> > actually do any waiting.
> 
> Is it your case?

No, my case is a single-threaded program that reads and writes to a child
process through pipes.

> What about using a socketpair instead?  We can implement that for
> Windows using TCP/IP sockets.

No, please. I don`t need sockets. For communication with a subprocess, all
I need is a pipe. Sockets would be an overkill for that.

> >       {
> >         DWORD nbytes;
> >         if (PeekNamedPipe(fd,NULL,0,NULL,&nbytes,NULL)) { /* input pipe */
> >           if (nbytes > 0)
> >             return 3;
> >           else
> >             return 0;
> >         } else if (GetLastError()==ERROR_BROKEN_PIPE) { /* EOF reached */
> >           return 2;
> 
> ... and this could also be used to emulate POLLHUP on pipes, which is
> pretty cool because even Cygwin fails on that.

Yes. It took some amount of testing to find out how to detect these two
situations. The Microsoft docs are far from complete descriptions.

Bruno





reply via email to

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