[Libreoffice-commits] core.git: include/vcl sfx2/source vcl/inc vcl/source

Stephan Bergmann sbergman at redhat.com
Mon Jun 15 08:36:15 PDT 2015


 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 <sbergman at 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


More information about the Libreoffice-commits mailing list