diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2018-08-24 18:31:35 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2018-08-27 20:30:57 +0200 |
commit | 107f0e6dba57a5b27366a35a5cdb184079546df0 (patch) | |
tree | 497a02c9d0485575e84d65e6d093b5ce54fcb661 /sw/source | |
parent | 8e79ca904622a90b72e198f97441452d1bfffdc0 (diff) |
tdf#119458 fix sw background Idle state handling
Starting the SwDocIdle in StartIdeling() just reintroduces the
bug fixed in commit 401cba4c20fb ("tdf#116370 cleanup Writer idle
job handing"), so trading one bug for the other.
For the real solution we have to handle two states:
1. The SwDocIdle being active
2. The SwDocIdle being blocked
For the first state we can just use the active state of the Idle
itself. Since it's not a AutoIdle, it will be turned of, if
invoked. Either some Idle handler will want to be run it again or
some other thread might start it again, if needed.
Since we're now tracking the wanted Idle state via the active task
flag, we can drop the explicit mbStartIdleTimer handling.
As a result of the first change, we can't stop the Idle anymore
when blocking it. But the Idle itself checks its ready state via
IsDocIdle() in its UpdateMinPeriod function, so we have to add
the blocking state to IsDocIdle().
Change-Id: I33017a8e07208a6a3bce761cc899ac3ca944cd61
Reviewed-on: https://gerrit.libreoffice.org/59586
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/doc/DocumentTimerManager.cxx | 39 | ||||
-rw-r--r-- | sw/source/core/inc/DocumentTimerManager.hxx | 7 |
2 files changed, 19 insertions, 27 deletions
diff --git a/sw/source/core/doc/DocumentTimerManager.cxx b/sw/source/core/doc/DocumentTimerManager.cxx index 205e5992e59c..6195b8fdf961 100644 --- a/sw/source/core/doc/DocumentTimerManager.cxx +++ b/sw/source/core/doc/DocumentTimerManager.cxx @@ -38,46 +38,39 @@ namespace sw { DocumentTimerManager::DocumentTimerManager( SwDoc& i_rSwdoc ) : m_rDoc( i_rSwdoc ), - mbStartIdleTimer( false ), - mIdleBlockCount( 0 ), - maDocIdle( i_rSwdoc ) + m_nIdleBlockCount( 0 ), + m_aDocIdle( i_rSwdoc ) { - maDocIdle.SetPriority( TaskPriority::LOWEST ); - maDocIdle.SetInvokeHandler( LINK( this, DocumentTimerManager, DoIdleJobs) ); - maDocIdle.SetDebugName( "sw::DocumentTimerManager maDocIdle" ); + m_aDocIdle.SetPriority(TaskPriority::LOWEST); + m_aDocIdle.SetInvokeHandler(LINK( this, DocumentTimerManager, DoIdleJobs)); + m_aDocIdle.SetDebugName("sw::DocumentTimerManager m_aDocIdle"); } void DocumentTimerManager::StartIdling() { - if( !mIdleBlockCount ) - { - mbStartIdleTimer = false; - maDocIdle.Start(); - } - else - mbStartIdleTimer = true; + if (!m_aDocIdle.IsActive()) + m_aDocIdle.Start(); } void DocumentTimerManager::StopIdling() { - mbStartIdleTimer = false; - maDocIdle.Stop(); + m_aDocIdle.Stop(); } void DocumentTimerManager::BlockIdling() { - maDocIdle.Stop(); - ++mIdleBlockCount; + assert(SAL_MAX_UINT32 != m_nIdleBlockCount); + ++m_nIdleBlockCount; } void DocumentTimerManager::UnblockIdling() { - --mIdleBlockCount; - if( !mIdleBlockCount && mbStartIdleTimer && !maDocIdle.IsActive() ) - { - mbStartIdleTimer = false; - maDocIdle.Start(); - } + assert(0 != m_nIdleBlockCount); + --m_nIdleBlockCount; + + // kick the active idle, if it's not anymore blocked by IsDocIdle() + if (m_aDocIdle.IsActive() && IsDocIdle()) + m_aDocIdle.Start(); } DocumentTimerManager::IdleJob DocumentTimerManager::GetNextIdleJob() const diff --git a/sw/source/core/inc/DocumentTimerManager.hxx b/sw/source/core/inc/DocumentTimerManager.hxx index 214c0f626a75..e04e0602cc4f 100644 --- a/sw/source/core/inc/DocumentTimerManager.hxx +++ b/sw/source/core/inc/DocumentTimerManager.hxx @@ -66,14 +66,13 @@ private: SwDoc& m_rDoc; - bool mbStartIdleTimer; //< idle timer mode start/stop - sal_Int32 mIdleBlockCount; - SwDocIdle maDocIdle; + sal_uInt32 m_nIdleBlockCount; ///< Don't run the Idle, if > 0 + SwDocIdle m_aDocIdle; }; inline bool DocumentTimerManager::IsDocIdle() const { - return( GetNextIdleJob() != IdleJob::Busy ); + return ((0 == m_nIdleBlockCount) && (GetNextIdleJob() != IdleJob::Busy)); } } |