On Wed, 12 Jun 2013 15:40:10 -0400, Walter Bright <newshou...@digitalmars.com> wrote:

On 6/12/2013 11:36 AM, Steven Schveighoffer wrote:
If I understand correctly, the buffer is flushed, and ptr is reset to the base, the count is reset to 0. I don't see any code in there that does any kind of
realignment.

You write 7 bytes, fflush. Now, every 4K buffered write from then on is going to write from 7..4096+7, 4096+7..8192+7, ...

If this was such a big deal, then FILE * would guarantee the alignment went back. It's not that hard.

That is one block or sector. The write cache of the OS or the drive will
probably absorb this hit anyway.

Write caches are not always there.


The performance hit is extremely negligible.

Only if there is a write cache (which can be turned off, and are often turned off for removable drives).

The write cache is irrelevant. The filesystem driver will dictate where writes are done, and will likely cache.

And I have experience with turning them off -- some of my clients requested that to avoid losing data that was in the write cache. It does not all of a sudden slow down the performance of the drive.

Not only that, but the hardware can differ from file system to file system. You are going through the file system driver, through the disk driver, through the disk. All of those pieces are written to optimize writes that SPECIFIC hardware. There isn't much you can
do to make this perform poorly.

Embedded systems and custom devices often do not have sophisticated hardware or software drivers.

The day that D runs on an embedded system, with no drivers or OS, BUT provides a C runtime that D builds on, is the day I'll agree with you ;)

But this whole discussion is academic at this point, Jérôme identified that we can simply check to see if the file descriptor is valid, without flushing.

I didn't say it was. See my other reply. In any case, if fflush is not called on subsequent writelns, it is still possible to have the first writeln succeed, the subsequent writelns fail and have main() return success.

This isn't the problem that was presented. The problem that was presented is that given an invalid file descriptor, writeln happily works (as long as you don't cause a flush) and does not throw. This is unintuitive to someone who is expecting writeln to choke on an invalid descriptor.

Subsequent writelns that fail throw an exception. Any writeln that causes a flush will create an exception.

The rare corner case the "throw at end" will catch in addition is when the file descriptor becomes invalid on the final flush only.

I think we can probably implement both checks. The 'throw at end' method will catch both, but it would be nice to catch an invalid descriptor at the call the causes the problem, not at the end when the program is mostly gone. It's like catching a memory error far away from the cause.

-Steve

Reply via email to