I was doing some code reading in V3.0Pre1 and started wondering about
the intended usage (as far as multiple accessors goes) of rt fifos.
The documentation is not particularly clear.  

Several possible answers come to mind:

1. Single reader, single writer per fifo
2. Single reader, multiple writers per fifo
3. Multiple readers, multiple writers per fifo

Right now the code looks like major overkill for (1); it appears to
intend to support (3).  However, as far as I can tell this works
correctly *only* if the set of readers and the set of writers each do
NOT contain a mix of Linux and RTLinux threads.  The reason is that
the Linux fifo I/O functions interlock RTLinux when they pick up the
pointers, and then again when they update the pointers, but not in
between.  So it looks like an RTLinux thread and a Linux thread could
both read the same data, or both write to the same region of an
rtfifo. 

I would tend to argue that the ability to mix things like that isn't
particularly interesting, but if it's not supposed to be done the
documentation should say that.

A related point: the rtf_get and rtf_put operations lock out
interrupts for the full duration of the transfer.  You need that to
get mode (3).  I expect there are plenty of fifos that don't need
this, they only need (1).  You pay an interrupt latency penalty you
don't need in that case.  How about another set of calls
(rtf_get_single?) or a mode setting to select (1) and avoid most or
all of the interrupt disabling?

Finally, I think I could use some additional rtfifo services,
specifically (a) a way to query how much is currently in the fifo and
how much space is left, so I can avoid doing an rtf_get or rtf_put
that will do a partial transfer, (b) a "flush the fifo" operation.

Reason for (a) is: if you transfer structured data via a fifo (similar 
to the "frank" sample application) then you don't want to do an
rtf_get and get less than sizeof (your_struct) coming back.

I could add these and submit them as patches, would that be a good
idea?

        paul
--- [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/~rtlinux/

Reply via email to