diff --git a/src/servers/launch/Job.cpp b/src/servers/launch/Job.cpp index a7b28a328d..d34b3f5e3c 100644 --- a/src/servers/launch/Job.cpp +++ b/src/servers/launch/Job.cpp @@ -25,6 +25,7 @@ Job::Job(const char* name) fEnabled(true), fService(false), fCreateDefaultPort(false), + fLaunching(false), fInitStatus(B_NO_INIT), fTeam(-1), fLaunchStatus(B_NO_INIT), @@ -349,6 +350,20 @@ Job::IsRunning() const } +bool +Job::IsLaunching() const +{ + return fLaunching; +} + + +void +Job::SetLaunching(bool launching) +{ + fLaunching = launching; +} + + status_t Job::HandleGetLaunchData(BMessage* message) { @@ -376,10 +391,12 @@ Job::Run() status_t Job::Execute() { + status_t status = B_OK; if (!IsLaunched() || !IsService()) - return Launch(); + status = Launch(); - return B_OK; + fLaunching = false; + return status; } diff --git a/src/servers/launch/Job.h b/src/servers/launch/Job.h index 7a6f95a80b..73d1ce19b2 100644 --- a/src/servers/launch/Job.h +++ b/src/servers/launch/Job.h @@ -73,6 +73,9 @@ public: bool IsLaunched() const; bool IsRunning() const; + bool IsLaunching() const; + void SetLaunching(bool launching); + status_t HandleGetLaunchData(BMessage* message); virtual status_t Run(); @@ -104,6 +107,7 @@ private: bool fEnabled; bool fService; bool fCreateDefaultPort; + bool fLaunching; PortMap fPortMap; status_t fInitStatus; team_id fTeam; diff --git a/src/servers/launch/LaunchDaemon.cpp b/src/servers/launch/LaunchDaemon.cpp index a1b9d2a227..cbcebeb48f 100644 --- a/src/servers/launch/LaunchDaemon.cpp +++ b/src/servers/launch/LaunchDaemon.cpp @@ -1074,7 +1074,7 @@ LaunchDaemon::_LaunchJobs(Target* target, bool forceNow) void LaunchDaemon::_LaunchJob(Job* job, uint32 options) { - if (job == NULL || (job->IsService() && job->IsLaunched()) + if (job == NULL || job->IsLaunching() || job->IsRunning() || ((options & FORCE_NOW) == 0 && (!job->EventHasTriggered() || !job->CheckCondition(*this) || ((options & TRIGGER_DEMAND) != 0 @@ -1097,6 +1097,7 @@ LaunchDaemon::_LaunchJob(Job* job, uint32 options) if (job->Event() != NULL) job->Event()->ResetTrigger(); + job->SetLaunching(true); fJobQueue.AddJob(job); }