include/tools/stream.hxx               |    5 +++--
 tools/source/stream/strmwnt.cxx        |    2 ++
 unotools/source/ucbhelper/tempfile.cxx |    9 +++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

New commits:
commit 1ea0ea19f1dc13c4191ab9d4222adfd2579b802c
Author:     Noel Grandin <noelgran...@collabora.co.uk>
AuthorDate: Mon Oct 24 09:06:42 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Oct 24 10:10:54 2022 +0200

    tdf#133768 speed up temp file creation
    
    Use DELETE_ON_CLOSE attribute, so we can avoid calling osl_removeFile.
    Shaves 5% off the export time.
    
    Change-Id: I4fef8f181ef7a92c4805cc5996c3a17800a22602
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141718
    Tested-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx
index c56a3d44cef6..b141c8ed44f7 100644
--- a/include/tools/stream.hxx
+++ b/include/tools/stream.hxx
@@ -50,8 +50,9 @@ enum class StreamMode {
 // file i/o
     NOCREATE                 = 0x0004,  ///< 1 == Don't create file
     TRUNC                    = 0x0008,  ///< Truncate _existing_ file to zero 
length
-    COPY_ON_SYMLINK          = 0x0010,  ///< copy-on-write for symlinks (Unix)
+    COPY_ON_SYMLINK          = 0x0010,  ///< copy-on-write for symlinks 
(Unix-only)
     TEMPORARY                = 0x0020,  ///< temporary file attribute 
(Windows-only)
+    DELETE_ON_CLOSE          = 0x0040,  ///< only for temporary files 
(Windows-only)
 // sharing options
     SHARE_DENYNONE           = 0x0100,
     SHARE_DENYREAD           = 0x0200,  // overrides denynone
@@ -65,7 +66,7 @@ enum class StreamMode {
 };
 namespace o3tl
 {
-    template<> struct typed_flags<StreamMode> : is_typed_flags<StreamMode, 
0x0f3f> {};
+    template<> struct typed_flags<StreamMode> : is_typed_flags<StreamMode, 
0x0f7f> {};
 }
 
 #define STREAM_SEEK_TO_BEGIN            0L
diff --git a/tools/source/stream/strmwnt.cxx b/tools/source/stream/strmwnt.cxx
index 4ea9c7eb1d42..f88cbe307606 100644
--- a/tools/source/stream/strmwnt.cxx
+++ b/tools/source/stream/strmwnt.cxx
@@ -304,6 +304,8 @@ void SvFileStream::Open( const OUString& rFilename, 
StreamMode nMode )
 
     if ( nMode & StreamMode::TEMPORARY )
         nAttributes |= FILE_ATTRIBUTE_TEMPORARY;
+    if ( nMode & StreamMode::DELETE_ON_CLOSE )
+        nAttributes |= FILE_FLAG_DELETE_ON_CLOSE;
 
     pInstanceData->hFile = CreateFileW(
         o3tl::toW(aFilename.getStr()),
diff --git a/unotools/source/ucbhelper/tempfile.cxx 
b/unotools/source/ucbhelper/tempfile.cxx
index 61ef2d247c01..efeb872b5d6d 100644
--- a/unotools/source/ucbhelper/tempfile.cxx
+++ b/unotools/source/ucbhelper/tempfile.cxx
@@ -409,7 +409,11 @@ SvStream* TempFileFast::GetStream( StreamMode eMode )
     if (!mxStream)
     {
         OUString aName = CreateTempNameFast();
+#ifdef _WIN32
+        mxStream.reset(new SvFileStream(aName, eMode | StreamMode::TEMPORARY | 
StreamMode::DELETE_ON_CLOSE));
+#else
         mxStream.reset(new SvFileStream(aName, eMode | StreamMode::TEMPORARY));
+#endif
     }
     return mxStream.get();
 }
@@ -420,8 +424,13 @@ void TempFileFast::CloseStream()
     {
         OUString aName = mxStream->GetFileName();
         mxStream.reset();
+#ifdef _WIN32
+        // On Windows, the file is opened with FILE_FLAG_DELETE_ON_CLOSE, so 
it will delete as soon as the handle closes.
+        // On other platforms, we need to explicitly delete it.
+#else
         if (!aName.isEmpty() && 
(osl::FileBase::getFileURLFromSystemPath(aName, aName) == 
osl::FileBase::E_None))
             File::remove(aName);
+#endif
     }
 }
 

Reply via email to