diff --git a/src/servers/launch/Events.cpp b/src/servers/launch/Events.cpp index fafcc4851e..941f139d8e 100644 --- a/src/servers/launch/Events.cpp +++ b/src/servers/launch/Events.cpp @@ -139,6 +139,13 @@ Event::Trigger() } +void +Event::ResetTrigger() +{ + fTriggered = false; +} + + BaseJob* Event::Owner() const { @@ -418,16 +425,17 @@ Events::TriggerDemand(Event* event) if (EventContainer* container = dynamic_cast(event)) { for (int32 index = 0; index < container->Events().CountItems(); index++) { - Event* event = container->Events().ItemAt(index); - if (dynamic_cast(event) != NULL) { - event->Trigger(); + Event* childEvent = container->Events().ItemAt(index); + if (dynamic_cast(childEvent) != NULL) { + childEvent->Trigger(); return true; } - if (dynamic_cast(event) != NULL) { - if (TriggerDemand(event)) - return true; + if (dynamic_cast(childEvent) != NULL) { + if (TriggerDemand(childEvent)) + break; } } } - return false; + + return event->Triggered(); } diff --git a/src/servers/launch/Events.h b/src/servers/launch/Events.h index 2552cb348d..493b2f43e8 100644 --- a/src/servers/launch/Events.h +++ b/src/servers/launch/Events.h @@ -33,6 +33,7 @@ public: bool Triggered() const; virtual void Trigger(); + void ResetTrigger(); virtual BaseJob* Owner() const; virtual void SetOwner(BaseJob* owner); diff --git a/src/servers/launch/LaunchDaemon.cpp b/src/servers/launch/LaunchDaemon.cpp index 8c109564b7..bc38c4bb5a 100644 --- a/src/servers/launch/LaunchDaemon.cpp +++ b/src/servers/launch/LaunchDaemon.cpp @@ -311,7 +311,7 @@ LaunchDaemon::MessageReceived(BMessage* message) Job* job = FindJob(name); if (job != NULL && job->EventHasTriggered()) { - _AddLaunchJob(job); + _TriggerJob(job); break; } @@ -766,7 +766,8 @@ LaunchDaemon::_LaunchJobs(Target* target) for (JobMap::iterator iterator = fJobs.begin(); iterator != fJobs.end(); iterator++) { Job* job = iterator->second; - if (job->Target() == target && job->Event() == NULL) + if (job->Target() == target + && (job->Event() == NULL || job->Event()->Triggered())) _TriggerJob(job); } } @@ -785,7 +786,7 @@ LaunchDaemon::_TriggerJob(Job* job) _TriggerJob(requirement); } - if (!Events::TriggerDemand(job->Event())) + if (job->EventHasTriggered() || !Events::TriggerDemand(job->Event())) _AddLaunchJob(job); } @@ -795,6 +796,8 @@ LaunchDaemon::_AddLaunchJob(Job* job) { if (job->Target() != NULL) job->Target()->ResolveSourceFiles(); + if (job->Event() != NULL) + job->Event()->ResetTrigger(); if (!job->IsLaunched() && job->CheckCondition(*this)) fJobQueue.AddJob(job);