From 0043ffd2ceace73a8e6af69ef9f2b3f2dd856a8a Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 14 Sep 2004 15:18:01 +0000 Subject: [PATCH] Fix crash when expiring mail with the menu item (#88508) svn path=/trunk/kdepim/; revision=346459 --- jobscheduler.cpp | 20 ++++++++++++-------- jobscheduler.h | 3 ++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/jobscheduler.cpp b/jobscheduler.cpp index 18e4b55bc..9838aa59a 100644 --- a/jobscheduler.cpp +++ b/jobscheduler.cpp @@ -61,7 +61,7 @@ void JobScheduler::registerTask( ScheduledTask* task ) if ( typeId ) { KMFolder* folder = task->folder(); // Search for an identical task already scheduled - for( QValueList::ConstIterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) { + for( QValueList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) { if ( (*it)->taskTypeId() == typeId && (*it)->folder() == folder ) { #ifdef DEBUG_SCHEDULER kdDebug(5006) << "JobScheduler: already having task type " << typeId << " for folder " << folder->label() << endl; @@ -69,6 +69,7 @@ void JobScheduler::registerTask( ScheduledTask* task ) delete task; if ( !mCurrentTask && immediate ) { ScheduledTask* task = *it; + removeTask( it ); runTaskNow( task ); } return; @@ -91,6 +92,13 @@ void JobScheduler::registerTask( ScheduledTask* task ) } } +void JobScheduler::removeTask( TaskList::Iterator& it ) +{ + if ( (*it)->isImmediate() ) + --mPendingImmediateTasks; + mTaskList.remove( it ); +} + void JobScheduler::notifyOpeningFolder( KMFolder* folder ) { if ( mCurrentTask && mCurrentTask->folder() == folder ) { @@ -129,16 +137,14 @@ void JobScheduler::slotRunNextJob() Q_ASSERT( mCurrentTask == 0 ); ScheduledTask* task = 0; // Find a task suitable for being run - for( QValueList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) { + for( TaskList::Iterator it = mTaskList.begin(); it != mTaskList.end(); ++it ) { // Remove if folder died KMFolder* folder = (*it)->folder(); if ( folder == 0 ) { #ifdef DEBUG_SCHEDULER kdDebug(5006) << " folder for task " << (*it) << " was deleted" << endl; #endif - if ( (*it)->isImmediate() ) - --mPendingImmediateTasks; - mTaskList.remove( it ); + removeTask( it ); if ( !mTaskList.isEmpty() ) slotRunNextJob(); // to avoid the mess with invalid iterators :) else @@ -155,9 +161,7 @@ void JobScheduler::slotRunNextJob() #endif if ( !folder->isOpened() ) { task = *it; - mTaskList.remove( it ); - if ( task->isImmediate() ) - --mPendingImmediateTasks; + removeTask( it ); break; } } diff --git a/jobscheduler.h b/jobscheduler.h index 7433ab7a6..35c5bb35e 100644 --- a/jobscheduler.h +++ b/jobscheduler.h @@ -119,8 +119,9 @@ private: void restartTimer(); void interruptCurrentTask(); void runTaskNow( ScheduledTask* task ); -private: typedef QValueList TaskList; + void removeTask( TaskList::Iterator& it ); +private: TaskList mTaskList; // FIFO of tasks to be run QTimer mTimer;