chart2/source/controller/main/ChartController.cxx | 16 +++++++++--- chart2/source/controller/main/ControllerCommandDispatch.cxx | 9 ++++++ svl/source/items/itemset.cxx | 9 ------ 3 files changed, 21 insertions(+), 13 deletions(-)
New commits: commit 47588a4c98f1b668c7ffe2575c7e0851a63316bb Author: Michael Stahl <mst...@redhat.com> Date: Fri Nov 28 19:16:17 2014 +0100 svl: SfxItemSet: get rid of the "no master pool" warning spam No idea why that would be a problem. Change-Id: Ib655b71ed8cd8a4fe8200209c929434832f3614e diff --git a/svl/source/items/itemset.cxx b/svl/source/items/itemset.cxx index c397312..22105af 100644 --- a/svl/source/items/itemset.cxx +++ b/svl/source/items/itemset.cxx @@ -89,7 +89,6 @@ SfxItemSet::SfxItemSet _pParent( 0 ), _nCount( 0 ) { - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); // DBG_ASSERT( bTotalRanges || abs( &bTotalRanges - this ) < 1000, // "please use suitable ranges" ); #if defined DBG_UTIL && defined SFX_ITEMSET_NO_DEFAULT_CTOR @@ -117,7 +116,6 @@ SfxItemSet::SfxItemSet( SfxItemPool& rPool, sal_uInt16 nWhich1, sal_uInt16 nWhic _nCount( 0 ) { assert(nWhich1 <= nWhich2); - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); InitRanges_Impl(nWhich1, nWhich2); } @@ -154,7 +152,6 @@ SfxItemSet::SfxItemSet( SfxItemPool& rPool, _nCount( 0 ) { assert(nWh1 <= nWh2); - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); if(!nNull) InitRanges_Impl( @@ -201,8 +198,6 @@ SfxItemSet::SfxItemSet( SfxItemPool& rPool, const sal_uInt16* pWhichPairTable ) , _pWhichRanges(0) , _nCount(0) { - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); - // pWhichPairTable == 0 ist f"ur das SfxAllEnumItemSet if ( pWhichPairTable ) InitRanges_Impl(pWhichPairTable); @@ -213,8 +208,6 @@ SfxItemSet::SfxItemSet( const SfxItemSet& rASet ): _pParent( rASet._pParent ), _nCount( rASet._nCount ) { - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); - // Calculate the attribute count sal_uInt16 nCnt = 0; sal_uInt16* pPtr = rASet._pWhichRanges; @@ -1402,7 +1395,6 @@ SvStream &SfxItemSet::Store ) const { assert(_pPool); - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); // Remember position of the count (to be able to correct it, if need be) sal_uLong nCountPos = rStream.Tell(); @@ -1467,7 +1459,6 @@ SvStream &SfxItemSet::Load ) { assert(_pPool); - SAL_WARN_IF(_pPool != _pPool->GetMasterPool(), "svl.items", "no Master Pool"); // No RefPool => Resolve Surrogates with ItemSet's Pool if ( !pRefPool ) commit 426ef2847cbdc74c068531915efb852a727cd3ee Author: Michael Stahl <mst...@redhat.com> Date: Fri Nov 28 18:39:52 2014 +0100 chart2: ChartController: fix CommandDispatchContainer access locking crashes on concurrent setModel() and getDispatchForURL() in JunitTest_chart2_unoapi: Thread 13: 7 in (anonymous namespace)::Frame::isActionLocked (this=0x2b66c0e4a090) at /home/tinderbox/master/framework/source/services/frame.cxx:2596 8 in (anonymous namespace)::Frame::close (this=0x2b66c0e4a090, bDeliverOwnership=0 '\000') at /home/tinderbox/master/framework/source/services/frame.cxx:1772 9 in chart::ChartController::notifyClosing (this=0x2b668ae41058, rSource=...) at /home/tinderbox/master/chart2/source/controller/main/ChartController.cxx:872 10 in apphelper::CloseableLifeTimeManager::impl_doClose (this=0x2b669a0b1d08) at /home/tinderbox/master/chart2/source/tools/LifeTime.cxx:360 11 in apphelper::CloseableLifeTimeManager::g_close_endTryClose_doClose (this=0x2b669a0b1d08) at /home/tinderbox/master/chart2/source/tools/LifeTime.cxx:311 12 in chart::ChartModel::close (this=0x2b669a0b1c28, bDeliverOwnership=1 '\001') at /home/tinderbox/master/chart2/source/model/main/ChartModel.cxx:659 Thread 1: 4 in std::__debug::map<rtl::OUString, com::sun::star::uno::Reference<com::sun::star::frame::XDispatch>, std::less<rtl::OUString>, std::allocator<std::pair<rtl::OUString const, com::sun::star::uno::Reference<com::sun::star::frame::XDispatch> > > >::find (this=0x2b668ae41248, __x=...) at /usr/include/c++/4.8.3/debug/map.h:382 No locals. 5 in chart::CommandDispatchContainer::getDispatchForURL (this=0x2b668ae41248, rURL=...) at /home/tinderbox/master/chart2/source/controller/main/CommandDispatchContainer.cxx:80 6 in chart::ChartController::queryDispatch (this=0x2b668ae41058, rURL=..., rTargetFrameName=...) at /home/tinderbox/master/chart2/source/controller/main/ChartController.cxx:1003 No locals. 7 in framework::DispatchProvider::implts_queryFrameDispatch (this=0x2b66a3fd21e8, xFrame=..., aURL=..., sTargetFrameName=..., nSearchFlags=0) at /home/tinderbox/master/framework/source/dispatch/dispatchprovider.cxx:374 8 in framework::DispatchProvider::queryDispatch (this=0x2b66a3fd21e8, aURL=..., sTargetFrameName=..., nSearchFlags=0) at /home/tinderbox/master/framework/source/dispatch/dispatchprovider.cxx:111 9 in framework::InterceptionHelper::queryDispatch (this=0x2b668a61bc08, aURL=..., sTargetFrameName=..., nSearchFlags=0) at /home/tinderbox/master/framework/source/dispatch/interceptionhelper.cxx:78 10 in (anonymous namespace)::Frame::queryDispatch (this=0x2b66c0e4a090, aURL=..., sTargetFrameName=..., nSearchFlags=0) at /home/tinderbox/master/framework/source/services/frame.cxx:2227 11 in svt::ToolboxController::bindListener (this=0x2b66c0f72740) at /home/tinderbox/master/svtools/source/uno/toolboxcontroller.cxx:529 12 in svt::ToolboxController::update (this=0x2b66c0f72740) at /home/tinderbox/master/svtools/source/uno/toolboxcontroller.cxx:232 13 in framework::ToolBarManager::UpdateControllers (this=0x2b669a0a1728) at /home/tinderbox/master/framework/source/uielement/toolbarmanager.cxx:440 14 in framework::ToolBarManager::AsyncUpdateControllersHdl (this=0x2b669a0a1728) at /home/tinderbox/master/framework/source/uielement/toolbarmanager.cxx:2110 15 in framework::ToolBarManager::LinkStubAsyncUpdateControllersHdl (pThis=0x2b669a0a1728, pCaller=0x2b669a0a1890) at /home/tinderbox/master/framework/source/uielement/toolbarmanager.cxx:2097 16 in Link::Call (this=0x2b669a0a18b0, pCaller=0x2b669a0a1890) at /home/tinderbox/master/include/tools/link.hxx:139 17 in Timer::Timeout (this=0x2b669a0a1890) at /home/tinderbox/master/vcl/source/app/timer.cxx:276 Change-Id: I17ef63db8f7c288460e00031e8e8a5c3e4d086b3 diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index a9ff0c6..7accfe9 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -491,10 +491,10 @@ sal_Bool SAL_CALL ChartController::attachModel( const uno::Reference< frame::XMo //is called to attach the controller to a new model. //return true if attach was successfully, false otherwise (e.g. if you do not work with a model) - SolarMutexClearableGuard aClearableGuard; + SolarMutexResettableGuard aGuard; if( impl_isDisposedOrSuspended() ) //@todo? allow attaching a new model while suspended? return sal_False; //behave passive if already disposed or suspended - aClearableGuard.clear(); + aGuard.clear(); TheModelRef aNewModelRef( new TheModel( xModel), m_aModelMutex); TheModelRef aOldModelRef(m_aModel,m_aModelMutex); @@ -519,6 +519,7 @@ sal_Bool SAL_CALL ChartController::attachModel( const uno::Reference< frame::XMo //--handle relations to the new model aNewModelRef->addListener( this ); + aGuard.reset(); // lock for m_aDispatchContainer access // set new model at dispatchers m_aDispatchContainer.setModel( aNewModelRef->getModel()); ControllerCommandDispatch * pDispatch = new ControllerCommandDispatch( m_xCC, this, &m_aDispatchContainer ); @@ -542,6 +543,7 @@ sal_Bool SAL_CALL ChartController::attachModel( const uno::Reference< frame::XMo pShapeController->initialize(); m_aDispatchContainer.setShapeController( pShapeController ); } + aGuard.clear(); #ifdef TEST_ENABLE_MODIFY_LISTENER uno::Reference< util::XModifyBroadcaster > xMBroadcaster( aNewModelRef->getModel(),uno::UNO_QUERY ); @@ -565,7 +567,7 @@ sal_Bool SAL_CALL ChartController::attachModel( const uno::Reference< frame::XMo //the frameloader is responsible to call xModel->connectController { - SolarMutexGuard aGuard; + SolarMutexGuard aGuard2; if( m_pChartWindow ) m_pChartWindow->Invalidate(); } @@ -784,6 +786,7 @@ void SAL_CALL ChartController::dispose() //// @todo integrate specialized implementation //e.g. release further resources and references + SolarMutexGuard g; m_aDispatchContainer.DisposeAndClear(); } catch( const uno::Exception & ex ) @@ -894,7 +897,10 @@ bool ChartController::impl_releaseThisModel( } } if( bReleaseModel ) + { + SolarMutexGuard g; m_aDispatchContainer.setModel( 0 ); + } return bReleaseModel; } @@ -997,6 +1003,8 @@ uno::Reference<frame::XDispatch> SAL_CALL sal_Int32 /* nSearchFlags */) throw(uno::RuntimeException, std::exception) { + SolarMutexGuard aGuard; + if ( !m_aLifeTimeManager.impl_isDisposed() && getModel().is() ) { if( !rTargetFrameName.isEmpty() && rTargetFrameName == "_self" ) @@ -1010,6 +1018,8 @@ uno::Sequence<uno::Reference<frame::XDispatch > > const uno::Sequence<frame::DispatchDescriptor>& xDescripts ) throw(uno::RuntimeException, std::exception) { + SolarMutexGuard g; + if ( !m_aLifeTimeManager.impl_isDisposed() ) { return m_aDispatchContainer.getDispatchesForURLs( xDescripts ); diff --git a/chart2/source/controller/main/ControllerCommandDispatch.cxx b/chart2/source/controller/main/ControllerCommandDispatch.cxx index 7f4f4c1..e28fbe8 100644 --- a/chart2/source/controller/main/ControllerCommandDispatch.cxx +++ b/chart2/source/controller/main/ControllerCommandDispatch.cxx @@ -32,6 +32,8 @@ #include "StatisticsHelper.hxx" #include "ShapeController.hxx" +#include <vcl/svapp.hxx> + #include <com/sun/star/util/XModifyBroadcaster.hpp> #include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/chart2/XChartDocument.hpp> @@ -698,7 +700,12 @@ bool ControllerCommandDispatch::commandAvailable( const OUString & rCommand ) bool ControllerCommandDispatch::isShapeControllerCommandAvailable( const OUString& rCommand ) { - ShapeController* pShapeController = ( m_pDispatchContainer ? m_pDispatchContainer->getShapeController() : NULL ); + ShapeController* pShapeController(0); + { + SolarMutexGuard g; + if (m_pDispatchContainer) + pShapeController = m_pDispatchContainer->getShapeController(); + } if ( pShapeController ) { FeatureState aState( pShapeController->getState( rCommand ) ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits