[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.1' - vcl/qa vcl/source
Noel Grandin
noel.grandin at collabora.co.uk
Fri Dec 9 17:56:49 UTC 2016
vcl/qa/cppunit/timer.cxx | 35 +++++++++++++++++++++++++++++++++++
vcl/source/app/scheduler.cxx | 3 ++-
2 files changed, 37 insertions(+), 1 deletion(-)
New commits:
commit e2e1aa6b08a914c6268bfe9c8b0a4bf1c1d0f45b
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date: Fri Dec 9 12:12:29 2016 +0200
tdf#100337 Message boxes showup empty with white background
the bug here was that we had, on the stack, going into the scheduler
THREE times. Two of those were idles.
The original code would end up always picking the first idle from inside
ImplSchedulerData::GetMostImportantTask
and then
ImplSchedulerData::Invoke
would just return because we were still inside that Idle, and the second
Idle would never get executed
Since the second Idle was responsible for painting the dialog in the
bug, sometimes the dialog would never get painted.
Reviewed-on: https://gerrit.libreoffice.org/31785
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Tested-by: Jenkins <ci at libreoffice.org>
(cherry picked from commit 19a4eaab9a55a2ecb33b727bad6307c5a2badc23)
Reviewed-on: https://gerrit.libreoffice.org/31798
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
(cherry picked from commit 3be163c72925824eeadf5e75f6e0cf6229d8ceab)
Change-Id: Ia15b98a06e231c8e1c29450e05a76ad427e41e36
diff --git a/vcl/qa/cppunit/timer.cxx b/vcl/qa/cppunit/timer.cxx
index 0bc8666..b8d5285 100644
--- a/vcl/qa/cppunit/timer.cxx
+++ b/vcl/qa/cppunit/timer.cxx
@@ -68,6 +68,7 @@ public:
#endif
void testRecursiveTimer();
void testSlowTimerCallback();
+ void testTriggerIdleFromIdle();
CPPUNIT_TEST_SUITE(TimerTest);
CPPUNIT_TEST(testIdle);
@@ -82,6 +83,7 @@ public:
#endif
CPPUNIT_TEST(testRecursiveTimer);
CPPUNIT_TEST(testSlowTimerCallback);
+ CPPUNIT_TEST(testTriggerIdleFromIdle);
CPPUNIT_TEST_SUITE_END();
};
@@ -366,6 +368,39 @@ void TimerTest::testSlowTimerCallback()
Application::Yield();
}
+
+class TriggerIdleFromIdle : public Idle
+{
+ bool* mpTriggered;
+ TriggerIdleFromIdle* mpOther;
+public:
+ explicit TriggerIdleFromIdle( bool* pTriggered, TriggerIdleFromIdle* pOther ) :
+ Idle(), mpTriggered(pTriggered), mpOther(pOther)
+ {
+ }
+ virtual void Invoke() override
+ {
+ Start();
+ if (mpOther)
+ mpOther->Start();
+ Application::Yield();
+ if (mpTriggered)
+ *mpTriggered = true;
+ }
+};
+
+void TimerTest::testTriggerIdleFromIdle()
+{
+ bool bTriggered1 = false;
+ bool bTriggered2 = false;
+ TriggerIdleFromIdle aTest2( &bTriggered2, nullptr );
+ TriggerIdleFromIdle aTest1( &bTriggered1, &aTest2 );
+ aTest1.Start();
+ Application::Yield();
+ CPPUNIT_ASSERT_MESSAGE("idle triggered", bTriggered1);
+ CPPUNIT_ASSERT_MESSAGE("idle triggered", bTriggered2);
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(TimerTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx
index efb65ca..1310c23 100644
--- a/vcl/source/app/scheduler.cxx
+++ b/vcl/source/app/scheduler.cxx
@@ -26,6 +26,7 @@
void ImplSchedulerData::Invoke()
{
+ assert(!mbInScheduler);
if (mbDelete || mbInScheduler )
return;
@@ -49,7 +50,7 @@ ImplSchedulerData *ImplSchedulerData::GetMostImportantTask( bool bTimerOnly )
sal_uInt64 nTimeNow = tools::Time::GetSystemTicks();
for ( ImplSchedulerData *pSchedulerData = pSVData->mpFirstSchedulerData; pSchedulerData; pSchedulerData = pSchedulerData->mpNext )
{
- if ( !pSchedulerData->mpScheduler || pSchedulerData->mbDelete ||
+ if ( !pSchedulerData->mpScheduler || pSchedulerData->mbDelete || pSchedulerData->mbInScheduler ||
!pSchedulerData->mpScheduler->ReadyForSchedule( bTimerOnly, nTimeNow ) ||
!pSchedulerData->mpScheduler->IsActive())
continue;
More information about the Libreoffice-commits
mailing list