From eec11a3064e40c810971350223a6b42cc150bc4c Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Thu, 14 Apr 2016 11:19:05 +0200 Subject: Race between Frame::dispose and timer-triggered LayoutManager::AsyncLayouHdl Change-Id: I8e9ca61c2a8334697b7a0adef7a2fc20f503f299 --- framework/source/layoutmanager/layoutmanager.cxx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'framework') diff --git a/framework/source/layoutmanager/layoutmanager.cxx b/framework/source/layoutmanager/layoutmanager.cxx index 4eff39e2efdc..f2c598a9efc2 100644 --- a/framework/source/layoutmanager/layoutmanager.cxx +++ b/framework/source/layoutmanager/layoutmanager.cxx @@ -2328,7 +2328,19 @@ bool LayoutManager::implts_doLayout( bool bForceRequestBorderSpace, bool bOuterR awt::Rectangle aCurrBorderSpace( m_aDockingArea ); Reference< awt::XWindow > xContainerWindow( m_xContainerWindow ); Reference< awt::XTopWindow2 > xContainerTopWindow( m_xContainerTopWindow ); - Reference< awt::XWindow > xComponentWindow( m_xFrame->getComponentWindow() ); + Reference< awt::XWindow > xComponentWindow; + try { + xComponentWindow = m_xFrame->getComponentWindow(); + } catch (css::lang::DisposedException &) { + // There can be a race between one thread calling Frame::dispose + // (framework/source/services/frame.cxx) -> Frame::disableLayoutManager + // -> LayoutManager::attachFrame(null) setting m_xFrame to null, and + // the main thread firing the timer-triggered + // LayoutManager::AsyncLayoutHdl -> LayoutManager::implts_doLayout and + // calling into the in-dispose m_xFrame here, so silently ignore a + // DisposedException here: + return false; + } Reference< XDockingAreaAcceptor > xDockingAreaAcceptor( m_xDockingAreaAcceptor ); aReadLock.clear(); /* SAFE AREA ----------------------------------------------------------------------------------------------- */ -- cgit