summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-01-10 11:39:21 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2018-01-10 14:35:47 +0100
commitd03a754722980a4eaf14fce38d73ae23b604295b (patch)
tree9f5c12ecff1420bbed6f57968e2c3e5ed6e92f7b
parente1026e267b4b1b0b0bd645c6bc212d6fa71544f8 (diff)
sfx2 store: add API to allow avoiding the fsync of the output file
The use-case is when the consumer of the output file will read it right after SfxBaseModel::storeToURL() returns, in which case an expensive fsync is pointless. Times for 100 hello world inputs: 8516 -> 2785 ms is spent in ODT-load + HTML export + close (33% of original). Change-Id: I05e424a43ebfeea363f82b57af60f5aaa28696b4 Reviewed-on: https://gerrit.libreoffice.org/47695 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--include/sfx2/docfile.hxx2
-rw-r--r--include/sfx2/sfxsids.hrc3
-rw-r--r--sfx2/sdi/sfx.sdi2
-rw-r--r--sfx2/source/appl/appuno.cxx1
-rw-r--r--sfx2/source/doc/docfile.cxx21
-rw-r--r--sfx2/source/doc/objstor.cxx4
6 files changed, 25 insertions, 8 deletions
diff --git a/include/sfx2/docfile.hxx b/include/sfx2/docfile.hxx
index ecf023278235..822c69b1da4f 100644
--- a/include/sfx2/docfile.hxx
+++ b/include/sfx2/docfile.hxx
@@ -169,6 +169,8 @@ public:
bool ShowLockFileProblemDialog(MessageDlg nWhichDlg);
void DisableUnlockWebDAV( bool bDisableUnlockWebDAV = true );
void UnlockFile( bool bReleaseLockStream );
+ /// Lets Transfer_Impl() not fsync the output file.
+ void DisableFileSync(bool bDisableFileSync);
css::uno::Reference< css::embed::XStorage > GetStorage( bool bCreateTempIfNo = true );
css::uno::Reference< css::embed::XStorage > GetOutputStorage();
diff --git a/include/sfx2/sfxsids.hrc b/include/sfx2/sfxsids.hrc
index 8ded365cdc6e..81d4d45cbe9d 100644
--- a/include/sfx2/sfxsids.hrc
+++ b/include/sfx2/sfxsids.hrc
@@ -243,8 +243,9 @@
#define SID_BLUETOOTH_SENDDOC (SID_SFX_START + 1726)
#define SID_TEMPLATE_MANAGER (SID_SFX_START + 1727)
#define SID_TOOLBAR_MODE (SID_SFX_START + 1728)
+#define SID_NO_FILE_SYNC (SID_SFX_START + 1729)
-// SID_SFX_free_START (SID_SFX_START + 1729)
+// SID_SFX_free_START (SID_SFX_START + 1730)
// SID_SFX_free_END (SID_SFX_START + 3999)
#define SID_OPEN_NEW_VIEW (SID_SFX_START + 520)
diff --git a/sfx2/sdi/sfx.sdi b/sfx2/sdi/sfx.sdi
index 1d7aeea8bcac..a366a271edb5 100644
--- a/sfx2/sdi/sfx.sdi
+++ b/sfx2/sdi/sfx.sdi
@@ -3557,7 +3557,7 @@ SfxVoidItem SaveAll SID_SAVEDOCS
SfxStringItem SaveAs SID_SAVEASDOC
-(SfxStringItem URL SID_FILE_NAME,SfxStringItem FilterName SID_FILTER_NAME,SfxStringItem Password SID_PASSWORD,SfxBoolItem PasswordInteraction SID_PASSWORDINTERACTION,SfxStringItem FilterOptions SID_FILE_FILTEROPTIONS,SfxStringItem VersionComment SID_DOCINFO_COMMENTS,SfxStringItem VersionAuthor SID_DOCINFO_AUTHOR,SfxBoolItem Overwrite SID_OVERWRITE,SfxBoolItem Unpacked SID_UNPACK,SfxBoolItem SaveTo SID_SAVETO)
+(SfxStringItem URL SID_FILE_NAME,SfxStringItem FilterName SID_FILTER_NAME,SfxStringItem Password SID_PASSWORD,SfxBoolItem PasswordInteraction SID_PASSWORDINTERACTION,SfxStringItem FilterOptions SID_FILE_FILTEROPTIONS,SfxStringItem VersionComment SID_DOCINFO_COMMENTS,SfxStringItem VersionAuthor SID_DOCINFO_AUTHOR,SfxBoolItem Overwrite SID_OVERWRITE,SfxBoolItem Unpacked SID_UNPACK,SfxBoolItem SaveTo SID_SAVETO,SfxBoolItem NoFileSync SID_NO_FILE_SYNC)
[
AutoUpdate = FALSE,
FastCall = FALSE,
diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx
index 22f173614dd5..1eded116d167 100644
--- a/sfx2/source/appl/appuno.cxx
+++ b/sfx2/source/appl/appuno.cxx
@@ -105,6 +105,7 @@ SfxFormalArgument const aFormalArgs[] = {
{ reinterpret_cast<SfxType*>(&aSfxBoolItem_Impl), "Unpacked", SID_UNPACK },
{ reinterpret_cast<SfxType*>(&aSfxInt16Item_Impl), "Version", SID_VERSION },
{ reinterpret_cast<SfxType*>(&aSfxBoolItem_Impl), "SaveACopy", SID_SAVEACOPYITEM },
+ { reinterpret_cast<SfxType*>(&aSfxBoolItem_Impl), "NoFileSync", SID_NO_FILE_SYNC },
};
static sal_uInt16 nMediaArgsCount = SAL_N_ELEMENTS(aFormalArgs);
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index 59dd5307877c..92f0665110af 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -191,6 +191,7 @@ public:
bool m_bRemote:1;
bool m_bInputStreamIsReadOnly:1;
bool m_bInCheckIn:1;
+ bool m_bDisableFileSync = false;
OUString m_aName;
OUString m_aLogicName;
@@ -1972,13 +1973,16 @@ void SfxMedium::Transfer_Impl()
{
TransactedTransferForFS_Impl( aSource, aDest, xComEnv );
- // Hideous - no clean way to do this, so we re-open the file just to fsync it
- osl::File aFile( aDestURL );
- if ( aFile.open( osl_File_OpenFlag_Write ) == osl::FileBase::E_None )
+ if (!pImpl->m_bDisableFileSync)
{
- aFile.sync();
- SAL_INFO( "sfx.doc", "fsync'd saved file '" << aDestURL << "'" );
- aFile.close();
+ // Hideous - no clean way to do this, so we re-open the file just to fsync it
+ osl::File aFile( aDestURL );
+ if ( aFile.open( osl_File_OpenFlag_Write ) == osl::FileBase::E_None )
+ {
+ aFile.sync();
+ SAL_INFO( "sfx.doc", "fsync'd saved file '" << aDestURL << "'" );
+ aFile.close();
+ }
}
}
else
@@ -2734,6 +2738,11 @@ void SfxMedium::DisableUnlockWebDAV( bool bDisableUnlockWebDAV )
pImpl->m_bDisableUnlockWebDAV = bDisableUnlockWebDAV;
}
+void SfxMedium::DisableFileSync(bool bDisableFileSync)
+{
+ pImpl->m_bDisableFileSync = bDisableFileSync;
+}
+
void SfxMedium::UnlockFile( bool bReleaseLockStream )
{
#if !HAVE_FEATURE_MULTIUSER_ENVIRONMENT
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index e50fdfcffc82..b470d8f60177 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -2739,6 +2739,10 @@ bool SfxObjectShell::PreDoSaveAs_Impl(const OUString& rFileName, const OUString&
// create a medium for the target URL
SfxMedium *pNewFile = new SfxMedium( rFileName, StreamMode::READWRITE | StreamMode::SHARE_DENYWRITE | StreamMode::TRUNC, nullptr, pMergedParams );
+ const SfxBoolItem* pNoFileSync = pMergedParams->GetItem<SfxBoolItem>(SID_NO_FILE_SYNC, false);
+ if (pNoFileSync && pNoFileSync->GetValue())
+ pNewFile->DisableFileSync(true);
+
// set filter; if no filter is given, take the default filter of the factory
if ( !aFilterName.isEmpty() )
pNewFile->SetFilter( GetFactory().GetFilterContainer()->GetFilter4FilterName( aFilterName ) );