On 2020-06-09 08:55, Christo Crause via fpc-devel wrote:
On Tue, Jun 9, 2020 at 12:03 AM Michael Van Canneyt
<mich...@freepascal.org>
wrote:
Could you please submit a patch with this modification to the
bugtracker ?
We don't as a rule follow up on such things in github.
I will of course submit a patch once I'm satisfied it is good enough.
My
concern with the current patch is that a low level flush is called
after
every write statement, so a simple loop like the following:
for c := 'A' to 'Z" do write(c);
will incur the burden of a low level flush after each iteration. In
normal
use the low level flush call is not needed and causes unnecessary
blocks.
This is what Tomas mentioned, so I'm looking for a different
implementation
that can fit in with the rest of the use cases in the RTL.
It would make more sense to me if there was a distinct difference in
use
case between InOutFunc and FlushFunc (for fmoutput case), to my naive
view
it seems as if they are mostly used interchangeably and in many cases
even
share the same implementation function. This makes sense for the
traditional targets (Windows, Linux etc.), but for lower level targets
a
distinction between the internal RTL buffer and the external
OS/hardware
buffer is useful. For a low level target I would think an InOutfunc
that
flushes the internal buffer to the OS/hardware and a FlushFunc that
ensures
the internal buffer is empty and then blocks until the OS/hardware has
completed transmission would make sense.
Note that there is an (intended) difference between output to console
and output to files (Do_IsDevice provides this differentiation in
standard RTL). Output to console is supposed to be flushed after every
Write(Ln) statement, because it should provide immediate feedback to the
user. Output to files should not be flushed immediately. Obviously, it's
up to the target maintainer to decide what's the proper behaviour in
case of output devices connected to your target, but the semantics
should be preferably kept, IMHO. Also note the difference between
outputting a series of individual characters using individual Write
calls (your loop above calling flush after every character) compared to
outputting a whole string (flush called after outputting all the
characters in the string).
Finally, note that TP-compatible part of the standard RTL does _not_
call the ("low-level") flush call of the underlying operating system.
Such calls exist in API for most platforms (DOS: int 21h, AH=68h; OS/2:
DosResetBuffer; Unix: (fp)fsync; WinXX: FlushFileBuffers), but they are
not used within our RTL implementation as far as I know (flushing is
always performed automatically when closing a file, but the operating
systems take care of that).
Tomas
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel