summaryrefslogtreecommitdiff
path: root/package
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-01-11 17:11:06 +0100
committerJan Holesovsky <kendy@collabora.com>2018-01-18 13:37:37 +0100
commitd16bfbda418da5ce43133b93c833ff118bd3b04f (patch)
treefee10945d91d2b14f2bf9d9cadee6203b3b4f73c /package
parent643d257868247df19674fdf99aa8751d7413eaf3 (diff)
ODT export: handle NoFileSync store option
SfxMedium already had a m_bDisableFileSync member; if the medium has a storage, then forward this flag to it, so at the end SwitchablePersistenceStream::waitForCompletion() (and the called fileaccess::XStream_impl::waitForCompletion()) does not call osl_syncFile(), either. Times for 100 hello world inputs: 12594 -> 5281 ms is spent in XHTML-load + ODT export + close (42% of original). (cherry picked from commit 16a522361698ea53ab253d67e31cb51802210d71) Conflicts: package/inc/ZipPackage.hxx package/source/xstor/xstorage.cxx Change-Id: I2aab6c9e6baf133b211620004dcea66bd41ffc6f Reviewed-on: https://gerrit.libreoffice.org/47979 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
Diffstat (limited to 'package')
-rw-r--r--package/inc/ZipPackage.hxx1
-rw-r--r--package/source/xstor/xfactory.cxx7
-rw-r--r--package/source/xstor/xstorage.cxx4
-rw-r--r--package/source/zippackage/ZipPackage.cxx4
4 files changed, 14 insertions, 2 deletions
diff --git a/package/inc/ZipPackage.hxx b/package/inc/ZipPackage.hxx
index 378876962b0d..7ab93288f076 100644
--- a/package/inc/ZipPackage.hxx
+++ b/package/inc/ZipPackage.hxx
@@ -99,6 +99,7 @@ protected:
ZipPackageFolder *m_pRootFolder;
ZipFile *m_pZipFile;
+ bool m_bDisableFileSync = false;
bool isLocalFile() const;
diff --git a/package/source/xstor/xfactory.cxx b/package/source/xstor/xfactory.cxx
index d5031b4dbc03..57530cf08890 100644
--- a/package/source/xstor/xfactory.cxx
+++ b/package/source/xstor/xfactory.cxx
@@ -227,6 +227,13 @@ uno::Reference< uno::XInterface > SAL_CALL OStorageFactory::createInstanceWithAr
else
throw lang::IllegalArgumentException( THROW_WHERE, uno::Reference< uno::XInterface >(), 1 );
}
+ else if (aDescr[nInd].Name == "NoFileSync")
+ {
+ // Forward NoFileSync to the storage.
+ aPropsToSet.realloc(++nNumArgs);
+ aPropsToSet[nNumArgs - 1].Name = aDescr[nInd].Name;
+ aPropsToSet[nNumArgs - 1].Value = aDescr[nInd].Value;
+ }
else
OSL_FAIL( "Unacceptable property, will be ignored!\n" );
}
diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx
index dedf4a15ce6b..308eb525e7dc 100644
--- a/package/source/xstor/xstorage.cxx
+++ b/package/source/xstor/xstorage.cxx
@@ -468,8 +468,10 @@ void OStorage_Impl::OpenOwnPackage()
{
if ( m_xProperties[aInd].Name == "RepairPackage"
|| m_xProperties[aInd].Name == "ProgressHandler"
- || m_xProperties[aInd].Name == "UseBufferedStream" )
+ || m_xProperties[aInd].Name == "UseBufferedStream"
+ || m_xProperties[aInd].Name == "NoFileSync" )
{
+ // Forward these to the package.
beans::NamedValue aNamedValue( m_xProperties[aInd].Name,
m_xProperties[aInd].Value );
aArguments.realloc( ++nArgNum );
diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx
index faaab714ee85..ca2df1558b51 100644
--- a/package/source/zippackage/ZipPackage.cxx
+++ b/package/source/zippackage/ZipPackage.cxx
@@ -704,6 +704,8 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments )
{
aNamedValue.Value >>= bUseBufferedStream;
}
+ else if (aNamedValue.Name == "NoFileSync")
+ aNamedValue.Value >>= m_bDisableFileSync;
// for now the progress handler is not used, probably it will never be
// if ( aNamedValue.Name == "ProgressHandler" )
@@ -1265,7 +1267,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile()
// in case the stream is based on a file it will implement the following interface
// the call should be used to be sure that the contents are written to the file system
uno::Reference< io::XAsyncOutputMonitor > asyncOutputMonitor( xTempOut, uno::UNO_QUERY );
- if ( asyncOutputMonitor.is() )
+ if (asyncOutputMonitor.is() && !m_bDisableFileSync)
asyncOutputMonitor->waitForCompletion();
// no need to postpone switching to the new stream since the target was written directly