diff options
| author | Jan-Marek Glogowski <glogow@fbihome.de> | 2017-07-28 17:13:20 +0200 |
|---|---|---|
| committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2017-09-19 14:11:58 +0200 |
| commit | fd0fff67798fea87217e65bb1561aa0d0e741c51 (patch) | |
| tree | 6edfff84fa39d92e16f18f143a8f5de39d48eff3 | |
| parent | 7e1489bb4c2d11380d28cea2c3cf5d76303eecae (diff) | |
Assert active Tasks on scheduler de-init
This shuts down the VCL scheduler later in the DeInitVCL call and
asserts active pending tasks, as these will never be processed
after shutdown.
There is currently a TODO whitelist, so the unit tests still pass
but probably most of these should be fixed. No task in the list
looks critical - all seem to do some idle / cleanup work.
This also processes all the Idles before shutdown. All seem to be
of type sfx::SfxItemDisruptor_Impl.
Change-Id: I9cc484a525cc2bacd54c4f271f86997517393e92
Reviewed-on: https://gerrit.libreoffice.org/40533
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
| -rw-r--r-- | include/sal/log-areas.dox | 1 | ||||
| -rw-r--r-- | vcl/osx/salinst.cxx | 1 | ||||
| -rw-r--r-- | vcl/source/app/scheduler.cxx | 56 | ||||
| -rw-r--r-- | vcl/source/app/svmain.cxx | 5 |
4 files changed, 60 insertions, 3 deletions
diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox index 46a75f5a6151..8539f4755cd6 100644 --- a/include/sal/log-areas.dox +++ b/include/sal/log-areas.dox @@ -459,6 +459,7 @@ certain functionality. @li @c vcl.plugadapt - the Unix/X11 backend plugin mechanism @li @c vcl.quartz @li @c vcl.schedule - scheduler / main-loop information +@li @c vcl.schedule.deinit @li @c vcl.screensaverinhibitor @li @c vcl.scrollbar - Scroll Bars @li @c vcl.se - VCL Session Manager diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx index 5e5415fef884..56dd7bef8feb 100644 --- a/vcl/osx/salinst.cxx +++ b/vcl/osx/salinst.cxx @@ -108,6 +108,7 @@ void AquaSalInstance::delayedSettingsChanged( bool bInvalidate ) { osl::Guard< comphelper::SolarMutex > aGuard( *mpSalYieldMutex ); AquaDelayedSettingsChanged* pIdle = new AquaDelayedSettingsChanged( bInvalidate ); + pIdle->SetDebugName( "AquaSalInstance AquaDelayedSettingsChanged" ); pIdle->Start(); } diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx index 54922ccceaa9..d4d16384137a 100644 --- a/vcl/source/app/scheduler.cxx +++ b/vcl/source/app/scheduler.cxx @@ -95,6 +95,22 @@ void Scheduler::ImplDeInitScheduler() DBG_TESTSOLARMUTEX(); SchedulerGuard aSchedulerGuard; + +#if OSL_DEBUG_LEVEL > 0 + { + ImplSchedulerData* pSchedulerData = rSchedCtx.mpFirstSchedulerData; + sal_uInt32 nTasks = 0; + while ( pSchedulerData ) + { + ++nTasks; + pSchedulerData = pSchedulerData->mpNext; + } + SAL_INFO( "vcl.schedule.deinit", "DeInit the scheduler - tasks: " << nTasks ); + } + + // clean up all the sfx::SfxItemDisruptor_Impl Idles + ProcessEventsToIdle(); +#endif rSchedCtx.mbActive = false; assert( nullptr == rSchedCtx.mpSchedulerStack ); @@ -103,19 +119,57 @@ void Scheduler::ImplDeInitScheduler() if (rSchedCtx.mpSalTimer) rSchedCtx.mpSalTimer->Stop(); DELETEZ( rSchedCtx.mpSalTimer ); +#if OSL_DEBUG_LEVEL > 0 + sal_uInt32 nActiveTasks = 0, nIgnoredTasks = 0; +#endif ImplSchedulerData* pSchedulerData = rSchedCtx.mpFirstSchedulerData; while ( pSchedulerData ) { Task *pTask = pSchedulerData->mpTask; if ( pTask ) { - pTask->mbActive = false; + if ( pTask->mbActive ) + { +#if OSL_DEBUG_LEVEL > 0 + const char *sIgnored = ""; + ++nActiveTasks; + // TODO: shutdown these timers before Scheduler de-init + // TODO: remove Task from static object + if ( pTask->GetDebugName() && ( false + || !strcmp( pTask->GetDebugName(), "desktop::Desktop m_firstRunTimer" ) + || !strcmp( pTask->GetDebugName(), "editeng::ImpEditEngine aOnlineSpellTimer" ) + || !strcmp( pTask->GetDebugName(), "ImplHandleMouseMsg SalData::mpMouseLeaveTimer" ) + || !strcmp( pTask->GetDebugName(), "sc ScModule IdleTimer" ) + || !strcmp( pTask->GetDebugName(), "sd::CacheConfiguration maReleaseTimer" ) + || !strcmp( pTask->GetDebugName(), "svtools::GraphicCache maReleaseTimer" ) + || !strcmp( pTask->GetDebugName(), "svtools::GraphicObject mpSwapOutTimer" ) + || !strcmp( pTask->GetDebugName(), "svx OLEObjCache pTimer UnloadCheck" ) + || !strcmp( pTask->GetDebugName(), "vcl::win GdiPlusBuffer aGdiPlusBuffer" ) + )) + { + sIgnored = " (ignored)"; + ++nIgnoredTasks; + } + const Timer *timer = dynamic_cast<Timer*>( pTask ); + if ( timer ) + SAL_WARN( "vcl.schedule.deinit", "DeInit task: " << *timer << sIgnored ); + else + SAL_WARN( "vcl.schedule.deinit", "DeInit task: " << *pTask << sIgnored ); +#endif + pTask->mbActive = false; + } pTask->mpSchedulerData = nullptr; } ImplSchedulerData* pDeleteSchedulerData = pSchedulerData; pSchedulerData = pSchedulerData->mpNext; delete pDeleteSchedulerData; } +#if OSL_DEBUG_LEVEL > 0 + SAL_INFO( "vcl.schedule.deinit", "DeInit the scheduler - finished" ); + SAL_WARN_IF( 0 != nActiveTasks, "vcl.schedule.deinit", "DeInit active tasks: " + << nActiveTasks << " (ignored: " << nIgnoredTasks << ")" ); + assert( nIgnoredTasks == nActiveTasks ); +#endif rSchedCtx.mpFirstSchedulerData = nullptr; rSchedCtx.mpLastSchedulerData = nullptr; diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index a8e42ad394d7..581fb820c96c 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -469,8 +469,6 @@ void DeInitVCL() pSVData->mpSettingsConfigItem = nullptr; } - Scheduler::ImplDeInitScheduler(); - pSVData->maWinData.maMsgBoxImgList.clear(); pSVData->maCtrlData.maCheckImgList.clear(); pSVData->maCtrlData.maRadioImgList.clear(); @@ -578,6 +576,8 @@ void DeInitVCL() delete pSVData->maGDIData.mpScreenFontCache; pSVData->maGDIData.mpScreenFontCache = nullptr; + Scheduler::ImplDeInitScheduler(); + // destroy all Sal interfaces before destroying the instance // and thereby unloading the plugin delete pSVData->mpSalSystem; @@ -611,6 +611,7 @@ void DeInitVCL() pSVData->maWinData.mpTrackWin = nullptr; pSVData->maWinData.mpAutoScrollWin = nullptr; pSVData->maWinData.mpLastWheelWindow = nullptr; + // Deinit Sal if (pSVData->mpDefInst) { |
