Modify

Ticket #2998 (closed Feature Requests: fixed)

Opened 5 years ago

Last modified 4 years ago

Make file_sink flushable

Reported by: Andrew Schweitzer <a.schweitzer.grps@…> Owned by: turkanis
Milestone: Boost 1.39.0 Component: iostreams
Version: Boost 1.38.0 Severity: Not Applicable
Keywords: Cc:

Description

file_sink is hard to use as a debug log, since it does not flush.

For example, when used when pushed into a filtering_ostream with cout, if flush is not called, characters don't appear on console or in file in a timely fashion. If flush is called, the characters on the console appear but not those in the file, because file_sink does not implement Flushable concept, and doesn't flush.

This code:

filtering_ostream fo;

file_sink fsink("out.txt"); tee_filter<file_sink> tee_fsink(fsink); fo.push(tee_fsink);

fo.push(cout);

fo << "some text"; fo.flush();

is very useful for arbitrary chains of debug logs, but not currently usable.

The same issue applies to file, file_descriptor, and file_descriptor_sink.

If there is some reason these classes should not be modified to made flushable, then it seems easy to make flushable_* versions. Example of this attached, which was copied from file.hpp.

I also tried to add flushable_file_descriptor, by privately inheriting from file_descriptor, and adding a flush call which calls ::FlushFileBuffers? on handle()... but so far that doesn't seem to work, so not attaching.

Discussion at  http://groups.google.com/group/boost-list/browse_thread/thread/4c07e7c255e8143a/b9003b1b83c5a4db?lnk=raot&pli=1

Attachments

flushable_file.hpp Download (5.6 KB) - added by Andrew Schweitzer <a.schweitzer.grps@…> 5 years ago.
sample implementation of flushable file_sink, copied from boost/iostreams/device/file_sink.hpp

Change History

Changed 5 years ago by Andrew Schweitzer <a.schweitzer.grps@…>

sample implementation of flushable file_sink, copied from boost/iostreams/device/file_sink.hpp

comment:1 Changed 4 years ago by steven_watanabe

I don't think that file_descriptor_sink should be made flushable. It looks like FlushFileBuffers? is the Windows equivalent of fsync, and I rather doubt that standard streams use it.

comment:2 Changed 4 years ago by steven_watanabe

  • Status changed from new to closed
  • Resolution set to fixed

(In [63039]) Make basic_file and basic_file_sync Flushable. Fixes #2998.

View

Add a comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
The resolution will be deleted. Next status will be 'reopened'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.