mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
ClosedFileInputSource: add method to keep file open
During periods of intensive operation on a specific file, this method can reduce the overhead of repeated open/close operations.
This commit is contained in:
parent
7855e18ae2
commit
4f4c627b77
@ -1,3 +1,10 @@
|
||||
2018-08-04 Jay Berkenbilt <ejb@ql.org>
|
||||
|
||||
* Add ClosedFileInputSource::stayOpen method, enabling a
|
||||
ClosedFileInputSource to stay open during manually indicated
|
||||
periods of high activity, thus reducing the overhead of frequent
|
||||
open/close operations.
|
||||
|
||||
2018-06-23 Jay Berkenbilt <ejb@ql.org>
|
||||
|
||||
* 8.1.0: release
|
||||
|
@ -55,6 +55,13 @@ class ClosedFileInputSource: public InputSource
|
||||
QPDF_DLL
|
||||
virtual void unreadCh(char ch);
|
||||
|
||||
// The file stays open between calls to stayOpen(true) and
|
||||
// stayOpen(false). You can use this to surround multiple
|
||||
// operations on a single ClosedFileInputSource to reduce the
|
||||
// overhead of a separate open/close on each call.
|
||||
QPDF_DLL
|
||||
void stayOpen(bool);
|
||||
|
||||
private:
|
||||
ClosedFileInputSource(ClosedFileInputSource const&);
|
||||
ClosedFileInputSource& operator=(ClosedFileInputSource const&);
|
||||
@ -76,6 +83,7 @@ class ClosedFileInputSource: public InputSource
|
||||
std::string filename;
|
||||
qpdf_offset_t offset;
|
||||
FileInputSource* fis;
|
||||
bool stay_open;
|
||||
};
|
||||
PointerHolder<Members> m;
|
||||
};
|
||||
|
@ -4,7 +4,8 @@
|
||||
ClosedFileInputSource::Members::Members(char const* filename) :
|
||||
filename(filename),
|
||||
offset(0),
|
||||
fis(0)
|
||||
fis(0),
|
||||
stay_open(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -42,6 +43,10 @@ ClosedFileInputSource::after()
|
||||
{
|
||||
this->last_offset = this->m->fis->getLastOffset();
|
||||
this->m->offset = this->m->fis->tell();
|
||||
if (this->m->stay_open)
|
||||
{
|
||||
return;
|
||||
}
|
||||
delete this->m->fis;
|
||||
this->m->fis = 0;
|
||||
}
|
||||
@ -82,6 +87,10 @@ void
|
||||
ClosedFileInputSource::rewind()
|
||||
{
|
||||
this->m->offset = 0;
|
||||
if (this->m->fis)
|
||||
{
|
||||
this->m->fis->rewind();
|
||||
}
|
||||
}
|
||||
|
||||
size_t
|
||||
@ -101,3 +110,13 @@ ClosedFileInputSource::unreadCh(char ch)
|
||||
// Don't call after -- the file has to stay open after this
|
||||
// operation.
|
||||
}
|
||||
|
||||
void
|
||||
ClosedFileInputSource::stayOpen(bool val)
|
||||
{
|
||||
this->m->stay_open = val;
|
||||
if ((! val) && this->m->fis)
|
||||
{
|
||||
after();
|
||||
}
|
||||
}
|
||||
|
@ -65,6 +65,11 @@ int main()
|
||||
std::cout << "testing with ClosedFileInputSource\n";
|
||||
ClosedFileInputSource cf("input");
|
||||
do_tests(&cf);
|
||||
std::cout << "testing with ClosedFileInputSource in stay open mode\n";
|
||||
ClosedFileInputSource cf2("input");
|
||||
cf2.stayOpen(true);
|
||||
do_tests(&cf2);
|
||||
cf2.stayOpen(false);
|
||||
std::cout << "testing with FileInputSource\n";
|
||||
FileInputSource f;
|
||||
f.setFilename("input");
|
||||
|
@ -1,3 +1,4 @@
|
||||
testing with ClosedFileInputSource
|
||||
testing with ClosedFileInputSource in stay open mode
|
||||
testing with FileInputSource
|
||||
all assertions passed
|
||||
|
Loading…
Reference in New Issue
Block a user