diff options
author | Michael Meeks <michael.meeks@novell.com> | 2010-11-25 16:25:55 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@novell.com> | 2010-11-25 16:26:38 +0000 |
commit | 3583b0cab416295c2dd7d553eb7b5e6ee10d0101 (patch) | |
tree | 1343affb74e7b15895d3a815198724e3d9a01bd9 | |
parent | 785ef1daae1e0f508edf5bff7e1dd09574daf6bd (diff) |
fix crash in exiting via disabling lone quick-starter, terminate at idle
-rw-r--r-- | sfx2/source/appl/shutdownicon.cxx | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/sfx2/source/appl/shutdownicon.cxx b/sfx2/source/appl/shutdownicon.cxx index 4cd45e6153..85e366fab7 100644 --- a/sfx2/source/appl/shutdownicon.cxx +++ b/sfx2/source/appl/shutdownicon.cxx @@ -182,6 +182,9 @@ bool ShutdownIcon::LoadModule( osl::Module **pModule, return true; } +// These two timeouts are necessary to avoid there being +// plugin frames still on the stack, after unloading that +// code, causing a crash during disabling / termination. class IdleUnloader : Timer { ::osl::Module *m_pModule; @@ -199,6 +202,22 @@ public: } }; +class IdleTerminate : Timer +{ + Reference< XDesktop > m_xDesktop; +public: + IdleTerminate (Reference< XDesktop > xDesktop) + { + m_xDesktop = xDesktop; + Start(); + } + virtual void Timeout() + { + m_xDesktop->terminate(); + delete this; + } +}; + void ShutdownIcon::initSystray() { if (m_bInitialized) @@ -576,11 +595,8 @@ void ShutdownIcon::terminateDesktop() if ( xSupplier.is() ) { Reference< XIndexAccess > xTasks ( xSupplier->getFrames(), UNO_QUERY ); - if( xTasks.is() ) - { - if( xTasks->getCount() < 1 ) - xDesktop->terminate(); - } + if( xTasks.is() && xTasks->getCount() < 1 ) + new IdleTerminate( xDesktop ); } // remove the instance pointer |