summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-05-26 18:54:57 +0430
committerAndreas Kling <kling@serenityos.org>2020-05-27 11:13:02 +0200
commitce61cad93387540c3496059bdcea2614635e63e4 (patch)
tree820061187c67d48af5331884c0005270aef252ec
parent790915da5400d8569e514baba3df9db087acfdf3 (diff)
downloadserenity-ce61cad93387540c3496059bdcea2614635e63e4.zip
Shell: Never assign equal job ids to two different jobs
Since the last job need not have an ID of size()-1, we need to find the max job id and give that+1 out
-rw-r--r--Shell/Shell.cpp20
-rw-r--r--Shell/Shell.h2
2 files changed, 17 insertions, 5 deletions
diff --git a/Shell/Shell.cpp b/Shell/Shell.cpp
index e41f440856..3ab914d450 100644
--- a/Shell/Shell.cpp
+++ b/Shell/Shell.cpp
@@ -154,8 +154,8 @@ int Shell::builtin_bg(int argc, const char** argv)
if (!parser.parse(argc, const_cast<char**>(argv), false))
return 1;
- if (job_id == -1)
- job_id = jobs.size() - 1;
+ if (job_id == -1 && !jobs.is_empty())
+ job_id = find_last_job_id();
Job* job = nullptr;
@@ -400,8 +400,8 @@ int Shell::builtin_fg(int argc, const char** argv)
if (!parser.parse(argc, const_cast<char**>(argv), false))
return 1;
- if (job_id == -1)
- job_id = jobs.size() - 1;
+ if (job_id == -1 && !jobs.is_empty())
+ job_id = find_last_job_id();
Job* job = nullptr;
@@ -1311,7 +1311,7 @@ ExitCodeOrContinuationRequest Shell::run_command(const StringView& cmd)
StringBuilder cmd;
cmd.join(" ", argv_string);
- auto job = make<Job>(child, (unsigned)child, cmd.build(), jobs.size());
+ auto job = make<Job>(child, (unsigned)child, cmd.build(), find_last_job_id() + 1);
jobs.set((u64)child, move(job));
}
@@ -1836,6 +1836,16 @@ void Shell::stop_all_jobs()
}
}
+u64 Shell::find_last_job_id() const
+{
+ u64 job_id = 0;
+ for (auto& entry : jobs) {
+ if (entry.value->job_id() > job_id)
+ job_id = entry.value->job_id();
+ }
+ return job_id;
+}
+
void Shell::save_to(JsonObject& object)
{
Core::Object::save_to(object);
diff --git a/Shell/Shell.h b/Shell/Shell.h
index b3e471b07c..dfaf2871ff 100644
--- a/Shell/Shell.h
+++ b/Shell/Shell.h
@@ -117,6 +117,8 @@ public:
bool is_waiting_for(pid_t pid) const { return m_waiting_for_pid == pid; }
+ u64 find_last_job_id() const;
+
String get_history_path();
void load_history();
void save_history();