OH MY GOD!  Excellent catch!!  I sincerely hope the fsmlabs team accepts
your fix for inclusion into future versions of rtf.

What is a user pair?  Is it combining 2 fifo's from the kernel into 1 user
fifo?  What is the point of this?




On Fri, 16 Nov 2001, John_Jacques wrote:

> I just fixed a similiar problem in rtl_fifo.c that caused linux
> applications to stay blocked after an RTLinux module called rtf_put.
> Note the following from the end of rtf_put in rtl_fifo.c
>
>       if (RTF_USER_OPEN(minor)) {
>               fifo_wake_sleepers(minor);
>       }
>
> If you make a user pair only one minor number is open
> (RTF_USER_OPEN(minor) != 0).  Consider the following sequence of events:
>
>       /* In init_module( ) */
>       rtf_create( 10, size );
>       rtf_create( 11, size );
>       rtf_make_user_pair( 10, 11 );
>
>       /* Linux application */
>       file_descriptor = open( "/dev/rtf10", O_RDWR );
>       read( file_descriptor, buffer, size );
>
> At this point RTF_USER_OPEN( 10 ) equals 2, RTF_USER_OPEN( 11 ) equals 0
> and the Linux application is blocked on the read.
>
>       /* RTLinux module */
>       rtf_put( 11, buffer, size );
>
> The code, noted above, in rtl_fifo.c does not wake up the linux
> application!
> My fix is as follows:
>
>       if( RTF_USER_OPEN( minor ) ||
>           ( ( 0 != RTF_BI( minor ) ) &&
>               RTF_USER_OPEN( minor + RTF_BI( minor ) ) ) ) {
>               fifo_wake_sleepers(minor - (RTF_BI(minor) < 0));
>       }
>
> "Calin A. Culianu" wrote:
> >
> > What is supposed to happen when a user-process does the following?
> >
> >   int n_ready;
> >   fd_set rfds;
> >
> > /* assume fd is an already-opened /dev/rtf */
> >   ioctl(fd, FIONREAD, &n_ready);
> >
> >   if (n_ready == 0) {
> >
> >     FD_ZERO(&rfds);
> >     FD_SET(fd, &rfds);
> >     select (fd+1, &rfds, NULL, NULL, NULL); /* block indefinitely waiting
> > for new stuff on fd */
> >
> >   }
> >
> > Basically the above code snippet blocks forever whenever the ioctl
> > detects 0 bytes ready for reading.. even though I *know* my real-time thread
> > is generating more data on the fifo...
> >
> > Is this a bug/lacking feature of /dev/rtf or a simple stupid thing i am
> > overlooking?  I guess I can open up the rtl_fifo.c file and have a gander
> > at it myself.... but maybe one of you can save me the trouble.. thanks!
> >
> > And I know.. I could just open the fifo with blocking reads, but I
> > wanted to see if I could selectively block and not block on demand using
> > select()...
> >
> > -Calin
> >
> > -- [rtl] ---
> > To unsubscribe:
> > echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> > echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> > --
> > For more information on Real-Time Linux see:
> > http://www.rtlinux.org/

-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/

Reply via email to