@@ -108,6 +108,7 @@ QgsTaskManager *QgsTaskManager::instance()
108
108
109
109
QgsTaskManager::QgsTaskManager ( QObject* parent )
110
110
: QObject( parent )
111
+ , mTaskMutex( new QMutex( QMutex::Recursive ) )
111
112
, mNextTaskId( 0 )
112
113
{
113
114
connect ( QgsMapLayerRegistry::instance (), SIGNAL ( layersWillBeRemoved ( QStringList ) ),
@@ -120,15 +121,20 @@ QgsTaskManager::~QgsTaskManager()
120
121
cancelAll ();
121
122
122
123
// then clean them up, including waiting for them to terminate
124
+ mTaskMutex ->lock ();
123
125
QMap< long , TaskInfo >::const_iterator it = mTasks .constBegin ();
124
126
for ( ; it != mTasks .constEnd (); ++it )
125
127
{
126
128
cleanupAndDeleteTask ( it.value ().task );
127
129
}
130
+ mTaskMutex ->unlock ();
131
+
132
+ delete mTaskMutex ;
128
133
}
129
134
130
135
long QgsTaskManager::addTask ( QgsTask* task, const QgsTaskList& dependencies )
131
136
{
137
+ QMutexLocker ml ( mTaskMutex );
132
138
mTasks .insert ( mNextTaskId , task );
133
139
134
140
connect ( task, SIGNAL ( progressChanged ( double ) ), this , SLOT ( taskProgressChanged ( double ) ) );
@@ -152,6 +158,7 @@ long QgsTaskManager::addTask( QgsTask* task, const QgsTaskList& dependencies )
152
158
153
159
bool QgsTaskManager::deleteTask ( long id )
154
160
{
161
+ QMutexLocker ml ( mTaskMutex );
155
162
QgsTask* task = mTasks .value ( id ).task ;
156
163
return deleteTask ( task );
157
164
}
@@ -164,6 +171,7 @@ bool QgsTaskManager::deleteTask( QgsTask *task )
164
171
bool result = cleanupAndDeleteTask ( task );
165
172
166
173
// remove from internal task list
174
+ QMutexLocker ml ( mTaskMutex );
167
175
for ( QMap< long , TaskInfo >::iterator it = mTasks .begin (); it != mTasks .end (); )
168
176
{
169
177
if ( it.value ().task == task )
@@ -177,11 +185,13 @@ bool QgsTaskManager::deleteTask( QgsTask *task )
177
185
178
186
QgsTask*QgsTaskManager::task ( long id ) const
179
187
{
188
+ QMutexLocker ml ( mTaskMutex );
180
189
return mTasks .value ( id ).task ;
181
190
}
182
191
183
192
QList<QgsTask*> QgsTaskManager::tasks () const
184
193
{
194
+ QMutexLocker ml ( mTaskMutex );
185
195
QList< QgsTask* > list;
186
196
for ( QMap< long , TaskInfo >::const_iterator it = mTasks .constBegin (); it != mTasks .constEnd (); ++it )
187
197
{
@@ -195,19 +205,23 @@ long QgsTaskManager::taskId( QgsTask *task ) const
195
205
if ( !task )
196
206
return -1 ;
197
207
208
+ QMutexLocker ml ( mTaskMutex );
198
209
QMap< long , TaskInfo >::const_iterator it = mTasks .constBegin ();
199
210
for ( ; it != mTasks .constEnd (); ++it )
200
211
{
201
212
if ( it.value ().task == task )
213
+ {
202
214
return it.key ();
215
+ }
203
216
}
204
217
return -1 ;
205
218
}
206
219
207
220
void QgsTaskManager::cancelAll ()
208
221
{
209
- QMap< long , TaskInfo >::iterator it = mTasks .begin ();
210
- for ( ; it != mTasks .end (); ++it )
222
+ QMutexLocker ml ( mTaskMutex );
223
+ QMap< long , TaskInfo >::const_iterator it = mTasks .constBegin ();
224
+ for ( ; it != mTasks .constEnd (); ++it )
211
225
{
212
226
QgsTask* task = it.value ().task ;
213
227
if ( task->isActive () )
@@ -219,6 +233,8 @@ void QgsTaskManager::cancelAll()
219
233
220
234
bool QgsTaskManager::dependenciesSatisified ( long taskId ) const
221
235
{
236
+ QMutexLocker ml ( mTaskMutex );
237
+
222
238
if ( !mTaskDependencies .contains ( taskId ) )
223
239
return true ;
224
240
@@ -242,6 +258,8 @@ QSet<long> QgsTaskManager::dependencies( long taskId ) const
242
258
243
259
bool QgsTaskManager::resolveDependencies ( long firstTaskId, long currentTaskId, QSet<long >& results ) const
244
260
{
261
+ QMutexLocker ml ( mTaskMutex );
262
+
245
263
if ( !mTaskDependencies .contains ( currentTaskId ) )
246
264
return true ;
247
265
@@ -282,11 +300,13 @@ bool QgsTaskManager::hasCircularDependencies( long taskId ) const
282
300
283
301
void QgsTaskManager::setDependentLayers ( long taskId, const QStringList& layerIds )
284
302
{
303
+ QMutexLocker ml ( mTaskMutex );
285
304
mLayerDependencies .insert ( taskId, layerIds );
286
305
}
287
306
288
307
QStringList QgsTaskManager::dependentLayers ( long taskId ) const
289
308
{
309
+ QMutexLocker ml ( mTaskMutex );
290
310
return mLayerDependencies .value ( taskId, QStringList () );
291
311
}
292
312
@@ -323,6 +343,7 @@ void QgsTaskManager::taskStatusChanged( int status )
323
343
324
344
void QgsTaskManager::layersWillBeRemoved ( const QStringList& layerIds )
325
345
{
346
+ QMutexLocker ml ( mTaskMutex );
326
347
// scan through layers to be removed
327
348
Q_FOREACH ( const QString& layerId, layerIds )
328
349
{
@@ -371,6 +392,7 @@ bool QgsTaskManager::cleanupAndDeleteTask( QgsTask *task )
371
392
372
393
void QgsTaskManager::processQueue ()
373
394
{
395
+ QMutexLocker ml ( mTaskMutex );
374
396
for ( QMap< long , TaskInfo >::iterator it = mTasks .begin (); it != mTasks .end (); ++it )
375
397
{
376
398
QgsTask* task = it.value ().task ;
@@ -383,6 +405,8 @@ void QgsTaskManager::processQueue()
383
405
384
406
void QgsTaskManager::cancelDependentTasks ( long taskId )
385
407
{
408
+ QMutexLocker ml ( mTaskMutex );
409
+
386
410
QgsTask* cancelledTask = task ( taskId );
387
411
for ( QMap< long , QgsTaskList >::iterator it = mTaskDependencies .begin (); it != mTaskDependencies .end (); ++it )
388
412
{
0 commit comments