summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-06-15 14:22:08 +0200
committerAshod Nakashian <ashod.nakashian@collabora.co.uk>2016-02-06 09:12:21 -0500
commit102d96e0be079de195c70adffa65f6f9ddf79748 (patch)
tree36fa7902dec5fb6f908b00aaf5f426648786375a /vcl
parent8ebcaeb22f6fe05750b50631dc67299b2f78e4e3 (diff)
Revert "std::list for Scheduler"
This reverts commit 1289d3c42af66990a2c8e5a7a38e51b6cd51c7eb, plus follow-ups 762e90ffa0cd5f85dadd9bad93391d105e60e418 "vcl: loplugin:pointertobool" and 863e5685dda88efd0bee3177a08eedffd4730e33 "Fix funny line-ends," as it causes memory corruption, see valgrind "make CppunitTest_sw_ooxmlexport4" output: > Invalid write of size 1 > Scheduler::ImplInvoke(unsigned long) (/vcl/source/app/scheduler.cxx:40) > Scheduler::ProcessTaskScheduling(bool) (/vcl/source/app/scheduler.cxx:128) > Scheduler::CallbackTaskScheduling(bool) (/vcl/source/app/scheduler.cxx:112) > SalTimer::CallCallback(bool) (/vcl/inc/saltimer.hxx:53) > SvpSalInstance::CheckTimeout(bool) (/vcl/headless/svpinst.cxx:191) > SvpSalInstance::Yield(bool, bool) (/vcl/headless/svpinst.cxx:307) > ImplYield(bool, bool) (/vcl/source/app/svapp.cxx:353) > Application::Reschedule(bool) (/vcl/source/app/svapp.cxx:377) > framework::StatusIndicatorFactory::impl_reschedule(bool) (/framework/source/helper/statusindicatorfactory.cxx:528) > framework::StatusIndicatorFactory::end(com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator> const&) (/framework/source/helper/statusindicatorfactory.cxx:229) > framework::StatusIndicator::end() (/framework/source/helper/statusindicator.cxx:70) > non-virtual thunk to framework::StatusIndicator::end() (/framework/source/helper/statusindicator.cxx:57) > writerfilter::ooxml::OOXMLDocumentImpl::resolve(writerfilter::Stream&) (/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:531) > WriterFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/writerfilter/source/filter/WriterFilter.cxx:191) > non-virtual thunk to WriterFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/writerfilter/source/filter/WriterFilter.cxx:126) > SfxObjectShell::ImportFrom(SfxMedium&, com::sun::star::uno::Reference<com::sun::star::text::XTextRange> const&) (/sfx2/source/doc/objstor.cxx:2271) > SfxObjectShell::DoLoad(SfxMedium*) (/sfx2/source/doc/objstor.cxx:767) > SfxBaseModel::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/sfx2/source/doc/sfxbasemodel.cxx:1859) > non-virtual thunk to SfxBaseModel::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/sfx2/source/doc/sfxbasemodel.cxx:1810) > (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) (/sfx2/source/view/frmload.cxx:703) > non-virtual thunk to (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) (/sfx2/source/view/frmload.cxx:615) > framework::LoadEnv::impl_loadContent() (/framework/source/loadenv/loadenv.cxx:1122) > framework::LoadEnv::startLoading() (/framework/source/loadenv/loadenv.cxx:383) > framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/loadenv/loadenv.cxx:164) > framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/services/desktop.cxx:566) > non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/services/desktop.cxx:552) > unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/unotest/source/cpp/macros_test.cxx:50) > SwModelTestBase::load(char const*, char const*) (/sw/qa/extras/inc/swmodeltestbase.hxx:580) > SwModelTestBase::executeImportExportImportTest(char const*) (/sw/qa/extras/inc/swmodeltestbase.hxx:219) > testTrackChangesDeletedParagraphMark::Import_Export_Import() (/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx:132) > CppUnit::TestCaller<testTrackChangesDeletedParagraphMark>::runTest() (/workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:166) > CppUnit::TestCaseMethodFunctor::operator()() const (/workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32) > (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/test/source/vclbootstrapprotector.cxx:57) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /home/sbergman/lo/core/workdir/LinkTarget/Library/unobootstrapprotector.so) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:77) > CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:181) > CppUnit::TestCase::run(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91) > CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64) > CppUnit::TestComposite::run(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23) > CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64) > CppUnit::TestComposite::run(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23) > CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47) > CppUnit::TestResult::runTest(CppUnit::Test*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:148) > CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96) > Address 0x2c9ece48 is 40 bytes inside a block of size 104 free'd > operator delete(void*) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) > (anonymous namespace)::ImpTimedRefDev::~ImpTimedRefDev() (/drawinglayer/source/primitive2d/textlayoutdevice.cxx:84) > std::default_delete<(anonymous namespace)::ImpTimedRefDev>::operator()((anonymous namespace)::ImpTimedRefDev*) const (/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/bits/unique_ptr.h:76) > std::unique_ptr<(anonymous namespace)::ImpTimedRefDev, std::default_delete<(anonymous namespace)::ImpTimedRefDev> >::reset((anonymous namespace)::ImpTimedRefDev*) (/usr/lib/gcc/x86_64-redhat-linux/4.9.2/../../../../include/c++/4.9.2/bits/unique_ptr.h:344) > comphelper::unique_disposing_ptr<(anonymous namespace)::ImpTimedRefDev>::reset((anonymous namespace)::ImpTimedRefDev*) (/include/comphelper/unique_disposing_ptr.hxx:41) > (anonymous namespace)::ImpTimedRefDev::Invoke() (/drawinglayer/source/primitive2d/textlayoutdevice.cxx:93) > Scheduler::ImplInvoke(unsigned long) (/vcl/source/app/scheduler.cxx:39) > Scheduler::ProcessTaskScheduling(bool) (/vcl/source/app/scheduler.cxx:128) > Scheduler::CallbackTaskScheduling(bool) (/vcl/source/app/scheduler.cxx:112) > SalTimer::CallCallback(bool) (/vcl/inc/saltimer.hxx:53) > SvpSalInstance::CheckTimeout(bool) (/vcl/headless/svpinst.cxx:191) > SvpSalInstance::Yield(bool, bool) (/vcl/headless/svpinst.cxx:307) > ImplYield(bool, bool) (/vcl/source/app/svapp.cxx:353) > Application::Reschedule(bool) (/vcl/source/app/svapp.cxx:377) > framework::StatusIndicatorFactory::impl_reschedule(bool) (/framework/source/helper/statusindicatorfactory.cxx:528) > framework::StatusIndicatorFactory::end(com::sun::star::uno::Reference<com::sun::star::task::XStatusIndicator> const&) (/framework/source/helper/statusindicatorfactory.cxx:229) > framework::StatusIndicator::end() (/framework/source/helper/statusindicator.cxx:70) > non-virtual thunk to framework::StatusIndicator::end() (/framework/source/helper/statusindicator.cxx:57) > writerfilter::ooxml::OOXMLDocumentImpl::resolve(writerfilter::Stream&) (/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:531) > WriterFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/writerfilter/source/filter/WriterFilter.cxx:191) > non-virtual thunk to WriterFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/writerfilter/source/filter/WriterFilter.cxx:126) > SfxObjectShell::ImportFrom(SfxMedium&, com::sun::star::uno::Reference<com::sun::star::text::XTextRange> const&) (/sfx2/source/doc/objstor.cxx:2271) > SfxObjectShell::DoLoad(SfxMedium*) (/sfx2/source/doc/objstor.cxx:767) > SfxBaseModel::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/sfx2/source/doc/sfxbasemodel.cxx:1859) > non-virtual thunk to SfxBaseModel::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/sfx2/source/doc/sfxbasemodel.cxx:1810) > (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) (/sfx2/source/view/frmload.cxx:703) > non-virtual thunk to (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) (/sfx2/source/view/frmload.cxx:615) > framework::LoadEnv::impl_loadContent() (/framework/source/loadenv/loadenv.cxx:1122) > framework::LoadEnv::startLoading() (/framework/source/loadenv/loadenv.cxx:383) > framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/loadenv/loadenv.cxx:164) > framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/services/desktop.cxx:566) > non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/framework/source/services/desktop.cxx:552) > unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) (/unotest/source/cpp/macros_test.cxx:50) > SwModelTestBase::load(char const*, char const*) (/sw/qa/extras/inc/swmodeltestbase.hxx:580) > SwModelTestBase::executeImportExportImportTest(char const*) (/sw/qa/extras/inc/swmodeltestbase.hxx:219) > testTrackChangesDeletedParagraphMark::Import_Export_Import() (/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx:132) > CppUnit::TestCaller<testTrackChangesDeletedParagraphMark>::runTest() (/workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:166) > CppUnit::TestCaseMethodFunctor::operator()() const (/workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32) > (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/test/source/vclbootstrapprotector.cxx:57) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (in /home/sbergman/lo/core/workdir/LinkTarget/Library/unobootstrapprotector.so) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15) > CppUnit::ProtectorChain::ProtectFunctor::operator()() const (in /home/sbergman/lo/core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.13.so.0.0.2) > CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:77) > CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:181) > CppUnit::TestCase::run(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91) > CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) (/workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64) (cherry picked from commit 09c5a9d41e03b3137ce47b9f9419290525458337)
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/svdata.hxx2
-rw-r--r--vcl/source/app/idle.cxx1
-rw-r--r--vcl/source/app/scheduler.cxx217
-rw-r--r--vcl/source/app/svdata.cxx3
-rw-r--r--vcl/source/app/svmain.cxx3
-rw-r--r--vcl/source/app/timer.cxx11
6 files changed, 111 insertions, 126 deletions
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index ee271d9821d1..5c7e3cb985dc 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -317,7 +317,7 @@ struct ImplSVData
bool mbDeInit; // Is VCL deinitializing
sal_uLong mnThreadCount; // is VCL MultiThread enabled
ImplConfigData* mpFirstConfigData; // pointer to the first config block
- ImplScheduler_t* maSchedulers; // list of all running tasks
+ ImplSchedulerData* mpFirstSchedulerData; // list of all running tasks
SalTimer* mpSalTimer; // interface to sal event loop/timers
SalI18NImeStatus* mpImeStatus; // interface to ime status window
SalSystem* mpSalSystem; // SalSystem interface
diff --git a/vcl/source/app/idle.cxx b/vcl/source/app/idle.cxx
index 18ab52a06588..901c44e74cab 100644
--- a/vcl/source/app/idle.cxx
+++ b/vcl/source/app/idle.cxx
@@ -75,4 +75,5 @@ sal_uInt64 Idle::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 /* nTime */
return nMinPeriod;
}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx
index 49838c92f993..c3cea781e6b8 100644
--- a/vcl/source/app/scheduler.cxx
+++ b/vcl/source/app/scheduler.cxx
@@ -21,88 +21,85 @@
#include <tools/time.hxx>
#include <vcl/scheduler.hxx>
#include <vcl/timer.hxx>
-#include <algorithm>
#include <saltimer.hxx>
-void Scheduler::ImplInvoke(sal_uInt64 nTime)
-{
- mnUpdateTime = nTime;
+#define MAX_TIMER_PERIOD SAL_MAX_UINT64
- if (mpSchedulerData->mbDelete || mbInScheduler )
+void ImplSchedulerData::Invoke()
+{
+ if (mbDelete || mbInScheduler )
return;
// prepare Scheduler Object for deletion after handling
- SetDeletionFlags();
+ mpScheduler->SetDeletionFlags();
// invoke it
mbInScheduler = true;
- Invoke();
+ mpScheduler->Invoke();
mbInScheduler = false;
}
-Scheduler* Scheduler::ImplGetHighestPrioTask( bool bTimer )
+ImplSchedulerData *ImplSchedulerData::GetMostImportantTask( bool bTimer )
{
- ImplSVData* pSVData = ImplGetSVData();
- Scheduler * pMostUrgent = NULL;
+ ImplSVData* pSVData = ImplGetSVData();
+ ImplSchedulerData *pMostUrgent = NULL;
- std::for_each(pSVData->maSchedulers->begin(), pSVData->maSchedulers->end(),
- [&pSVData, bTimer, &pMostUrgent] (ImplSchedulerData *rScheduler)
+ for ( ImplSchedulerData *pSchedulerData = pSVData->mpFirstSchedulerData; pSchedulerData; pSchedulerData = pSchedulerData->mpNext )
{
- if ( rScheduler->mpScheduler &&
- rScheduler->mpScheduler->ImplIsScheduleReady(pSVData->mnUpdateStack) &&
- rScheduler->mpScheduler->ReadyForSchedule( bTimer ) &&
- rScheduler->mpScheduler->IsActive() )
+ if ( !pSchedulerData->mpScheduler || pSchedulerData->mbDelete || pSchedulerData->mnUpdateStack >= pSVData->mnUpdateStack
+ || !pSchedulerData->mpScheduler->ReadyForSchedule( bTimer ) || !pSchedulerData->mpScheduler->IsActive())
+ continue;
+ if (!pMostUrgent)
+ pMostUrgent = pSchedulerData;
+ else
{
- if (!pMostUrgent)
- pMostUrgent = rScheduler->mpScheduler;
- else
- {
- // Find the highest priority.
- // If the priority of the current task is higher (numerical value is lower) than
- // the priority of the most urgent, the current task gets the new most urgent.
- if ( rScheduler->mpScheduler->GetPriority() < pMostUrgent->GetPriority() )
- pMostUrgent = rScheduler->mpScheduler;
- }
+ // Find the highest priority.
+ // If the priority of the current task is higher (numerical value is lower) than
+ // the priority of the most urgent, the current task gets the new most urgent.
+ if ( pSchedulerData->mpScheduler->GetPriority() < pMostUrgent->mpScheduler->GetPriority() )
+ pMostUrgent = pSchedulerData;
}
- });
+ }
return pMostUrgent;
}
void Scheduler::SetDeletionFlags()
{
- Stop();
+ mpSchedulerData->mbDelete = true;
+ mbActive = false;
}
-void Scheduler::ImplDeInitScheduler(bool bAll /*=true*/)
+void Scheduler::ImplDeInitScheduler()
{
- ImplSVData* pSVData = ImplGetSVData();
-
+ ImplSVData* pSVData = ImplGetSVData();
+ ImplSchedulerData* pSchedulerData = pSVData->mpFirstSchedulerData;
if (pSVData->mpSalTimer)
{
pSVData->mpSalTimer->Stop();
}
- pSVData->maSchedulers->remove_if( [] (ImplSchedulerData *rSchedulerData)
+ if ( pSchedulerData )
{
- if(rSchedulerData->mpScheduler != NULL)
+ do
{
- rSchedulerData->mpScheduler->ImplDispose();
+ ImplSchedulerData* pTempSchedulerData = pSchedulerData;
+ if ( pSchedulerData->mpScheduler )
+ {
+ pSchedulerData->mpScheduler->mbActive = false;
+ pSchedulerData->mpScheduler->mpSchedulerData = NULL;
+ }
+ pSchedulerData = pSchedulerData->mpNext;
+ delete pTempSchedulerData;
}
- else
- delete rSchedulerData;
-
- return true;
- });
+ while ( pSchedulerData );
- if(bAll)
- {
- delete pSVData->maSchedulers;
- pSVData->maSchedulers = NULL;
+ pSVData->mpFirstSchedulerData = NULL;
+ pSVData->mnTimerPeriod = 0;
}
delete pSVData->mpSalTimer;
- pSVData->mpSalTimer = NULL;
+ pSVData->mpSalTimer = 0;
}
void Scheduler::CallbackTaskScheduling(bool ignore)
@@ -116,30 +113,52 @@ void Scheduler::ProcessTaskScheduling( bool bTimer )
{
// process all pending Tasks
// if bTimer True, only handle timer
- Scheduler* pScheduler = NULL;
- ImplSVData* pSVData = ImplGetSVData();
- sal_uInt64 nTime = tools::Time::GetSystemTicks();
- sal_uInt64 nMinPeriod = MAX_TIMER_PERIOD;
-
+ ImplSchedulerData* pSchedulerData = NULL;
+ ImplSchedulerData* pPrevSchedulerData = NULL;
+ ImplSVData* pSVData = ImplGetSVData();
+ sal_uInt64 nTime = tools::Time::GetSystemTicks();
+ sal_uInt64 nMinPeriod = MAX_TIMER_PERIOD;
pSVData->mnUpdateStack++;
// tdf#91727 - NB. bTimer is ultimately not used
- if ((pScheduler = Scheduler::ImplGetHighestPrioTask(bTimer)) != NULL)
- pScheduler->ImplInvoke(nTime);
+ if ((pSchedulerData = ImplSchedulerData::GetMostImportantTask(bTimer)))
+ {
+ pSchedulerData->mnUpdateTime = nTime;
+ pSchedulerData->Invoke();
+ }
- pSVData->maSchedulers->remove_if( [&nMinPeriod, nTime, pSVData] (ImplSchedulerData *rSchedulerData)
+ pSchedulerData = pSVData->mpFirstSchedulerData;
+ while ( pSchedulerData )
{
- if (rSchedulerData->mpScheduler != 0)
- return rSchedulerData->mpScheduler->ImplHandleTaskScheduling(nMinPeriod, nTime);
+ if( pSchedulerData->mbInScheduler )
+ {
+ pPrevSchedulerData = pSchedulerData;
+ pSchedulerData = pSchedulerData->mpNext;
+ }
+ // Should Task be released from scheduling?
+ else if ( pSchedulerData->mbDelete )
+ {
+ if ( pPrevSchedulerData )
+ pPrevSchedulerData->mpNext = pSchedulerData->mpNext;
+ else
+ pSVData->mpFirstSchedulerData = pSchedulerData->mpNext;
+ if ( pSchedulerData->mpScheduler )
+ pSchedulerData->mpScheduler->mpSchedulerData = NULL;
+ ImplSchedulerData* pTempSchedulerData = pSchedulerData;
+ pSchedulerData = pSchedulerData->mpNext;
+ delete pTempSchedulerData;
+ }
else
{
- delete rSchedulerData;
- return true;
+ pSchedulerData->mnUpdateStack = 0;
+ nMinPeriod = pSchedulerData->mpScheduler->UpdateMinPeriod( nMinPeriod, nTime );
+ pPrevSchedulerData = pSchedulerData;
+ pSchedulerData = pSchedulerData->mpNext;
}
- });
+ }
// delete clock if no more timers available
- if ( pSVData->maSchedulers->empty() )
+ if ( !pSVData->mpFirstSchedulerData )
{
if ( pSVData->mpSalTimer )
pSVData->mpSalTimer->Stop();
@@ -149,7 +168,6 @@ void Scheduler::ProcessTaskScheduling( bool bTimer )
{
Timer::ImplStartTimer( pSVData, nMinPeriod );
}
-
pSVData->mnUpdateStack--;
}
@@ -160,22 +178,34 @@ void Scheduler::SetPriority( SchedulerPriority ePriority )
void Scheduler::Start()
{
- ImplSVData* pSVData = ImplGetSVData();
// Mark timer active
mbActive = true;
+ ImplSVData* pSVData = ImplGetSVData();
if ( !mpSchedulerData )
{
- mpSchedulerData = new ImplSchedulerData;
- mpSchedulerData->mpScheduler = this;
// insert Scheduler
- mbInScheduler = false;
- pSVData->maSchedulers->push_back(mpSchedulerData);
+ mpSchedulerData = new ImplSchedulerData;
+ mpSchedulerData->mpScheduler = this;
+ mpSchedulerData->mbInScheduler = false;
+
+ // insert last due to SFX!
+ ImplSchedulerData* pPrev = NULL;
+ ImplSchedulerData* pData = pSVData->mpFirstSchedulerData;
+ while ( pData )
+ {
+ pPrev = pData;
+ pData = pData->mpNext;
+ }
+ mpSchedulerData->mpNext = NULL;
+ if ( pPrev )
+ pPrev->mpNext = mpSchedulerData;
+ else
+ pSVData->mpFirstSchedulerData = mpSchedulerData;
}
-
- mpSchedulerData->mbDelete = false;
- mnUpdateTime = tools::Time::GetSystemTicks();
- mnUpdateStack = pSVData->mnUpdateStack;
+ mpSchedulerData->mbDelete = false;
+ mpSchedulerData->mnUpdateTime = tools::Time::GetSystemTicks();
+ mpSchedulerData->mnUpdateStack = pSVData->mnUpdateStack;
}
void Scheduler::Stop()
@@ -191,7 +221,7 @@ Scheduler& Scheduler::operator=( const Scheduler& rScheduler )
if ( IsActive() )
Stop();
- mbActive = false;
+ mbActive = false;
mePriority = rScheduler.mePriority;
if ( rScheduler.IsActive() )
@@ -204,17 +234,15 @@ Scheduler::Scheduler(const sal_Char *pDebugName):
mpSchedulerData(NULL),
mpDebugName(pDebugName),
mePriority(SchedulerPriority::HIGH),
- mbActive(false),
- mnUpdateTime(0)
+ mbActive(false)
{
}
Scheduler::Scheduler( const Scheduler& rScheduler ):
mpSchedulerData(NULL),
mpDebugName(rScheduler.mpDebugName),
- mePriority(SchedulerPriority::HIGH),
- mbActive(false),
- mnUpdateTime(0)
+ mePriority(rScheduler.mePriority),
+ mbActive(false)
{
if ( rScheduler.IsActive() )
Start();
@@ -229,44 +257,3 @@ Scheduler::~Scheduler()
}
}
-bool Scheduler::ImplIsScheduleReady(sal_uInt32 nUpdateStack)
-{
- return !mpSchedulerData->mbDelete && (mnUpdateStack <= nUpdateStack);
-}
-
-void Scheduler::ImplDispose()
-{
- mpSchedulerData->mpScheduler = NULL;
- delete mpSchedulerData;
- mpSchedulerData = NULL;
-}
-
-void Scheduler::ImplInitScheduler()
-{
- ImplSVData* pSVData = ImplGetSVData();
-
- if(pSVData->maSchedulers == NULL)
- pSVData->maSchedulers = new ImplScheduler_t;
-}
-
-
-bool Scheduler::ImplHandleTaskScheduling(sal_uInt64 &nMinPeriod, sal_uInt64 nTime)
-{
- // process all pending Tasks
- if( !mbInScheduler )
- {
- // Should Task be released from scheduling?
- if ( !mpSchedulerData->mbDelete )
- {
- mnUpdateStack = 0;
- nMinPeriod = UpdateMinPeriod( nMinPeriod, nTime );
- }
- else
- {
- ImplDispose();
- return true;
- }
- }
-
- return false;
-}
diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx
index 39c34dc31c96..7c1fa981b92d 100644
--- a/vcl/source/app/svdata.cxx
+++ b/vcl/source/app/svdata.cxx
@@ -81,8 +81,7 @@ SalSystem* ImplGetSalSystem()
ImplSVData::ImplSVData()
{
// init global instance data
- memset( this, 0, sizeof( ImplSVData ));
-
+ memset( this, 0, sizeof( ImplSVData ) );
maHelpData.mbAutoHelpId = true;
maNWFData.maMenuBarHighlightTextColor = Color( COL_TRANSPARENT );
maNWFData.mbEnableAccel = 1;
diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx
index e3ffade453e0..ec659988e70d 100644
--- a/vcl/source/app/svmain.cxx
+++ b/vcl/source/app/svmain.cxx
@@ -261,8 +261,6 @@ bool InitVCL()
// remember Main-Thread-Id
pSVData->mnMainThreadId = ::osl::Thread::getCurrentIdentifier();
- Scheduler::ImplInitScheduler();
-
// Initialize Sal
pSVData->mpDefInst = CreateSalInstance();
if ( !pSVData->mpDefInst )
@@ -383,7 +381,6 @@ void DeInitVCL()
if ( pSVData->maAppData.mpIdleMgr )
delete pSVData->maAppData.mpIdleMgr;
-
Scheduler::ImplDeInitScheduler();
if ( pSVData->maWinData.mpMsgBoxImgList )
diff --git a/vcl/source/app/timer.cxx b/vcl/source/app/timer.cxx
index b6c2abaacb6f..7d92283b6466 100644
--- a/vcl/source/app/timer.cxx
+++ b/vcl/source/app/timer.cxx
@@ -23,6 +23,7 @@
#include <svdata.hxx>
#include <salinst.hxx>
+#define MAX_TIMER_PERIOD SAL_MAX_UINT64
void Timer::ImplStartTimer( ImplSVData* pSVData, sal_uInt64 nMS )
{
@@ -44,23 +45,23 @@ void Timer::SetDeletionFlags()
// if no AutoTimer than stop
if ( !mbAuto )
{
- Scheduler::SetDeletionFlags();
+ mpSchedulerData->mbDelete = true;
+ mbActive = false;
}
}
bool Timer::ReadyForSchedule( bool bTimer )
{
(void)bTimer;
- return (mnUpdateTime + mnTimeout) <= tools::Time::GetSystemTicks();
+ return (mpSchedulerData->mnUpdateTime + mnTimeout) <= tools::Time::GetSystemTicks();
}
sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime )
{
sal_uInt64 nNewTime = tools::Time::GetSystemTicks();
sal_uInt64 nDeltaTime;
-
//determine smallest time slot
- if( mnUpdateTime == nTime )
+ if( mpSchedulerData->mnUpdateTime == nTime )
{
nDeltaTime = mnTimeout;
if( nDeltaTime < nMinPeriod )
@@ -68,7 +69,7 @@ sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTime )
}
else
{
- nDeltaTime = mnUpdateTime + mnTimeout;
+ nDeltaTime = mpSchedulerData->mnUpdateTime + mnTimeout;
if( nDeltaTime < nNewTime )
nMinPeriod = 1;
else