You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2012/01/13 10:04:47 UTC

svn commit: r1230927 - /incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx

Author: alg
Date: Fri Jan 13 09:04:46 2012
New Revision: 1230927

URL: http://svn.apache.org/viewvc?rev=1230927&view=rev
Log:
#116758# added remembering allocated VDevs for VDevBuffer to be able to also delete these when vcl goes down; it should never happen, but You never know

Modified:
    incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx

Modified: incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx?rev=1230927&r1=1230926&r2=1230927&view=diff
==============================================================================
--- incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx (original)
+++ incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx Fri Jan 13 09:04:46 2012
@@ -43,7 +43,11 @@ namespace
     class VDevBuffer : public Timer, protected comphelper::OBaseMutex
     {
     private:
-        aBuffers            maBuffers;
+        // available buffers
+        aBuffers            maFreeBuffers;
+
+        // allocated/used buffers (remembered to allow deleteing them in destructor)
+        aBuffers            maUsedBuffers;
 
     public:
         VDevBuffer();
@@ -58,7 +62,8 @@ namespace
 
     VDevBuffer::VDevBuffer()
     :   Timer(),
-        maBuffers()
+        maFreeBuffers(),
+        maUsedBuffers()
     {
         SetTimeout(10L * 1000L); // ten seconds
     }
@@ -68,10 +73,16 @@ namespace
         ::osl::MutexGuard aGuard(m_aMutex);
         Stop();
 
-        while(!maBuffers.empty())
+        while(!maFreeBuffers.empty())
+        {
+            delete *(maFreeBuffers.end() - 1);
+            maFreeBuffers.pop_back();
+        }
+
+        while(!maUsedBuffers.empty())
         {
-            delete *(maBuffers.end() - 1);
-            maBuffers.pop_back();
+            delete *(maUsedBuffers.end() - 1);
+            maUsedBuffers.pop_back();
         }
     }
 
@@ -80,19 +91,19 @@ namespace
         ::osl::MutexGuard aGuard(m_aMutex);
         VirtualDevice* pRetval = 0;
 
-        if(!maBuffers.empty())
+        if(!maFreeBuffers.empty())
         {
             bool bOkay(false);
-            aBuffers::iterator aFound(maBuffers.end());
+            aBuffers::iterator aFound(maFreeBuffers.end());
 
-            for(aBuffers::iterator a(maBuffers.begin()); a != maBuffers.end(); a++)
+            for(aBuffers::iterator a(maFreeBuffers.begin()); a != maFreeBuffers.end(); a++)
             {
                 OSL_ENSURE(*a, "Empty pointer in VDevBuffer (!)");
 
                 if((bMono && 1 == (*a)->GetBitCount()) || (!bMono && (*a)->GetBitCount() > 1))
                 {
                     // candidate is valid due to bit depth
-                    if(aFound != maBuffers.end())
+                    if(aFound != maFreeBuffers.end())
                     {
                         // already found
                         if(bOkay)
@@ -133,10 +144,10 @@ namespace
                 }
             }
 
-            if(aFound != maBuffers.end())
+            if(aFound != maFreeBuffers.end())
             {
                 pRetval = *aFound;
-                maBuffers.erase(aFound);
+                maFreeBuffers.erase(aFound);
 
                 if(bOkay)
                 {
@@ -164,13 +175,20 @@ namespace
             pRetval->SetMapMode();
         }
 
+        // remember allocated buffer
+        maUsedBuffers.push_back(pRetval);
+
         return pRetval;
     }
 
     void VDevBuffer::free(VirtualDevice& rDevice)
     {
         ::osl::MutexGuard aGuard(m_aMutex);
-        maBuffers.push_back(&rDevice);
+        const aBuffers::iterator aUsedFound(::std::find(maUsedBuffers.begin(), maUsedBuffers.end(), &rDevice));
+        OSL_ENSURE(aUsedFound != maUsedBuffers.end(), "OOps, non-registered buffer freed (!)");
+
+        maUsedBuffers.erase(aUsedFound);
+        maFreeBuffers.push_back(&rDevice);
         Start();
     }
 
@@ -178,10 +196,10 @@ namespace
     {
         ::osl::MutexGuard aGuard(m_aMutex);
 
-        while(!maBuffers.empty())
+        while(!maFreeBuffers.empty())
         {
-            delete *(maBuffers.end() - 1);
-            maBuffers.pop_back();
+            delete *(maFreeBuffers.end() - 1);
+            maFreeBuffers.pop_back();
         }
     }
 }