35 #include <QtCore/QList>
36 #include <QtCore/QObject>
37 #include <QtCore/QPointer>
41 using namespace ThreadWeaver;
45 , m_payload( payload )
46 , m_collection( collection )
50 if ( ! m_payload->objectName().isEmpty() )
52 setObjectName( tr(
"JobRunner executing " ) + m_payload->objectName() );
54 setObjectName( tr(
"JobRunner (unnamed payload)" ) );
60 return m_payload->canBeExecuted();
70 m_payload->aboutToBeQueued( weaver );
75 m_payload->aboutToBeDequeued( weaver );
82 m_payload->execute ( t );
85 debug ( 1,
"JobCollection: job in collection has been deleted." );
92 return m_payload->priority();
95 void JobCollectionJobRunner::run ()
99 class JobList :
public QList <JobCollectionJobRunner*> {};
101 class JobCollection::Private
106 : elements ( new JobList() )
139 if ( d->weaver != 0 )
151 d->elements->append ( runner );
159 if ( d->weaver != 0 )
161 debug( 4,
"JobCollection::stop: dequeueing %p.\n", (
void*)
this);
162 d->weaver->dequeue(
this );
173 if ( d->elements->size() > 0 )
175 d->elements->at( 0 )->aboutToBeQueued( weaver );
190 if ( !d->elements->isEmpty() )
192 d->elements->at( 0 )->aboutToBeDequeued( weaver );
197 ENSURE ( d->weaver == 0 );
200 void JobCollection::execute (
Thread *t )
208 if ( d->elements->isEmpty() )
217 QMutexLocker l ( & d->mutex );
218 d->jobCounter = d->elements->size();
221 for (
int index = 1; index < d->elements->size(); ++index)
223 d->weaver->enqueue (d->elements->at(index));
231 d->elements->at( 0 )->execute ( t );
241 QMutexLocker l( &d->mutex );
242 REQUIRE ( i >= 0 && i < d->elements->size() );
243 return d->elements->at( i )->payload();
248 QMutexLocker l( &d->mutex );
249 return d->elements->size();
254 bool inheritedCanRun =
true;
256 QMutexLocker l( &d->mutex );
258 if ( d->elements->size() > 0 )
260 inheritedCanRun = d->elements->at( 0 )->canBeExecuted();
266 void JobCollection::jobRunnerDone()
271 bool emitDone =
false;
274 QMutexLocker l(&d->mutex);
276 if ( d->jobCounter == 0 )
285 ENSURE (d->jobCounter >= 0);
287 if (d->jobCounter == 0)
315 void JobCollection::dequeueElements()
321 bool emitDone =
false;
325 QMutexLocker l( &d->mutex );
327 if ( d->weaver != 0 )
329 for (
int index = 1; index < d->elements->size(); ++index )
331 if ( d->elements->at( index ) && ! d->elements->at( index )->isFinished() )
333 debug( 4,
"JobCollection::dequeueElements: dequeueing %p.\n",
334 (
void*)d->elements->at( index ) );
335 d->weaver->dequeue ( d->elements->at( index ) );
337 debug( 4,
"JobCollection::dequeueElements: not dequeueing %p, already finished.\n",
338 (
void*)d->elements->at( index ) );
342 if (d->jobCounter != 0)
355 #include "JobCollection.moc"
356 #include "JobCollection_p.moc"