include/vcl/idle.hxx | 2 + include/vcl/scheduler.hxx | 9 ++++---- include/vcl/timer.hxx | 9 ++++++-- vcl/source/app/idle.cxx | 10 +++++++-- vcl/source/app/scheduler.cxx | 20 +++++++++--------- vcl/source/app/timer.cxx | 46 +++++++++++++++++++++++++++++++------------ 6 files changed, 66 insertions(+), 30 deletions(-)
New commits: commit 7cf3ae68afb9d3f2f126e544de85f38a18ad3de0 Author: Jan-Marek Glogowski <[email protected]> Date: Thu Jan 19 12:18:52 2017 +0100 Apply stricter member access control for Tasks This disallows changing mbAuto and changing values of ImplSchedulerData outside of Scheduler / Task functions. Change-Id: Ia624999bd63190c072eb66427aec38e7ac8cfa1b Reviewed-on: https://gerrit.libreoffice.org/33317 Tested-by: Jenkins <[email protected]> Reviewed-by: Jan-Marek Glogowski <[email protected]> diff --git a/include/vcl/idle.hxx b/include/vcl/idle.hxx index 85ea758..8d79c2f 100644 --- a/include/vcl/idle.hxx +++ b/include/vcl/idle.hxx @@ -39,6 +39,8 @@ protected: virtual bool IsIdle() const override; virtual sal_uInt64 UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTimeNow ) const override; + Idle( bool bAuto, const sal_Char *pDebugName = nullptr ); + public: Idle( const sal_Char *pDebugName = nullptr ); diff --git a/include/vcl/scheduler.hxx b/include/vcl/scheduler.hxx index dbe3128..19fbb4f 100644 --- a/include/vcl/scheduler.hxx +++ b/include/vcl/scheduler.hxx @@ -76,14 +76,16 @@ class VCL_DLLPUBLIC Task friend class Scheduler; friend struct ImplSchedulerData; -protected: ImplSchedulerData *mpSchedulerData; /// Pointer to the element in scheduler list const sal_Char *mpDebugName; /// Useful for debugging TaskPriority mePriority; /// Task priority bool mbActive; /// Currently in the scheduler +protected: static void StartTimer( sal_uInt64 nMS ); + inline const ImplSchedulerData* GetSchedulerData() const { return mpSchedulerData; } + virtual void SetDeletionFlags(); /// Is this item ready to be dispatched at nTimeNow virtual bool ReadyForSchedule( bool bIdle, sal_uInt64 nTimeNow ) const = 0; @@ -99,12 +101,13 @@ public: Task( const sal_Char *pDebugName ); Task( const Task& rTask ); virtual ~Task(); + Task& operator=( const Task& rTask ); void SetPriority(TaskPriority ePriority) { mePriority = ePriority; } TaskPriority GetPriority() const { return mePriority; } void SetDebugName( const sal_Char *pDebugName ) { mpDebugName = pDebugName; } - const char *GetDebugName() { return mpDebugName; } + const char *GetDebugName() const { return mpDebugName; } // Call handler virtual void Invoke() = 0; @@ -113,8 +116,6 @@ public: void Stop(); bool IsActive() const { return mbActive; } - - Task& operator=( const Task& rTask ); }; #endif // INCLUDED_VCL_SCHEDULER_HXX diff --git a/include/vcl/timer.hxx b/include/vcl/timer.hxx index 07fb9a8..e7d539f 100644 --- a/include/vcl/timer.hxx +++ b/include/vcl/timer.hxx @@ -25,18 +25,23 @@ class VCL_DLLPUBLIC Timer : public Task { -protected: Link<Timer *, void> maInvokeHandler; ///< Callback Link sal_uInt64 mnTimeout; - bool mbAuto; + const bool mbAuto; +protected: virtual void SetDeletionFlags() override; virtual bool ReadyForSchedule( bool bIdle, sal_uInt64 nTimeNow ) const override; virtual bool IsIdle() const override; virtual sal_uInt64 UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTimeNow ) const override; + Timer( bool bAuto, const sal_Char *pDebugName = nullptr ); + public: Timer( const sal_Char *pDebugName = nullptr ); + Timer( const Timer& rTimer ); + virtual ~Timer() override; + Timer& operator=( const Timer& rTimer ); /** * Calls the maInvokeHandler with the parameter this. diff --git a/vcl/source/app/idle.cxx b/vcl/source/app/idle.cxx index 895000a..a086b5f 100644 --- a/vcl/source/app/idle.cxx +++ b/vcl/source/app/idle.cxx @@ -20,8 +20,14 @@ #include <vcl/idle.hxx> #include "saltimer.hxx" +Idle::Idle( bool bAuto, const sal_Char *pDebugName ) + : Timer( bAuto, pDebugName ) +{ + SetPriority( TaskPriority::DEFAULT_IDLE ); +} + Idle::Idle( const sal_Char *pDebugName ) - : Timer( pDebugName ) + : Idle( false, pDebugName ) { } @@ -32,7 +38,7 @@ void Idle::Start() sal_uInt64 nPeriod = Scheduler::ImmediateTimeoutMs; if (Scheduler::GetDeterministicMode()) { - switch (mePriority) + switch ( GetPriority() ) { case TaskPriority::LOW: case TaskPriority::LOWER: diff --git a/vcl/source/app/scheduler.cxx b/vcl/source/app/scheduler.cxx index 3a62f3d..d13ad3e 100644 --- a/vcl/source/app/scheduler.cxx +++ b/vcl/source/app/scheduler.cxx @@ -334,19 +334,19 @@ Task& Task::operator=( const Task& rTask ) return *this; } -Task::Task(const sal_Char *pDebugName): - mpSchedulerData(nullptr), - mpDebugName(pDebugName), - mePriority(TaskPriority::HIGH), - mbActive(false) +Task::Task( const sal_Char *pDebugName ) + : mpSchedulerData( nullptr ) + , mpDebugName( pDebugName ) + , mePriority( TaskPriority::HIGH ) + , mbActive( false ) { } -Task::Task( const Task& rTask ): - mpSchedulerData(nullptr), - mpDebugName(rTask.mpDebugName), - mePriority(rTask.mePriority), - mbActive(false) +Task::Task( const Task& rTask ) + : mpSchedulerData( nullptr ) + , mpDebugName( rTask.mpDebugName ) + , mePriority( rTask.mePriority ) + , mbActive( false ) { if ( rTask.IsActive() ) Start(); diff --git a/vcl/source/app/timer.cxx b/vcl/source/app/timer.cxx index 77704db..56f0922 100644 --- a/vcl/source/app/timer.cxx +++ b/vcl/source/app/timer.cxx @@ -25,15 +25,12 @@ void Timer::SetDeletionFlags() { // If no AutoTimer, then stop. if ( !mbAuto ) - { - mpSchedulerData->mbDelete = true; - mbActive = false; - } + Task::SetDeletionFlags(); } bool Timer::ReadyForSchedule( bool /* bIdle */, sal_uInt64 nTimeNow ) const { - return (mpSchedulerData->mnUpdateTime + mnTimeout) <= nTimeNow; + return (GetSchedulerData()->mnUpdateTime + mnTimeout) <= nTimeNow; } bool Timer::IsIdle() const @@ -43,7 +40,7 @@ bool Timer::IsIdle() const sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTimeNow ) const { - sal_uInt64 nWakeupTime = mpSchedulerData->mnUpdateTime + mnTimeout; + sal_uInt64 nWakeupTime = GetSchedulerData()->mnUpdateTime + mnTimeout; if( nWakeupTime <= nTimeNow ) return Scheduler::ImmediateTimeoutMs; else @@ -53,12 +50,38 @@ sal_uInt64 Timer::UpdateMinPeriod( sal_uInt64 nMinPeriod, sal_uInt64 nTimeNow ) } } -Timer::Timer(const sal_Char *pDebugName) +Timer::Timer( bool bAuto, const sal_Char *pDebugName ) : Task( pDebugName ) , mnTimeout( Scheduler::ImmediateTimeoutMs ) - , mbAuto( false ) + , mbAuto( bAuto ) +{ + SetPriority( TaskPriority::HIGHEST ); +} + +Timer::Timer( const sal_Char *pDebugName ) + : Timer( false, pDebugName ) +{ +} + +Timer::Timer( const Timer& rTimer ) + : Timer( rTimer.mbAuto, rTimer.GetDebugName() ) +{ + maInvokeHandler = rTimer.maInvokeHandler; + mnTimeout = rTimer.mnTimeout; +} + +Timer::~Timer() +{ +} + +Timer& Timer::operator=( const Timer& rTimer ) { - mePriority = TaskPriority::HIGHEST; + Task::operator=( rTimer ); + maInvokeHandler = rTimer.maInvokeHandler; + mnTimeout = rTimer.mnTimeout; + SAL_WARN_IF( mbAuto != rTimer.mbAuto, "vcl.schedule", + "Copying Timer with different mbAuto value!" ); + return *this; } void Timer::Invoke() @@ -81,14 +104,13 @@ void Timer::SetTimeout( sal_uInt64 nNewTimeout ) { mnTimeout = nNewTimeout; // If timer is active, then renew clock. - if ( mbActive ) + if ( IsActive() ) StartTimer( mnTimeout ); } AutoTimer::AutoTimer( const sal_Char *pDebugName ) - : Timer( pDebugName ) + : Timer( true, pDebugName ) { - mbAuto = true; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
