[Libreoffice-commits] core.git: include/sal vcl/osx vcl/source
Jan-Marek Glogowski
glogow at fbihome.de
Tue Sep 19 12:12:30 UTC 2017
include/sal/log-areas.dox | 1
vcl/osx/salinst.cxx | 1
vcl/source/app/scheduler.cxx | 56 ++++++++++++++++++++++++++++++++++++++++++-
vcl/source/app/svmain.cxx | 5 ++-
4 files changed, 60 insertions(+), 3 deletions(-)
New commits:
commit fd0fff67798fea87217e65bb1561aa0d0e741c51
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date: Fri Jul 28 17:13:20 2017 +0200
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 at libreoffice.org>
Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>
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
+ at 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)
{
More information about the Libreoffice-commits
mailing list