[Libreoffice-commits] .: Branch 'libreoffice-3-5' - sot/source

Caolán McNamara caolan at kemper.freedesktop.org
Fri May 11 08:38:02 PDT 2012


 sot/source/sdstor/stgstrms.cxx |  133 ++++-------------------------------------
 sot/source/sdstor/stgstrms.hxx |    4 -
 2 files changed, 16 insertions(+), 121 deletions(-)

New commits:
commit 4a6d590a0794fc00b3acb66bee9e1cd85c85ccc7
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri May 11 16:37:34 2012 +0100

    Revert "Related: fdo#47644 for huge files build a page chain cache for seeks"
    
    This reverts commit e7c861e3ec9398436eda16bb748af22a2d9afc27.
    
    that was dumb, never intended to push this

diff --git a/sot/source/sdstor/stgstrms.cxx b/sot/source/sdstor/stgstrms.cxx
index e982837..5e6c1ea 100644
--- a/sot/source/sdstor/stgstrms.cxx
+++ b/sot/source/sdstor/stgstrms.cxx
@@ -26,10 +26,9 @@
  *
  ************************************************************************/
 
-#include <algorithm>
 
 #include <string.h>     // memcpy()
-#include <sal/log.hxx>
+
 #include <osl/file.hxx>
 #include <tools/tempfile.hxx>
 #include <tools/debug.hxx>
@@ -335,56 +334,6 @@ void StgStrm::SetEntry( StgDirEntry& r )
     r.SetDirty();
 }
 
-namespace lcl
-{
-#if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
-    using std::is_sorted;
-#else
-    template <typename iter> bool is_sorted(iter aStart, iter aEnd)
-    {
-        if (aStart == aEnd)
-            return true;
-
-        for (iter aNext = aStart + 1; aNext != aEnd; aStart = aNext, ++aNext)
-        {
-            if (*aNext < *aStart)
-                return false;
-        }
-
-        return true;
-    }
-#endif
-}
-
-bool StgStrm::buildPageChainCache()
-{
-    if (nSize > 0)
-        m_aPagesCache.reserve(nSize/nPageSize);
-
-    sal_Int32 nBgn = nStart;
-    while (nBgn >= 0)
-    {
-        m_aPagesCache.push_back(nBgn);
-        sal_Int32 nOldBgn = nBgn;
-        nBgn = pFat->GetNextPage(nBgn);
-        if (nBgn == nOldBgn)
-            return false;
-    }
-
-    m_bSortedPageChain = lcl::is_sorted(m_aPagesCache.begin(), m_aPagesCache.end());
-
-    SAL_WARN_IF(!m_bSortedPageChain, "sot", "unsorted page chain, that's suspicious");
-
-    return true;
-}
-
-//See fdo#47644 for a .doc with a vast amount of pages where seeking around the
-//document takes a colossal amount of time
-//
-//There's a cost to building a page cache, so only build one if the number of
-//pages to seek through hits some sufficiently high value where it's worth it.
-#define ARBITRARY_LARGE_AMOUNT_OF_PAGES 256
-
 // Compute page number and offset for the given byte position.
 // If the position is behind the size, set the stream right
 // behind the EOF.
@@ -406,7 +355,7 @@ sal_Bool StgStrm::Pos2Page( sal_Int32 nBytePos )
         return sal_True;
     if( nNew > nOld )
     {
-        // the new position is after the current, so an incremental
+        // the new position is behind the current, so an incremental
         // positioning is OK. Set the page relative position
         nRel = nNew - nOld;
         nBgn = nPage;
@@ -420,59 +369,13 @@ sal_Bool StgStrm::Pos2Page( sal_Int32 nBytePos )
     }
     // now, traverse the FAT chain.
     nRel /= nPageSize;
-
     sal_Int32 nLast = STG_EOF;
-    if (m_aPagesCache.empty() && nRel < ARBITRARY_LARGE_AMOUNT_OF_PAGES)
-    {
-        while (nRel && nBgn >= 0)
-        {
-            nLast = nBgn;
-            nBgn = pFat->GetNextPage( nBgn );
-            nRel--;
-        }
-    }
-    else if (nBgn >= 0)
+    while( nRel && nBgn >= 0 )
     {
-        //Seeking large distances is slow, so if we're starting seeking (some
-        //fairly arbitrary) large distances, build a cache and re-use it for
-        //subsequent seeks
-        if (m_aPagesCache.empty())
-        {
-            SAL_INFO("sot", "kicking off large seek helper\n");
-            buildPageChainCache();
-        }
-
-        std::vector<sal_Int32>::iterator aI;
-
-        if (m_bSortedPageChain)
-            aI = std::lower_bound(m_aPagesCache.begin(), m_aPagesCache.end(), nBgn);
-        else
-            aI = std::find(m_aPagesCache.begin(), m_aPagesCache.end(), nBgn);
-
-        if (aI == m_aPagesCache.end())
-        {
-            SAL_WARN("sot", "Unknown page position");
-            nBgn = STG_EOF;
-        }
-        else
-        {
-            size_t nBgnDistance = std::distance(m_aPagesCache.begin(), aI);
-
-            size_t nIndex = nBgnDistance + nRel;
-
-            if (nIndex > m_aPagesCache.size())
-            {
-                nRel = m_aPagesCache.size() - nBgnDistance;
-                nIndex = m_aPagesCache.size() - 1;
-            }
-            else
-                nRel = 0;
-
-            nLast = nIndex ? m_aPagesCache[nIndex - 1] : STG_EOF;
-            nBgn = m_aPagesCache[nIndex];
-        }
+        nLast = nBgn;
+        nBgn = pFat->GetNextPage( nBgn );
+        nRel--;
     }
-
     // special case: seek to 1st byte of new, unallocated page
     // (in case the file size is a multiple of the page size)
     if( nBytePos == nSize && nBgn == STG_EOF && !nRel && !nOffset )
@@ -501,8 +404,6 @@ StgPage* StgStrm::GetPhysPage( sal_Int32 nBytePos, sal_Bool bForce )
 
 sal_Bool StgStrm::Copy( sal_Int32 nFrom, sal_Int32 nBytes )
 {
-    m_aPagesCache.clear();
-
     sal_Int32 nTo = nStart;
     sal_Int32 nPgs = ( nBytes + nPageSize - 1 ) / nPageSize;
     while( nPgs-- )
@@ -529,8 +430,6 @@ sal_Bool StgStrm::Copy( sal_Int32 nFrom, sal_Int32 nBytes )
 
 sal_Bool StgStrm::SetSize( sal_Int32 nBytes )
 {
-    m_aPagesCache.clear();
-
     // round up to page size
     sal_Int32 nOld = ( ( nSize + nPageSize - 1 ) / nPageSize ) * nPageSize;
     sal_Int32 nNew = ( ( nBytes + nPageSize - 1 ) / nPageSize ) * nPageSize;
@@ -629,8 +528,6 @@ sal_Int32 StgFATStrm::GetPage( short nOff, sal_Bool bMake, sal_uInt16 *pnMasterA
         {
             if( bMake )
             {
-                m_aPagesCache.clear();
-
                 // create a new master page
                 nFAT = nMaxPage++;
                 pMaster = rIo.Copy( nFAT, STG_FREE );
@@ -685,8 +582,6 @@ sal_Int32 StgFATStrm::GetPage( short nOff, sal_Bool bMake, sal_uInt16 *pnMasterA
 
 sal_Bool StgFATStrm::SetPage( short nOff, sal_Int32 nNewPage )
 {
-    m_aPagesCache.clear();
-
     sal_Bool bRes = sal_True;
     if( nOff < rIo.aHdr.GetFAT1Size() )
         rIo.aHdr.SetFATPage( nOff, nNewPage );
@@ -736,8 +631,6 @@ sal_Bool StgFATStrm::SetPage( short nOff, sal_Int32 nNewPage )
 
 sal_Bool StgFATStrm::SetSize( sal_Int32 nBytes )
 {
-    m_aPagesCache.clear();
-
     // Set the number of entries to a multiple of the page size
     short nOld = (short) ( ( nSize + ( nPageSize - 1 ) ) / nPageSize );
     short nNew = (short) (
@@ -854,10 +747,16 @@ void StgDataStrm::Init( sal_Int32 nBgn, sal_Int32 nLen )
     {
         // determine the actual size of the stream by scanning
         // the FAT chain and counting the # of pages allocated
-        bool bOk = buildPageChainCache();
-        if (!bOk)
-            rIo.SetError( ERRCODE_IO_WRONGFORMAT );
-        nSize = m_aPagesCache.size() * nPageSize;
+        nSize = 0;
+        sal_Int32 nOldBgn = -1;
+        while( nBgn >= 0 && nBgn != nOldBgn )
+        {
+            nOldBgn = nBgn;
+            nBgn = pFat->GetNextPage( nBgn );
+            if( nBgn == nOldBgn )
+                rIo.SetError( ERRCODE_IO_WRONGFORMAT );
+            nSize += nPageSize;
+        }
     }
 }
 
diff --git a/sot/source/sdstor/stgstrms.hxx b/sot/source/sdstor/stgstrms.hxx
index cfae9e2..a6a0ad1 100644
--- a/sot/source/sdstor/stgstrms.hxx
+++ b/sot/source/sdstor/stgstrms.hxx
@@ -30,7 +30,6 @@
 #define _STGSTRMS_HXX
 
 #include <tools/stream.hxx>
-#include <vector>
 
 class StgIo;
 class StgStrm;
@@ -78,9 +77,6 @@ protected:
     sal_Int32 nPage;                        // current logical page
     short nOffset;                      // offset into current page
     short nPageSize;                    // logical page size
-    std::vector<sal_Int32> m_aPagesCache;
-    bool m_bSortedPageChain;
-    bool buildPageChainCache();
     sal_Bool  Copy( sal_Int32 nFrom, sal_Int32 nBytes );
     StgStrm( StgIo& );
 public:


More information about the Libreoffice-commits mailing list