Kaydet (Commit) 16a52236 authored tarafından Miklos Vajna's avatar Miklos Vajna

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/47766Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMiklos Vajna <vmiklos@collabora.co.uk>
üst ef22c4a0
......@@ -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;
......
......@@ -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!" );
}
......
......@@ -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 );
......
......@@ -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
......
......@@ -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() )
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment