[Libreoffice-commits] core.git: include/vcl vcl/source

Tobias Lippert drtl at fastmail.fm
Fri Feb 21 07:38:52 PST 2014


 include/vcl/settings.hxx    |   47 +++++------
 vcl/source/app/settings.cxx |  178 ++++++++------------------------------------
 2 files changed, 55 insertions(+), 170 deletions(-)

New commits:
commit a9cfb745c5ade8b05b97a33c4cb5cc66941b803d
Author: Tobias Lippert <drtl at fastmail.fm>
Date:   Sat Jan 11 21:03:11 2014 +0100

    Replace handwritten reference counting with shared_ptr
    
    This will help to avoid race conditions because the shared pointers
    are thread safe and use atomic increments.
    
    Conflicts:
    	include/vcl/settings.hxx
    	vcl/source/app/settings.cxx
    
    Change-Id: Ie3d27d6412167855a0cea1442676b81b733c15e8

diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx
index 0173b31..828c7a1 100644
--- a/include/vcl/settings.hxx
+++ b/include/vcl/settings.hxx
@@ -30,6 +30,8 @@
 #include <i18nlangtag/languagetag.hxx>
 #include <unotools/syslocale.hxx>
 
+#include <boost/shared_ptr.hpp>
+
 class CollatorWrapper;
 class LocaleDataWrapper;
 
@@ -44,12 +46,11 @@ namespace vcl {
 class ImplMouseData
 {
     friend class MouseSettings;
-
+public:
                                     ImplMouseData();
                                     ImplMouseData( const ImplMouseData& rData );
 
 private:
-    sal_uLong                           mnRefCount;
     sal_uLong                           mnOptions;
     sal_uLong                           mnDoubleClkTime;
     long                            mnDoubleClkWidth;
@@ -97,7 +98,7 @@ class VCL_DLLPUBLIC MouseSettings
     void                            CopyData();
 
 private:
-    ImplMouseData*                  mpData;
+    boost::shared_ptr<ImplMouseData>                  mpData;
 
 public:
                                     MouseSettings();
@@ -241,13 +242,12 @@ class ImplStyleData
 {
     friend class StyleSettings;
 
+public:
                                     ImplStyleData();
                                     ImplStyleData( const ImplStyleData& rData );
-    void                            SetStandardStyles();
 
 private:
-    sal_uLong                           mnRefCount;
-
+    void                            SetStandardStyles();
     Color                           maActiveBorderColor;
     Color                           maActiveColor;
     Color                           maActiveColor2;
@@ -434,7 +434,7 @@ class VCL_DLLPUBLIC StyleSettings
     void                            CopyData();
 
 private:
-    ImplStyleData*                  mpData;
+    boost::shared_ptr<ImplStyleData>                  mpData;
 
 public:
                                     StyleSettings();
@@ -833,8 +833,8 @@ public:
 
     void                            SetOptions( sal_uLong nOptions )
                                         { CopyData(); mpData->mnOptions = nOptions; }
-    sal_uLong                           GetOptions() const
-                                        { return mpData->mnOptions; }
+    sal_uLong                           GetOptions() const;
+
     void                            SetAutoMnemonic( bool bAutoMnemonic )
                                         { CopyData(); mpData->mnAutoMnemonic = (sal_uInt16)bAutoMnemonic; }
     bool                            GetAutoMnemonic() const
@@ -958,15 +958,15 @@ protected:
 class ImplMiscData
 {
     friend class MiscSettings;
+public:
 
                                     ImplMiscData();
                                     ImplMiscData( const ImplMiscData& rData );
 
 private:
-    sal_uLong                           mnRefCount;
-    AutoState                          mnEnableATT;
+    AutoState                       mnEnableATT;
     bool                            mbEnableLocalizedDecimalSep;
-    AutoState                          mnDisablePrinting;
+    AutoState                       mnDisablePrinting;
 };
 
 // ----------------
@@ -978,7 +978,7 @@ class VCL_DLLPUBLIC MiscSettings
     void                            CopyData();
 
 private:
-    ImplMiscData*                   mpData;
+    boost::shared_ptr<ImplMiscData>                   mpData;
 
 public:
                                     MiscSettings();
@@ -1006,12 +1006,11 @@ public:
 class ImplHelpData
 {
     friend class HelpSettings;
-
+public:
                                     ImplHelpData();
                                     ImplHelpData( const ImplHelpData& rData );
 
 private:
-    sal_uLong                           mnRefCount;
     sal_uLong                           mnOptions;
     sal_uLong                           mnTipDelay;
     sal_uLong                           mnTipTimeout;
@@ -1027,7 +1026,7 @@ class VCL_DLLPUBLIC HelpSettings
     void                            CopyData();
 
 private:
-    ImplHelpData*                   mpData;
+    boost::shared_ptr<ImplHelpData>                   mpData;
 
 public:
                                     HelpSettings();
@@ -1063,14 +1062,13 @@ public:
 // -----------------------
 class ImplAllSettingsData
 {
-    friend class    AllSettings;
-
-                    ImplAllSettingsData();
-                    ImplAllSettingsData( const ImplAllSettingsData& rData );
-                    ~ImplAllSettingsData();
+public:
+    ImplAllSettingsData();
+    ImplAllSettingsData( const ImplAllSettingsData& rData );
+    ~ImplAllSettingsData();
 
+    friend class    AllSettings;
 private:
-    sal_uLong                               mnRefCount;
     MouseSettings                           maMouseSettings;
     StyleSettings                           maStyleSettings;
     MiscSettings                            maMiscSettings;
@@ -1111,7 +1109,7 @@ class VCL_DLLPUBLIC AllSettings
     void                                    CopyData();
 
 private:
-    ImplAllSettingsData*                    mpData;
+    boost::shared_ptr<ImplAllSettingsData>                    mpData;
 
 public:
                                             AllSettings();
@@ -1125,8 +1123,7 @@ public:
 
     void                                    SetStyleSettings( const StyleSettings& rSet )
                                                 { CopyData(); mpData->maStyleSettings = rSet; }
-    const StyleSettings&                    GetStyleSettings() const
-                                                { return mpData->maStyleSettings; }
+    const StyleSettings&                    GetStyleSettings() const;
 
     void                                    SetMiscSettings( const MiscSettings& rSet )
                                                 { CopyData(); mpData->maMiscSettings = rSet; }
diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx
index a5b7dd9..9714747 100644
--- a/vcl/source/app/settings.cxx
+++ b/vcl/source/app/settings.cxx
@@ -48,6 +48,9 @@ using namespace ::com::sun::star;
 
 #include "svdata.hxx"
 #include "impimagetree.hxx"
+
+#include <boost/make_shared.hpp>
+
 // =======================================================================
 
 
@@ -55,7 +58,6 @@ using namespace ::com::sun::star;
 
 ImplMouseData::ImplMouseData()
 {
-    mnRefCount                  = 1;
     mnOptions                   = 0;
     mnDoubleClkTime             = 500;
     mnDoubleClkWidth            = 2;
@@ -83,7 +85,6 @@ ImplMouseData::ImplMouseData()
 
 ImplMouseData::ImplMouseData( const ImplMouseData& rData )
 {
-    mnRefCount                  = 1;
     mnOptions                   = rData.mnOptions;
     mnDoubleClkTime             = rData.mnDoubleClkTime;
     mnDoubleClkWidth            = rData.mnDoubleClkWidth;
@@ -110,49 +111,28 @@ ImplMouseData::ImplMouseData( const ImplMouseData& rData )
 // -----------------------------------------------------------------------
 
 MouseSettings::MouseSettings()
+: mpData(boost::make_shared<ImplMouseData>())
 {
-    mpData = new ImplMouseData();
 }
 
 // -----------------------------------------------------------------------
 
 MouseSettings::MouseSettings( const MouseSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" );
-
-    // copy shared instance data and increment reference counter
     mpData = rSet.mpData;
-    mpData->mnRefCount++;
 }
 
 // -----------------------------------------------------------------------
 
 MouseSettings::~MouseSettings()
 {
-    // delete data if last reference
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
 }
 
 // -----------------------------------------------------------------------
 
 const MouseSettings& MouseSettings::operator =( const MouseSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MouseSettings: RefCount overflow" );
-
-    // increment reference counter first, to be able to assign oneself
-    rSet.mpData->mnRefCount++;
-
-    // delete data if last reference
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
-
     mpData = rSet.mpData;
-
     return *this;
 }
 
@@ -160,11 +140,9 @@ const MouseSettings& MouseSettings::operator =( const MouseSettings& rSet )
 
 void MouseSettings::CopyData()
 {
-    // copy if another references exist
-    if ( mpData->mnRefCount != 1 )
-    {
-        mpData->mnRefCount--;
-        mpData = new ImplMouseData( *mpData );
+    // copy if other references exist
+    if ( ! mpData.unique() ) {
+        mpData = boost::make_shared<ImplMouseData>(*mpData);
     }
 }
 
@@ -208,7 +186,6 @@ ImplStyleData::ImplStyleData() :
     maPersonaHeaderBitmap(),
     maPersonaFooterBitmap()
 {
-    mnRefCount                  = 1;
     mnScrollBarSize             = 16;
     mnMinThumbSize              = 16;
     mnSplitSize                 = 3;
@@ -318,7 +295,6 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
     maPersonaHeaderBitmap( rData.maPersonaHeaderBitmap ),
     maPersonaFooterBitmap( rData.maPersonaFooterBitmap )
 {
-    mnRefCount                  = 1;
     mnBorderSize                = rData.mnBorderSize;
     mnTitleHeight               = rData.mnTitleHeight;
     mnFloatTitleHeight          = rData.mnFloatTitleHeight;
@@ -463,30 +439,21 @@ void ImplStyleData::SetStandardStyles()
 // -----------------------------------------------------------------------
 
 StyleSettings::StyleSettings()
+: mpData(boost::make_shared<ImplStyleData>())
 {
-    mpData = new ImplStyleData();
 }
 
 // -----------------------------------------------------------------------
 
 StyleSettings::StyleSettings( const StyleSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" );
-
-    // copy shared instance data and increment reference counter
     mpData = rSet.mpData;
-    mpData->mnRefCount++;
 }
 
 // -----------------------------------------------------------------------
 
 StyleSettings::~StyleSettings()
 {
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
 }
 
 const Size& StyleSettings::GetListBoxPreviewDefaultPixelSize() const
@@ -853,19 +820,7 @@ Color StyleSettings::GetSeparatorColor() const
 
 const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "StyleSettings: RefCount overflow" );
-
-    // increase reference counter first, to be able to assign oneself
-    rSet.mpData->mnRefCount++;
-
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
-
     mpData = rSet.mpData;
-
     return *this;
 }
 
@@ -874,10 +829,8 @@ const StyleSettings& StyleSettings::operator =( const StyleSettings& rSet )
 void StyleSettings::CopyData()
 {
     // copy if other references exist
-    if ( mpData->mnRefCount != 1 )
-    {
-        mpData->mnRefCount--;
-        mpData = new ImplStyleData( *mpData );
+    if ( ! mpData.unique() ) {
+        mpData = boost::make_shared<ImplStyleData>(*mpData);
     }
 }
 
@@ -1002,7 +955,6 @@ bool StyleSettings::operator ==( const StyleSettings& rSet ) const
 
 ImplMiscData::ImplMiscData()
 {
-    mnRefCount                  = 1;
     mnEnableATT                 = AUTO_STATE_AUTO;
     mnDisablePrinting           = AUTO_STATE_AUTO;
     static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI
@@ -1013,7 +965,6 @@ ImplMiscData::ImplMiscData()
 
 ImplMiscData::ImplMiscData( const ImplMiscData& rData )
 {
-    mnRefCount                  = 1;
     mnEnableATT                 = rData.mnEnableATT;
     mnDisablePrinting           = rData.mnDisablePrinting;
     mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep;
@@ -1022,49 +973,28 @@ ImplMiscData::ImplMiscData( const ImplMiscData& rData )
 // -----------------------------------------------------------------------
 
 MiscSettings::MiscSettings()
+: mpData(boost::make_shared<ImplMiscData>())
 {
-    mpData = new ImplMiscData();
 }
 
 // -----------------------------------------------------------------------
 
 MiscSettings::MiscSettings( const MiscSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
-
-    // copy shared instance data and increment reference counter
     mpData = rSet.mpData;
-    mpData->mnRefCount++;
 }
 
 // -----------------------------------------------------------------------
 
 MiscSettings::~MiscSettings()
 {
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
 }
 
 // -----------------------------------------------------------------------
 
 const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "MiscSettings: RefCount overflow" );
-
-    //  increase reference counter first, to be able to assign oneself
-    rSet.mpData->mnRefCount++;
-
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
-
     mpData = rSet.mpData;
-
     return *this;
 }
 
@@ -1073,10 +1003,8 @@ const MiscSettings& MiscSettings::operator =( const MiscSettings& rSet )
 void MiscSettings::CopyData()
 {
     // copy if other references exist
-    if ( mpData->mnRefCount != 1 )
-    {
-        mpData->mnRefCount--;
-        mpData = new ImplMiscData( *mpData );
+    if ( ! mpData.unique() ) {
+        mpData = boost::make_shared<ImplMiscData>(*mpData);
     }
 }
 
@@ -1251,7 +1179,6 @@ bool MiscSettings::GetEnableLocalizedDecimalSep() const
 
 ImplHelpData::ImplHelpData()
 {
-    mnRefCount                  = 1;
     mnOptions                   = 0;
     mnTipDelay                  = 500;
     mnTipTimeout                = 3000;
@@ -1262,7 +1189,6 @@ ImplHelpData::ImplHelpData()
 
 ImplHelpData::ImplHelpData( const ImplHelpData& rData )
 {
-    mnRefCount                  = 1;
     mnOptions                   = rData.mnOptions;
     mnTipDelay                  = rData.mnTipDelay;
     mnTipTimeout                = rData.mnTipTimeout;
@@ -1272,49 +1198,28 @@ ImplHelpData::ImplHelpData( const ImplHelpData& rData )
 // -----------------------------------------------------------------------
 
 HelpSettings::HelpSettings()
+: mpData(boost::make_shared<ImplHelpData>())
 {
-    mpData = new ImplHelpData();
 }
 
 // -----------------------------------------------------------------------
 
 HelpSettings::HelpSettings( const HelpSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
-
-    // copy shared instance data and increment reference counter
     mpData = rSet.mpData;
-    mpData->mnRefCount++;
 }
 
 // -----------------------------------------------------------------------
 
 HelpSettings::~HelpSettings()
 {
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
 }
 
 // -----------------------------------------------------------------------
 
 const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "HelpSettings: RefCount overflow" );
-
-    // increase reference counter first, to be able to assign oneself
-    rSet.mpData->mnRefCount++;
-
-    // delete data if last reference
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
-
     mpData = rSet.mpData;
-
     return *this;
 }
 
@@ -1322,11 +1227,9 @@ const HelpSettings& HelpSettings::operator =( const HelpSettings& rSet )
 
 void HelpSettings::CopyData()
 {
-    // copy of other references exist
-    if ( mpData->mnRefCount != 1 )
-    {
-        mpData->mnRefCount--;
-        mpData = new ImplHelpData( *mpData );
+    // copy if other references exist
+    if ( ! mpData.unique() ) {
+        mpData = boost::make_shared<ImplHelpData>(*mpData);
     }
 }
 
@@ -1353,7 +1256,6 @@ ImplAllSettingsData::ImplAllSettingsData()
         maLocale( LANGUAGE_SYSTEM ),
         maUILocale( LANGUAGE_SYSTEM )
 {
-    mnRefCount                  = 1;
     mnSystemUpdate              = SETTINGS_ALLSETTINGS;
     mnWindowUpdate              = SETTINGS_ALLSETTINGS;
     mpLocaleDataWrapper         = NULL;
@@ -1373,7 +1275,6 @@ ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) :
     maLocale( rData.maLocale ),
     maUILocale( rData.maUILocale )
 {
-    mnRefCount                  = 1;
     mnSystemUpdate              = rData.mnSystemUpdate;
     mnWindowUpdate              = rData.mnWindowUpdate;
     // Pointer couldn't shared and objects haven't a copy ctor
@@ -1400,51 +1301,28 @@ ImplAllSettingsData::~ImplAllSettingsData()
 // -----------------------------------------------------------------------
 
 AllSettings::AllSettings()
+: mpData(boost::make_shared<ImplAllSettingsData>())
 {
-
-    mpData = new ImplAllSettingsData();
 }
 
 // -----------------------------------------------------------------------
 
 AllSettings::AllSettings( const AllSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "Settings: RefCount overflow" );
-
-    // copy shared instance data and increse reference counter
     mpData = rSet.mpData;
-    mpData->mnRefCount++;
 }
 
 // -----------------------------------------------------------------------
 
 AllSettings::~AllSettings()
 {
-
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
 }
 
 // -----------------------------------------------------------------------
 
 const AllSettings& AllSettings::operator =( const AllSettings& rSet )
 {
-    DBG_ASSERT( rSet.mpData->mnRefCount < 0xFFFFFFFE, "AllSettings: RefCount overflow" );
-
-    // increase reference counter first, to be able to assign oneself
-    rSet.mpData->mnRefCount++;
-
-    // if last reference then delete data
-    if ( mpData->mnRefCount == 1 )
-        delete mpData;
-    else
-        mpData->mnRefCount--;
-
     mpData = rSet.mpData;
-
     return *this;
 }
 
@@ -1452,13 +1330,11 @@ const AllSettings& AllSettings::operator =( const AllSettings& rSet )
 
 void AllSettings::CopyData()
 {
-
     // copy if other references exist
-    if ( mpData->mnRefCount != 1 )
-    {
-        mpData->mnRefCount--;
-        mpData = new ImplAllSettingsData( *mpData );
+    if ( ! mpData.unique() ) {
+        mpData = boost::make_shared<ImplAllSettingsData>(*mpData);
     }
+
 }
 
 // -----------------------------------------------------------------------
@@ -1747,4 +1623,16 @@ void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint )
     Application::SetSettings( aAllSettings );
 }
 
+const StyleSettings&
+AllSettings::GetStyleSettings() const
+{
+    return mpData->maStyleSettings;
+}
+
+sal_uLong
+StyleSettings::GetOptions() const
+{
+    return mpData->mnOptions;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list