launch_daemon: Fixed job event trigger.

* Always check for events before launching a job unconditionally.
* Correctly check for demand before launching a job.
This commit is contained in:
Axel Dörfler
2015-07-22 20:45:20 +02:00
parent f6647de349
commit 2c756e16e0
3 changed files with 22 additions and 10 deletions
+15 -7
View File
@@ -139,6 +139,13 @@ Event::Trigger()
} }
void
Event::ResetTrigger()
{
fTriggered = false;
}
BaseJob* BaseJob*
Event::Owner() const Event::Owner() const
{ {
@@ -418,16 +425,17 @@ Events::TriggerDemand(Event* event)
if (EventContainer* container = dynamic_cast<EventContainer*>(event)) { if (EventContainer* container = dynamic_cast<EventContainer*>(event)) {
for (int32 index = 0; index < container->Events().CountItems(); for (int32 index = 0; index < container->Events().CountItems();
index++) { index++) {
Event* event = container->Events().ItemAt(index); Event* childEvent = container->Events().ItemAt(index);
if (dynamic_cast<DemandEvent*>(event) != NULL) { if (dynamic_cast<DemandEvent*>(childEvent) != NULL) {
event->Trigger(); childEvent->Trigger();
return true; return true;
} }
if (dynamic_cast<EventContainer*>(event) != NULL) { if (dynamic_cast<EventContainer*>(childEvent) != NULL) {
if (TriggerDemand(event)) if (TriggerDemand(childEvent))
return true; break;
} }
} }
} }
return false;
return event->Triggered();
} }
+1
View File
@@ -33,6 +33,7 @@ public:
bool Triggered() const; bool Triggered() const;
virtual void Trigger(); virtual void Trigger();
void ResetTrigger();
virtual BaseJob* Owner() const; virtual BaseJob* Owner() const;
virtual void SetOwner(BaseJob* owner); virtual void SetOwner(BaseJob* owner);
+6 -3
View File
@@ -311,7 +311,7 @@ LaunchDaemon::MessageReceived(BMessage* message)
Job* job = FindJob(name); Job* job = FindJob(name);
if (job != NULL && job->EventHasTriggered()) { if (job != NULL && job->EventHasTriggered()) {
_AddLaunchJob(job); _TriggerJob(job);
break; break;
} }
@@ -766,7 +766,8 @@ LaunchDaemon::_LaunchJobs(Target* target)
for (JobMap::iterator iterator = fJobs.begin(); iterator != fJobs.end(); for (JobMap::iterator iterator = fJobs.begin(); iterator != fJobs.end();
iterator++) { iterator++) {
Job* job = iterator->second; Job* job = iterator->second;
if (job->Target() == target && job->Event() == NULL) if (job->Target() == target
&& (job->Event() == NULL || job->Event()->Triggered()))
_TriggerJob(job); _TriggerJob(job);
} }
} }
@@ -785,7 +786,7 @@ LaunchDaemon::_TriggerJob(Job* job)
_TriggerJob(requirement); _TriggerJob(requirement);
} }
if (!Events::TriggerDemand(job->Event())) if (job->EventHasTriggered() || !Events::TriggerDemand(job->Event()))
_AddLaunchJob(job); _AddLaunchJob(job);
} }
@@ -795,6 +796,8 @@ LaunchDaemon::_AddLaunchJob(Job* job)
{ {
if (job->Target() != NULL) if (job->Target() != NULL)
job->Target()->ResolveSourceFiles(); job->Target()->ResolveSourceFiles();
if (job->Event() != NULL)
job->Event()->ResetTrigger();
if (!job->IsLaunched() && job->CheckCondition(*this)) if (!job->IsLaunched() && job->CheckCondition(*this))
fJobQueue.AddJob(job); fJobQueue.AddJob(job);