diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-01-11 17:11:06 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-01-18 13:37:37 +0100 |
commit | d16bfbda418da5ce43133b93c833ff118bd3b04f (patch) | |
tree | fee10945d91d2b14f2bf9d9cadee6203b3b4f73c /package | |
parent | 643d257868247df19674fdf99aa8751d7413eaf3 (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.hxx | 1 | ||||
-rw-r--r-- | package/source/xstor/xfactory.cxx | 7 | ||||
-rw-r--r-- | package/source/xstor/xstorage.cxx | 4 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackage.cxx | 4 |
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 |