"Ralf S. Engelschall" wrote:
> > It appears that the intent of setting a file descriptor to non-blocking
> > mode via pth_fdmode() is to do for the thread what normal non-blocking
> > (without pth involved) does for a process.
> >
> > Is this the intent? If so, that's great.. but then there are a few bugs
> > in the implementation.
> 
> Yes, that is the intent.
> 
> > While pth_read() and pth_write() have been modified to properly handle
> > the PTH_FDMODE_NONBLOCK case, this still needs to be done for other
> > blocking syscalls, e.g. pth_connect() and pth_accept() to name two.
> > They will block the thread even if the fdmode is PTH_FDMODE_NONBLOCK.
> 
> Hmmm... yes, that's correct. My fault, I totally forgot these syscalls.
> 
> > I'd really like to see this fixed, and would be willing to supply
> > patches if that would help.
> 
> Sure, it certainly helps. Feel free to post a patch.

Thanks... it's attached (but untested).

Thanks,
-Archie

__________________________________________________________________________
Archie Cobbs     *     Packet Design     *     http://www.packetdesign.com
--- pth_high.c.orig     Sat Mar 24 06:49:58 2001
+++ pth_high.c  Thu Dec  6 09:53:30 2001
@@ -496,7 +496,7 @@
     errno_shield { pth_fdmode(s, fdmode); }
 
     /* when it is still on progress wait until socket is really writeable */
-    if (rv == -1 && errno == EINPROGRESS) {
+    if (rv == -1 && errno == EINPROGRESS && fdmode != PTH_FDMODE_NONBLOCK) {
         ev = pth_event(PTH_EVENT_FD|PTH_UNTIL_FD_WRITEABLE|PTH_MODE_STATIC, &ev_key, 
s);
         if (ev_extra != NULL)
             pth_event_concat(ev, ev_extra, NULL);
@@ -541,7 +541,8 @@
     /* poll socket via accept */
     ev = NULL;
     while ((rv = pth_sc(accept)(s, addr, addrlen)) == -1
-           && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+           && (errno == EAGAIN || errno == EWOULDBLOCK)
+           && fdmode != PTH_FDMODE_NONBLOCK) {
         /* do lazy event allocation */
         if (ev == NULL) {
             ev = pth_event(PTH_EVENT_FD|PTH_UNTIL_FD_READABLE|PTH_MODE_STATIC, 
&ev_key, s);

Reply via email to