Nested WaitForJob()s didn't work correctly, when the job an outer
_ProcessJobs() loop waited for was processed by an inner one. Instead the loops now check the state of the waiting job -- it will be changed from waiting as soon as the job it waits for is done. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33216 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -351,7 +351,7 @@ Worker::WaitForJob(Job* waitingJob, const JobKey& key)
|
|||||||
// a job waiting for a dependency won't abort the job before the dependency
|
// a job waiting for a dependency won't abort the job before the dependency
|
||||||
// is done.
|
// is done.
|
||||||
locker.Unlock();
|
locker.Unlock();
|
||||||
_ProcessJobs(job);
|
_ProcessJobs(waitingJob);
|
||||||
locker.Lock();
|
locker.Lock();
|
||||||
|
|
||||||
// ignore the actual wait status when the game is over anyway
|
// ignore the actual wait status when the game is over anyway
|
||||||
@@ -384,7 +384,7 @@ Worker::_WorkerLoop()
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Worker::_ProcessJobs(Job* finalJob)
|
Worker::_ProcessJobs(Job* waitingJob)
|
||||||
{
|
{
|
||||||
while (true) {
|
while (true) {
|
||||||
AutoLocker<Worker> locker(this);
|
AutoLocker<Worker> locker(this);
|
||||||
@@ -407,7 +407,7 @@ Worker::_ProcessJobs(Job* finalJob)
|
|||||||
while (Job* job = fAbortedJobs.RemoveHead()) {
|
while (Job* job = fAbortedJobs.RemoveHead()) {
|
||||||
_FinishJob(job);
|
_FinishJob(job);
|
||||||
|
|
||||||
if (job == finalJob)
|
if (waitingJob != NULL && waitingJob->State() != JOB_STATE_WAITING)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,7 +426,7 @@ Worker::_ProcessJobs(Job* finalJob)
|
|||||||
|
|
||||||
_FinishJob(job);
|
_FinishJob(job);
|
||||||
|
|
||||||
if (job == finalJob)
|
if (waitingJob != NULL && waitingJob->State() != JOB_STATE_WAITING)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ private:
|
|||||||
static status_t _WorkerLoopEntry(void* data);
|
static status_t _WorkerLoopEntry(void* data);
|
||||||
status_t _WorkerLoop();
|
status_t _WorkerLoop();
|
||||||
|
|
||||||
void _ProcessJobs(Job* finalJob);
|
void _ProcessJobs(Job* waitingJob);
|
||||||
void _AbortJob(Job* job, bool removeFromTable);
|
void _AbortJob(Job* job, bool removeFromTable);
|
||||||
void _FinishJob(Job* job);
|
void _FinishJob(Job* job);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user