Non-blocking socket still blocking!

Joel Sherrill joel.sherrill at OARcorp.com
Fri Sep 1 21:26:05 UTC 2000


WOW!!! I would say that is confirmation. :)

Got to love working in Internet time!!

Eric Norum wrote:
> 
> "Smith, Gene" wrote:
> >
> > I noticed that my read() on a supposedly non-blocking socket still blocked
> > after
> > I had read all data from the socket and called read() again.  I then checked
> >
> > the socket flags more closely to make sure I was really setting it
> > non-blocking
> > (O_NONBLOCK is 0x4000) with the following code:
> >
> > /* set new_sock non-blocking */
> > flags = 0;
> > flags = fcntl( new_sock, F_GETFL, 0);
> > DTRACE(("\nOrig flags = 0x%x", flags));
> > flags = flags | O_NONBLOCK;
> > DTRACE(("\nflags|O_NON_BLOCK=0x%x", flags));
> > if ( fcntl( new_sock, F_SETFL, flags ) < 0)
> >         RTEMS_PANIC(("\nCan't set new_sock non-blocking"));
> > DTRACE(("\nflags set to 0x%x", flags));
> >
> > /* verify non-blocking flag set */
> > flags = 0;
> > flags = fcntl( new_sock, F_GETFL, 0);
> > if ( (flags & O_NONBLOCK) == 0 )
> >         DTRACE(("\nBad flags = 0x%x", flags));
> > else
> >         DTRACE(("\nGood flags = 0x%x", flags));
> >
> > The following output trace indicates that my attempt to set the socket
> > non-blocking does not "stick."  (The value "new_sock" is the return value
> > from
> > accept().) Any ideas why the socket seems to remain blocking?
> >
> > Orig flags = 0x2
> > flags|O_NON_BLOCK=0x4002
> > flags set to 0x4002
> > Bad flags = 0x2
> >
> 
> This looks like the kind of problem that pops up when merging code from
> widely different systems.  The socket-specific fcntl
> handler(rtems_bsdnet_fcntl) is being passed a pointer to an
> rtems_libio_t but is using the flags in this structure as fcntl flags.
> Unfortunately the flags have been mangled from fcntl to libio by
> rtems_libio_fcntl_flags().
> 
> Here's a patch for the socket-specific code.  Unfortunately it seems
> that the code in libio.c which is converting the fcntl flags to and from
> the libio flags still seems to be clearing the non-blocking
> (O_NDELAY/O_NONBLOCK) bit somehow.  I don't have time to look into
> this.  Joel??
> 
> diff -ur
> rtems-ss-20000811.orig/c/src/libnetworking/rtems/rtems_syscall.c
> rtems-ss-20000811/c/src/libnetworking/rtems/rtems_syscall.c
> --- rtems-ss-20000811.orig/c/src/libnetworking/rtems/rtems_syscall.c
> Mon Jun 12 09:00:08 2000
> +++ rtems-ss-20000811/c/src/libnetworking/rtems/rtems_syscall.c Fri Sep
> 1 14:54:16 2000
> @@ -730,7 +730,7 @@
>                         rtems_bsdnet_semaphore_release ();
>                         return EBADF;
>                 }
> -               if (iop->flags & O_NONBLOCK)
> +               if (iop->flags & LIBIO_FLAGS_NO_DELAY)
>                         so->so_state |= SS_NBIO;
>                 else
>                         so->so_state &= ~SS_NBIO;
> 
> Amazing how long a bug like this can lurk.  I guess everyone else has
> been using ioctl (FIONBIO) to set the non-blocking state!
> 
> --
> Eric Norum                                 eric at cls.usask.ca
> Canadian Light Source                      Phone: (306) 966-6308
> University of Saskatchewan                 FAX:   (306) 966-6058
> Saskatoon, Canada.

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel at OARcorp.com                 On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
   Support Available             (256) 722-9985



More information about the users mailing list