vcl/inc/unx/saldisp.hxx         |   24 +++++++++++++++++++++++-
 vcl/unx/generic/app/saldisp.cxx |   22 +++++++++++-----------
 2 files changed, 34 insertions(+), 12 deletions(-)

New commits:
commit a1f5b1f30a5a80d7eeed2efe2564763bf1d12086
Author: Stephan Bergmann <sberg...@redhat.com>
Date:   Thu Jun 28 09:47:29 2018 +0200

    Clean up ownership tracking of SalVisual's visual (in X11 Visual base class)
    
    GCC trunk towards GCC 9 emits -Wdeprecated-copy because SalVisual has 
implicit
    copy functions but a user-declared dtor.  The implicitly-defined copy 
functions
    are actually used (so cannot be deleted), but in fragile interaction with 
the
    semantics of the user-provided dtor in the SalColormap(sal_uInt16) ctor.
    
    Changing SalVisual into a move-only class (moving the "this instance must 
delete
    its visual member" information) doesn't work well, as 
SalDisplay::ScreenData is
    used as a supply of SalVisual instances (but which will never be of the 
"this
    instance must delete its visual member" variety) that are then copied into
    SalColormap::m_aVisual.
    
    As only SalColormap creates SalVisual instances of the "this instance must
    delete its visual member" variety, what actually works is to track that
    information in SalColormap instead of directly in SalVisual, and make
    SalColormap a move-only class.
    
    Change-Id: Ib968a38c40b660ce91981b3c7b281f4add6ece6b
    Reviewed-on: https://gerrit.libreoffice.org/56579
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <sberg...@redhat.com>

diff --git a/vcl/inc/unx/saldisp.hxx b/vcl/inc/unx/saldisp.hxx
index a53be3692d8b..0bef7afb6c52 100644
--- a/vcl/inc/unx/saldisp.hxx
+++ b/vcl/inc/unx/saldisp.hxx
@@ -38,6 +38,7 @@ class   SalXLib;
 #include <vcl/ptrstyle.hxx>
 #include <sal/types.h>
 #include <osl/mutex.h>
+#include <cassert>
 #include <list>
 #include <unordered_map>
 #include <vector>
@@ -89,7 +90,6 @@ class SalVisual : public XVisualInfo
     int             nBlueBits_;
 public:
                             SalVisual();
-                            ~SalVisual();
                             SalVisual( const XVisualInfo* pXVI );
 
     VisualID        GetVisualId() const { return visualid; }
@@ -101,12 +101,29 @@ public:
             Color           GetTCColor( Pixel nPixel ) const;
 };
 
+// A move-only flag, used by SalColormap to track ownership of its 
m_aVisual.visual:
+struct OwnershipFlag {
+    bool owner = false;
+
+    OwnershipFlag() = default;
+
+    OwnershipFlag(OwnershipFlag && other) noexcept: owner(other.owner) { 
other.owner = false; }
+
+    OwnershipFlag & operator =(OwnershipFlag && other) noexcept {
+        assert(&other != this);
+        owner = other.owner;
+        other.owner = false;
+        return *this;
+    }
+};
+
 class SalColormap
 {
     const SalDisplay*       m_pDisplay;
     Colormap                m_hColormap;
     std::vector<Color>      m_aPalette;         // Pseudocolor
     SalVisual               m_aVisual;
+    OwnershipFlag           m_aVisualOwnership;
     std::vector<sal_uInt16>     m_aLookupTable;     // Pseudocolor: 12bit 
reduction
     Pixel                   m_nWhitePixel;
     Pixel                   m_nBlackPixel;
@@ -122,6 +139,11 @@ public:
     SalColormap( sal_uInt16         nDepth );
     SalColormap();
 
+    ~SalColormap();
+
+    SalColormap(SalColormap &&) = default;
+    SalColormap & operator =(SalColormap &&) = default;
+
     Colormap            GetXColormap() const { return m_hColormap; }
     const SalDisplay*   GetDisplay() const { return m_pDisplay; }
     inline  Display*            GetXDisplay() const;
diff --git a/vcl/unx/generic/app/saldisp.cxx b/vcl/unx/generic/app/saldisp.cxx
index 5d266828196a..dff49c8e8b7c 100644
--- a/vcl/unx/generic/app/saldisp.cxx
+++ b/vcl/unx/generic/app/saldisp.cxx
@@ -2435,11 +2435,6 @@ SalVisual::SalVisual( const XVisualInfo* pXVI )
     }
 }
 
-SalVisual::~SalVisual()
-{
-    if( -1 == screen && VisualID(-1) == visualid ) delete visual;
-}
-
 // Converts the order of bytes of a Pixel into bytes of a Color
 // This is not reversible for the 6 XXXA
 
@@ -2608,8 +2603,8 @@ SalColormap::SalColormap( sal_uInt16 nDepth )
                                &aVI ) )
         {
             aVI.visual          = new Visual;
-            aVI.visualid        = VisualID(0); // beware of temporary 
destructor below
-            aVI.screen          = 0;
+            aVI.visualid        = VisualID(-1);
+            aVI.screen          = -1;
             aVI.depth           = nDepth;
             aVI.c_class         = TrueColor;
             if( 24 == nDepth ) // 888
@@ -2661,16 +2656,21 @@ SalColormap::SalColormap( sal_uInt16 nDepth )
             aVI.visual->map_entries     = aVI.colormap_size;
 
             m_aVisual = SalVisual( &aVI );
-            // give ownership of constructed Visual() to m_aVisual
-            // see SalVisual destructor
-            m_aVisual.visualid        = VisualID(-1);
-            m_aVisual.screen          = -1;
+            m_aVisualOwnership.owner = true;
         }
         else
             m_aVisual = SalVisual( &aVI );
     }
 }
 
+SalColormap::~SalColormap()
+{
+    if (m_aVisualOwnership.owner)
+    {
+        delete m_aVisual.visual;
+    }
+}
+
 void SalColormap::GetPalette()
 {
     Pixel i;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to