1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:38:10 +00:00

Shell: Avoid waiting for jobs that were *just* unblocked

This fixes the issue with C-z not suspending the job on the first try.
...and further signal issues when the suspended job is contiued.
This commit is contained in:
AnotherTest 2020-07-13 20:29:52 +04:30 committed by Andreas Kling
parent 46661f02c6
commit dc62371439
4 changed files with 14 additions and 4 deletions

View file

@ -93,6 +93,7 @@ int Shell::builtin_bg(int argc, const char** argv)
} }
job->set_running_in_background(true); job->set_running_in_background(true);
job->set_is_suspended(false);
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")"; dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters()); fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());
@ -339,6 +340,7 @@ int Shell::builtin_fg(int argc, const char** argv)
} }
job->set_running_in_background(false); job->set_running_in_background(false);
job->set_is_suspended(false);
dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")"; dbg() << "Resuming " << job->pid() << " (" << job->cmd() << ")";
fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters()); fprintf(stderr, "Resuming job %" PRIu64 " - %s\n", job->job_id(), job->cmd().characters());

View file

@ -75,6 +75,7 @@ public:
bool should_be_disowned() const { return m_should_be_disowned; } bool should_be_disowned() const { return m_should_be_disowned; }
void disown() { m_should_be_disowned = true; } void disown() { m_should_be_disowned = true; }
bool is_running_in_background() const { return m_running_in_background; } bool is_running_in_background() const { return m_running_in_background; }
bool is_suspended() const { return m_is_suspended; }
void unblock() const void unblock() const
{ {
if (!m_exited && on_exit) if (!m_exited && on_exit)
@ -94,6 +95,8 @@ public:
on_exit(*this); on_exit(*this);
} }
void set_is_suspended(bool value) const { m_is_suspended = value; }
void set_running_in_background(bool running_in_background) void set_running_in_background(bool running_in_background)
{ {
m_running_in_background = running_in_background; m_running_in_background = running_in_background;
@ -111,5 +114,6 @@ private:
int m_exit_code { -1 }; int m_exit_code { -1 };
Core::ElapsedTimer m_command_timer; Core::ElapsedTimer m_command_timer;
mutable bool m_active { true }; mutable bool m_active { true };
mutable bool m_is_suspended { false };
bool m_should_be_disowned { false }; bool m_should_be_disowned { false };
}; };

View file

@ -561,16 +561,18 @@ Vector<RefPtr<Job>> Shell::run_commands(Vector<AST::Command>& commands)
} }
#endif #endif
auto job = run_command(command); auto job = run_command(command);
if (!job)
continue;
if (command.should_wait) { if (command.should_wait) {
block_on_job(job); block_on_job(job);
jobs_to_wait_for.append(job); if (!job->is_suspended())
jobs_to_wait_for.append(job);
} else { } else {
if (command.is_pipe_source) { if (command.is_pipe_source) {
jobs_to_wait_for.append(job); jobs_to_wait_for.append(job);
} else if (command.should_notify_if_in_background) { } else if (command.should_notify_if_in_background) {
if (job) job->set_running_in_background(true);
job->set_running_in_background(true);
restore_stdin(); restore_stdin();
} }
} }

View file

@ -121,8 +121,10 @@ int main(int argc, char** argv)
Core::EventLoop::register_signal(SIGTSTP, [](auto) { Core::EventLoop::register_signal(SIGTSTP, [](auto) {
auto job = s_shell->current_job(); auto job = s_shell->current_job();
s_shell->kill_job(job, SIGTSTP); s_shell->kill_job(job, SIGTSTP);
if (job) if (job) {
job->set_is_suspended(true);
job->unblock(); job->unblock();
}
}); });
#ifndef __serenity__ #ifndef __serenity__