package/inc/ZipPackage.hxx | 1 + package/source/xstor/xfactory.cxx | 7 +++++++ package/source/xstor/xstorage.cxx | 4 +++- package/source/zippackage/ZipPackage.cxx | 4 +++- sfx2/source/doc/docfile.cxx | 9 +++++++++ 5 files changed, 23 insertions(+), 2 deletions(-)
New commits: commit 16a522361698ea53ab253d67e31cb51802210d71 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Jan 11 17:11:06 2018 +0100 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). Change-Id: I2aab6c9e6baf133b211620004dcea66bd41ffc6f Reviewed-on: https://gerrit.libreoffice.org/47766 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/package/inc/ZipPackage.hxx b/package/inc/ZipPackage.hxx index f46eb33b0172..1cb3ba7836f5 100644 --- a/package/inc/ZipPackage.hxx +++ b/package/inc/ZipPackage.hxx @@ -99,6 +99,7 @@ class ZipPackage final : public cppu::WeakImplHelper const css::uno::Reference < css::uno::XComponentContext > m_xContext; std::unique_ptr<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 58cff685cd06..1feb44a84e21 100644 --- a/package/source/xstor/xfactory.cxx +++ b/package/source/xstor/xfactory.cxx @@ -223,6 +223,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!" ); } diff --git a/package/source/xstor/xstorage.cxx b/package/source/xstor/xstorage.cxx index 66678d7c378d..21567b8eb2a5 100644 --- a/package/source/xstor/xstorage.cxx +++ b/package/source/xstor/xstorage.cxx @@ -429,8 +429,10 @@ void OStorage_Impl::OpenOwnPackage() for ( sal_Int32 aInd = 0; aInd < m_xProperties.getLength(); aInd++ ) { if ( m_xProperties[aInd].Name == "RepairPackage" - || m_xProperties[aInd].Name == "ProgressHandler" ) + || m_xProperties[aInd].Name == "ProgressHandler" + || 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 3ea75dc409d4..ffb9cf1e8775 100644 --- a/package/source/zippackage/ZipPackage.cxx +++ b/package/source/zippackage/ZipPackage.cxx @@ -681,6 +681,8 @@ void SAL_CALL ZipPackage::initialize( const uno::Sequence< Any >& aArguments ) aNamedValue.Value >>= m_bAllowRemoveOnInsert; m_xRootFolder->setRemoveOnInsertMode_Impl( m_bAllowRemoveOnInsert ); } + 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" ) @@ -1253,7 +1255,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 diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx index 92f0665110af..865fc60a0b71 100644 --- a/sfx2/source/doc/docfile.cxx +++ b/sfx2/source/doc/docfile.cxx @@ -121,6 +121,7 @@ #include <openflag.hxx> #include <sfx2/sfxresid.hxx> #include <officecfg/Office/Common.hxx> +#include <comphelper/propertysequence.hxx> #include <com/sun/star/io/WrongFormatException.hpp> @@ -1369,6 +1370,14 @@ uno::Reference < embed::XStorage > SfxMedium::GetStorage( bool bCreateTempIfNo ) aArgs[0] <<= pImpl->xStream; aArgs[1] <<= embed::ElementModes::READWRITE; pImpl->bStorageBasedOnInStream = true; + if (pImpl->m_bDisableFileSync) + { + // Forward NoFileSync to the storage factory. + aArgs.realloc(3); + uno::Sequence<beans::PropertyValue> aProperties( + comphelper::InitPropertySequence({ { "NoFileSync", uno::makeAny(true) } })); + aArgs[2] <<= aProperties; + } } else if ( pImpl->xInputStream.is() ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits