diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-05-26 18:54:57 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-27 11:13:02 +0200 |
commit | ce61cad93387540c3496059bdcea2614635e63e4 (patch) | |
tree | 820061187c67d48af5331884c0005270aef252ec | |
parent | 790915da5400d8569e514baba3df9db087acfdf3 (diff) | |
download | serenity-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.cpp | 20 | ||||
-rw-r--r-- | Shell/Shell.h | 2 |
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(); |