include/vcl/idle.hxx | 1 include/vcl/scheduler.hxx | 39 ++----- include/vcl/timer.hxx | 2 sfx2/source/appl/appinit.cxx | 2 vcl/inc/svdata.hxx | 2 vcl/source/app/idle.cxx | 1 vcl/source/app/scheduler.cxx | 217 ++++++++++++++++++++----------------------- vcl/source/app/svdata.cxx | 3 vcl/source/app/svmain.cxx | 3 vcl/source/app/timer.cxx | 11 +- 10 files changed, 127 insertions(+), 154 deletions(-)
New commits: commit 09c5a9d41e03b3137ce47b9f9419290525458337 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Jun 15 14:22:08 2015 +0200 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) diff --git a/include/vcl/idle.hxx b/include/vcl/idle.hxx index 3d235a5..2e853b7 100644 --- a/include/vcl/idle.hxx +++ b/include/vcl/idle.hxx @@ -28,7 +28,6 @@ class VCL_DLLPUBLIC Idle : public Scheduler protected: Link<Idle *, void> maIdleHdl; // Callback Link - public: Idle( const sal_Char *pDebugName = NULL ); Idle( const Idle& rIdle ); diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx index 6b27e05..6c4e211 100644 --- a/include/vcl/scheduler.hxx +++ b/include/vcl/scheduler.hxx @@ -21,17 +21,22 @@ #define INCLUDED_VCL_SCHEDULER_HXX #include <vcl/dllapi.h> -#include <list> - +struct ImplSVData; class Scheduler; struct ImplSchedulerData { - bool mbDelete; // Destroy this scheduler? - Scheduler* mpScheduler; // Pointer to VCL Scheduler instance -}; + ImplSchedulerData* mpNext; // Pointer to the next element in list + Scheduler* mpScheduler; // Pointer to VCL Scheduler instance + bool mbDelete; // Destroy this scheduler? + bool mbInScheduler; // Scheduler currently processed? + sal_uInt64 mnUpdateTime; // Last Update Time + sal_uInt32 mnUpdateStack; // Update Stack -#define MAX_TIMER_PERIOD SAL_MAX_UINT64 + void Invoke(); + + static ImplSchedulerData *GetMostImportantTask( bool bTimer ); +}; enum class SchedulerPriority { HIGHEST = 0, @@ -51,7 +56,6 @@ protected: const sal_Char *mpDebugName; /// Useful for debugging SchedulerPriority mePriority; /// Scheduler priority bool mbActive; /// Currently in the scheduler - sal_uInt64 mnUpdateTime; /// Last Update Time friend struct ImplSchedulerData; virtual void SetDeletionFlags(); @@ -78,28 +82,15 @@ public: bool IsActive() const { return mbActive; } void SetInActive() { mbActive = false; } - Scheduler& operator=( const Scheduler& rScheduler ); - static void ImplDeInitScheduler(bool bAll=true); - static void ImplInitScheduler(); + Scheduler& operator=( const Scheduler& rScheduler ); + static void ImplDeInitScheduler(); - // Process one pending Timer with highest priority + // Process one pending Timer with highhest priority static void CallbackTaskScheduling( bool ignore ); - /// Process one pending task ahead of time with highest priority. + /// Process one pending task ahead of time with highhest priority. static void ProcessTaskScheduling( bool bTimer ); - -private: - bool mbInScheduler; // Scheduler currently processed? - sal_uInt32 mnUpdateStack; // Update Stack - - bool ImplHandleTaskScheduling(sal_uInt64& nMinPeriod, sal_uInt64 nTime); - void ImplInvoke(sal_uInt64 nTime); - static Scheduler* ImplGetHighestPrioTask( bool bTimer ); - bool ImplIsScheduleReady(sal_uInt32 nUpdateStack); - void ImplDispose(); }; -typedef ::std::list< ImplSchedulerData* > ImplScheduler_t; - #endif // INCLUDED_VCL_SCHEDULER_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/timer.hxx b/include/vcl/timer.hxx index f6f3dea..8835291 100644 --- a/include/vcl/timer.hxx +++ b/include/vcl/timer.hxx @@ -23,8 +23,6 @@ #include <tools/link.hxx> #include <vcl/scheduler.hxx> -struct ImplSVData; - class VCL_DLLPUBLIC Timer : public Scheduler { protected: diff --git a/sfx2/source/appl/appinit.cxx b/sfx2/source/appl/appinit.cxx index 1d577c7..d6315d2 100644 --- a/sfx2/source/appl/appinit.cxx +++ b/sfx2/source/appl/appinit.cxx @@ -109,7 +109,7 @@ void SAL_CALL SfxTerminateListener_Impl::notifyTermination( const EventObject& a // Timers may access the SfxApplication and are only deleted in // Application::Quit(), which is asynchronous (PostUserEvent) - disable! - Scheduler::ImplDeInitScheduler(false); // false only delete the list + Scheduler::ImplDeInitScheduler(); SfxApplication* pApp = SfxGetpApp(); pApp->Broadcast( SfxSimpleHint( SFX_HINT_DEINITIALIZING ) ); diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx index 1261b28..595812a 100644 --- a/vcl/inc/svdata.hxx +++ b/vcl/inc/svdata.hxx @@ -313,7 +313,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 18ab52a..901c44e 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 49838c9..c3cea78 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 a7c184a..8b1a2a6 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 ); } diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index dda1e29..3f9026e 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -251,8 +251,6 @@ bool InitVCL() // remember Main-Thread-Id pSVData->mnMainThreadId = ::osl::Thread::getCurrentIdentifier(); - Scheduler::ImplInitScheduler(); - // Initialize Sal pSVData->mpDefInst = CreateSalInstance(); if ( !pSVData->mpDefInst ) @@ -373,7 +371,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 b6c2aba..7d92283 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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits